【问题标题】:'init_by_lua_block' directive not getting executed on nginx start'init_by_lua_block' 指令未在 nginx 启动时执行
【发布时间】:2020-07-17 05:48:11
【问题描述】:

我希望我的 lua 脚本之一在 nginx 服务器启动或重新加载时执行。我尝试使用 init_by_lua_block 和 init_by_lua_file 指令,但是当我运行 nginx docker 时,我没有看到 init_by_lua_block 中 lua 脚本的任何日志跟踪。我的 http 块如下所示。 nginx.config 位于容器路径/etc/nginx/nginx.conf 中。

http {
    sendfile on;
    init_by_lua_block /etc/nginx/lua/init.lua;
    include /etc/nginx/conf.d/proxy-config.conf;
 }

谁能告诉我这里缺少什么?

【问题讨论】:

    标签: nginx nginx-config openresty


    【解决方案1】:

    init_by_lua_block

    语法:init_by_lua_block { lua-script }

    https://github.com/openresty/lua-nginx-module#init_by_lua_block

    init_by_lua_block 需要内联 Lua 代码,而不是 Lua 文件的路径。

    使用dofile执行Lua脚本:

    init_by_lua_block {
      dofile('/etc/nginx/lua/init.lua')
    }
    

    https://www.lua.org/manual/5.1/manual.html#pdf-dofile

    或使用init_by_lua_file:

    init_by_lua_file /etc/nginx/lua/init.lua;
    

    UPD:

    您应该在init_by_lua_* 指令中使用NOTICE 日志级别(或更高),因为您的error_log 配置尚未应用于此阶段:

    在后台,init_by_lua 运行在 nginx 配置加载阶段,因此您在 nginx.conf 中的 error_log 配置在整个配置加载成功之前不会生效(由于引导要求:配置加载可能会失败)。并且 nginx 最初在启动时使用具有 NOTICE 过滤级别的记录器,这在整个第一次配置加载过程中都有效(但不是由 HUP 信号触发的后续配置(重新)加载)。

    https://github.com/openresty/lua-nginx-module/issues/467#issuecomment-82647228

    因此,请使用ngx.log(ngx.NOTICE, ...)(或ngx.WARNngx.ERR 等——参见https://github.com/openresty/lua-nginx-module#nginx-log-level-constants)查看日志中的输出。

    您也可以使用print。相当于 ngx.log(ngx.NOTICE, ...) 在后台:https://github.com/openresty/lua-nginx-module#print

    【讨论】:

    • 我已经更新了答案。可能这是您使用的日志记录级别的问题(抱歉,我忽略了您问题的“没有看到任何日志跟踪”部分)。
    猜你喜欢
    • 2020-03-30
    • 1970-01-01
    • 2020-08-24
    • 2021-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多