繁体   English   中英

Nginx 重新加载 shell 命令在 lua 脚本中不起作用

[英]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 用户可以写入它
  • 启用特权代理工作进程。
  • 将特权工作人员设置为侦听命名 pipe 上的输入(例如使用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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM