[英]Nginx reload shell command not working with in lua script
我有一个使用 openresty 基础映像创建的 dockerized Nginx 服务器。 当调用特定端点时,它需要动态更新 nginx 配置。 为了反映更改,我试图在配置更改后不久重新加载 nginx。
在容器中,我可以使用/usr/local/openresty/nginx/sbin/nginx -s reload
加载 nginx 服务器
当我尝试在 lua 中使用相同的功能时,它不会出现任何错误,但配置更改没有得到反映。
os.execute("/usr/local/openresty/nginx/sbin/nginx -s reload ")
您可以完全跳过调用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
设置一个名为 pipe 并进行设置,以便您的 nginx 用户可以写入它ngx.pipe
模块打开cat
并等待输入)并向主进程发送HUP
信号os.execute
代码,改为将一些文本行写入命名的 pipe 以让特权代理重新加载服务器。 编辑:如果你不喜欢cat
hack,你可能想看看https://github.com/slact/ngx_lua_ipc
可以使用 IPC 将整个事物保持在单个 nginx 服务器实例中,无需任何文件访问。
此命令将以 nginx 工作进程权限运行,您需要成为 root 才能执行此命令。 您可以尝试为此制作一个特定的脚本(假设它的名称是/usr/local/openresty/nginx/sbin/reload-nginx.sh
:
#!/bin/sh
/usr/local/openresty/nginx/sbin/nginx -s reload
将此脚本的所有者设置为 no 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")
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.