Nginx + LUA,如何输出文件?

4

在Nginx + Lua中,文件输出遇到了问题。我选择了LUA,因为nginx的逻辑相当复杂,基于referrer或子域名等。

像/img/am1/s/1.jpg这样的请求,我需要检查/somepath/am1/1.jpg是否存在。如果它存在,则输出它,否则将请求代理到后端。

2个回答

12

好的,找到了

content_by_lua '
    local file = "/path..."
    local f = io.open(file, "rb")
    local content = f:read("*all")
    f:close()
    ngx.print(content)
';

4
使用内部位置和 ngx.exec 让nginx服务文件会更加高效。 - Alexey Ten
@chanux,看起来你的博客已经不再更新了 :( 你能否把这篇文章重新发布到别的地方呢? - scythargon
1
@scythargon 抱歉让它失效了。我已经重新上线了。我搞错了重定向,但是这里是它 - chanux
@chanux 感谢你的博客,Nginx 内部重定向帮了我大忙。 - geosmart
2
@chanux 感谢您的帖子,最后一个URL无效,请使用以下最新路径 https://chanux.me/blog/post/lua-x-accel-redirect/ - iomv

3
如果有人需要知道如何从文件中输出最后n行:
location /service-man/log {
            default_type 'text/plain';
            content_by_lua '

                    local log_path = "/path/to/log.log"
                    -- Opens a file in read
                    file = io.open(log_path, "r")
                    if file==nil
                    then
                        ngx.say(log_path .. " can\'t read or does not exists")
                        return
                    end

                    -- sets the default input file
                    io.input(file)

                    local lines = {}
                    -- read the lines in table lines
                    for line in io.lines() do
                        table.insert(lines, line)
                    end
                    io.close(file)

                    log_limit = 10
                    if #lines < log_limit then
                        log_start = 0
                    else
                        log_len = #lines
                        log_start = log_len - log_limit
                    end

                    local one_line = ""

                    for i, line in ipairs(lines) do

                        if i > log_start then
                            one_line = one_line .. line .. "\\n"
                        end

                    end

                    ngx.say(one_line)
            ';

}

应该与nginx/1.6.2和Lua 5.3兼容。

如果您知道如何更优化地完成,请分享。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接