我有一个伪造的Nginx服务器创建了openresty基础图像。当一个特定端点被调用时,它需要动态更新nginx配置。为了反映所做的更改,我试图在配置更改后不久重新加载nginx。
在容器中,我可以使用/usr/local/openresty/nginx/sbin/nginx -s reload重新加载nginx服务器。
当我试图像下面这样使用in时,它不会产生任何错误,但是配置更改没有得到反映。
os.execute("/usr/local/openresty/nginx/sbin/nginx -s reload ")发布于 2020-06-24 09:22:44
此命令将以nginx辅助进程特权运行,您需要成为根用户才能执行此命令。您可以尝试为此创建一个特定的脚本(假设它的名称是/usr/local/openresty/nginx/sbin/reload-nginx.sh )。
#!/bin/sh
/usr/local/openresty/nginx/sbin/nginx -s reload将此脚本的所有者设置为no nginx进程用户(假设它的名称为nginx),并在此脚本上设置位
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")发布于 2020-06-24 12:51:38
您可以完全跳过调用nginx,只需使用LuaJITs向主进程发送一个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)但是,这并不能解决权限问题。
一个可行的想法是:
process
mkfifo设置一个命名管道,以便您的nginx用户可以向它写入
ngx.pipe模块打开< code >D12并等待输入)并向主
HUP信号--您的os.execute代码,而是将一行文本写入指定管道中,以便特权代理重新加载服务器。H 217F 218/code>编辑:如果你不喜欢cat黑客,你可能想看看https://github.com/slact/ngx_lua_ipc
可以使用IPC将整个事件保持在一个nginx服务器实例中,而不需要任何文件访问。
https://stackoverflow.com/questions/62548736
复制相似问题