首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Nginx重载shell命令不能在lua脚本中使用

Nginx重载shell命令不能在lua脚本中使用
EN

Stack Overflow用户
提问于 2020-06-24 06:10:34
回答 2查看 1.1K关注 0票数 0

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

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

当我试图像下面这样使用in时,它不会产生任何错误,但是配置更改没有得到反映。

代码语言:javascript
复制
os.execute("/usr/local/openresty/nginx/sbin/nginx -s reload ")
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-06-24 09:22:44

此命令将以nginx辅助进程特权运行,您需要成为根用户才能执行此命令。您可以尝试为此创建一个特定的脚本(假设它的名称是/usr/local/openresty/nginx/sbin/reload-nginx.sh )。

代码语言:javascript
复制
#!/bin/sh
/usr/local/openresty/nginx/sbin/nginx -s reload

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

代码语言:javascript
复制
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代码中执行以下脚本:

代码语言:javascript
复制
os.execute("/usr/local/openresty/nginx/sbin/nginx-reload.sh")
票数 0
EN

Stack Overflow用户

发布于 2020-06-24 12:51:38

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

代码语言:javascript
复制
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

  • Change

  • mkfifo设置一个命名管道,以便您的nginx用户可以向它写入

  • ,启用工作进程。

  • 将特权工作人员设置为侦听指定管道上的输入(例如,使用ngx.pipe模块打开< code >D12并等待输入)并向主

  • 发送HUP信号--您的os.execute代码,而是将一行文本写入指定管道中,以便特权代理重新加载服务器。H 217F 218/code>

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

可以使用IPC将整个事件保持在一个nginx服务器实例中,而不需要任何文件访问。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62548736

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档