【问题标题】:Nginx reload shell command not working with in lua scriptNginx重新加载shell命令在lua脚本中不起作用
【发布时间】:2020-10-14 08:09:21
【问题描述】:

我有一个使用 openresty 基础镜像创建的 dockerised Nginx 服务器。当调用特定端点时,它需要动态更新 nginx 配置。为了反映更改,我正在尝试在配置更改后不久重新加载 nginx。

在容器中,我可以使用 /usr/local/openresty/nginx/sbin/nginx -s reload 重新加载 nginx 服务器

当我尝试在 lua 中使用相同的 with 时,它不会出现任何错误,但配置更改没有得到反映。

os.execute("/usr/local/openresty/nginx/sbin/nginx -s reload ")

【问题讨论】:

    标签: nginx lua openresty


    【解决方案1】:

    此命令将以 nginx 工作进程权限运行,您需要成为 root 才能执行此命令。你可以尝试为此制作一个特定的脚本(假设它的名字是/usr/local/openresty/nginx/sbin/reload-nginx.sh:

    #!/bin/sh
    /usr/local/openresty/nginx/sbin/nginx -s reload
    

    将此脚本的所有者设置为无 nginx 进程用户(假设其名称为 nginx),并在此脚本上设置 suid

    chown nginx /usr/local/openresty/nginx/sbin/reload-nginx.sh
    chmod +x /usr/local/openresty/nginx/sbin/reload-nginx.sh
    chmod u+s /usr/local/openresty/nginx/sbin/reload-nginx.sh
    

    并尝试从您的 lua 代码中执行此脚本:

    os.execute("/usr/local/openresty/nginx/sbin/nginx-reload.sh")
    

    【讨论】:

    • 如果我错了请纠正我,但 suid 只能用于二进制可执行文件,不能用于解释脚本。
    • @DarkWiiPlayer 你是对的,我忘记了默认情况下 suid 位在 shell 脚本中被忽略。我的解决方案将无法工作,除非被包装成一些编译代码,如 int main() { setuid(0); system( "/usr/local/openresty/nginx/sbin/nginx-reload.sh" ); return 0; }
    • 非常感谢@IvanShatsky 和DarkWiiPlayer 花时间调查此案。真的很感激。会尝试添加 shell 脚本并调用执行以从我的 lua 运行它
    • @Sarga 您不应将答案标记为已接受,除非您测试解决方案并确保其有效,以免用户与类似问题混淆。正如 DarkWiiPlayer 指出的那样,这种解决方案很可能行不通。
    • @IvanShatsky system 来自 setuid 程序也不起作用。
    【解决方案2】:

    您可以完全跳过调用nginx,而只需使用LuaJITs FFI 向主进程发送HUP 信号。

    local process = require 'ngx.process'
    local ffi = require 'ffi'
    ffi.cdef 'int kill(int pid, int sig);'
    ffi.C.kill(process.get_master_pid(), 1)
    

    但是,这并不能解决权限问题。

    一个可行的想法是:

    • 使用mkfifo 设置一个命名管道,并让您的 nginx 用户可以写入它
    • 启用Priviliged Agent 工作进程。
    • 设置特权工作者监听命名管道上的输入(例如使用ngx.pipe模块打开cat并等待输入)并向主进程发送HUP信号
    • 更改您的 os.execute 代码,改为将一些文本行写入命名管道,以让特权代理重新加载服务器。

    编辑:如果你不喜欢 cat hack,你可能想看看 https://github.com/slact/ngx_lua_ipc

    也许可以使用 IPC 将整个事物保持在单个 nginx 服务器实例中自包含,而无需任何文件访问。

    【讨论】:

      猜你喜欢
      • 2021-05-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多