如何使用 Node.js 文件发送 HUP 信号并零停机重启 nginx 服务器
答案1
你需要三样东西:
您的 nginx 服务器的 PID。存储在:
/var/run/nginx.pid
向具有该 PID 的进程发送
SIGHUP
( )的命令:1
kill -1 $(cat /var/run/nginx.pid)
一个让 node.js 发送 的方法
kill
。我会选择子进程。
我不是 Node 开发人员。我没有办法把这些组合成有意义的东西,但如果你知道自己在做什么,你就会这么做。
哦,你的 nginx 服务器和 Node.JS 应用需要以同一个用户身份运行允许 Node 发送信号。这很容易做到,但可能会产生安全隐患。您可能希望制作 SUID 脚本供 Node 调用,但如果操作不当,这些也可能产生安全后果。
或者,您可以使用process
模块跑步process.kill(...)
。您仍然需要读取 nginx 的 PID,并且仍然需要对权限进行排序。
像这样(再次强调,我仍然不是 Node 开发人员,因此这在语法上可能是不正确的):
var fs = require('fs'),
process = require('process');
process.kill(fs.readFileSync('/var/run/nginx.pid', "utf8"), 'SIGHUP');
答案2
在其中创建一个文件
/etc/sudoers.d/
。将其命名为reload-nginx
将以下内容放入
reload-nginx
. 中。%dev
是可以重新加载 nginx 的多个用户的用户组。您也可以将此权限限制为单个用户%dev ALL=(ALL) NOPASSWD: /bin/systemctl reload nginx.service %dev ALL=(ALL) NOPASSWD: /bin/systemctl reload nginx
完成此操作后,属于该%dev
组的任何人都可以重新加载 nginx,而无需输入密码。您可以立即从命令行进行测试。
添加运行 nodejs 的用户条目,然后使用 nodejs 的child_process
模块调用 unix shell 命令,如sudo systemctl reload nginx
。这应该可以解决问题。