如何零停机重启 nginx 服务器

如何零停机重启 nginx 服务器

如何使用 Node.js 文件发送 HUP 信号并零停机重启 nginx 服务器

答案1

你需要三样东西:

  1. 您的 nginx 服务器的 PID。存储在:/var/run/nginx.pid

  2. 向具有该 PID 的进程发送SIGHUP( )的命令:1

    kill -1 $(cat /var/run/nginx.pid)
    
  3. 一个让 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

  1. 在其中创建一个文件/etc/sudoers.d/。将其命名为reload-nginx

  2. 将以下内容放入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。这应该可以解决问题。

相关内容