介绍
Nginx是一个强大的网络服务器和逆向代理,用于服务世界上许多最受欢迎的网站。在本指南中,我们将演示如何升级Nginx可执行文件,而不会丢失客户端连接。
先决条件
在开始本指南之前,你应该有你的服务器上的非root用户,用配置的
sudo
特权。你还需要安装Nginx。 如果您在使用Ubuntu 14.04,你可以学习如何设置与用户
sudo
权利
在这里 。 您可以通过以下Nginx的安装
本指南 。 如果您在使用CentOS 7,您可以通过运行Get设立
本指南为
sudo
用户,其次是
本指南安装Nginx的。
升级工作原理
Nginx通过在服务启动时产生一个主进程来工作。主服务反过来又处理一个或多个处理实际客户端连接的工作进程。 Nginx被设计为在从管理员接收到特定信号时执行某些动作。使用这些信号为您提供了在不丢失客户端连接的情况下轻松升级Nginx或其配置的机会。 由分发包维护者提供的某些服务脚本将提供这种用于常规升级的能力。但是,手动升级在方法中提供了更多的灵活性,并允许您审核升级以便在出现问题时快速恢复。如果您从源代码安装Nginx或使用不提供此功能的方法,这也将提供一个可以正常升级的选项。 将使用以下信号:
USR2
:这产生一个新的主/工作进程,而不会影响老集。
WINCH
:这告诉Nginx的主进程优雅地停止其相关工作人员实例。
HUP
:这告诉Nginx的一个主进程重新读取它的配置文件,并与那些秉承新配置替换工作进程。如果旧的和新的主服务器正在运行,则将其发送给旧的主服务器将使用其原始配置生成工作。
QUIT
:这将关闭主及工人优雅。
TERM
:这将启动主及工人快速关机。
KILL
:这立即杀死一个主站和它的工人没有任何的清理。
查找Nginx进程PID
为了向各个进程发送信号,我们需要知道目标进程的PID。有两个简单的方法来找到这个。 首先,你可以使用
ps
实用程序,然后
grep
结果之间的Nginx的。这很简单,允许您查看主进程和工作进程:
ps aux | grep nginx
outputroot 10846 0.0 0.3 47564 3280 ? S 13:26 0:00 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf
nginx 10847 0.0 0.1 47936 1908 ? S 13:26 0:00 nginx: worker process
user 10961 0.0 0.0 112640 964 pts/0 S+ 13:53 0:00 grep --color=auto nginx
第二列包含所选进程的PID。突出显示的是进程的PID。最后一列说明第一个结果是Nginx主进程。 找到的PID主Nginx的过程的另一种方法是将打印出的内容
/run/nginx.pid
文件:
cat /run/nginx.pid
output10846
如果有两个运行Nginx的主流程,旧的将被移动到
/run/nginx.pid.oldbin
。
产生一个新的Nginx主人/工人集
优雅地更新我们的可执行文件的第一步是实际更新你的二进制文件。使用任何适合您的Nginx安装的方法,无论是通过软件包管理器还是源安装。 在新的二进制文件就位之后,您可以生成使用新可执行文件的第二组主/工作进程。 您可以通过发送做到这一点无论
USR2
直接信号给你查询的PID号(确保替换自己的主Nginx的进程的PID这里):
sudo kill -s USR2 10846
或者,您可以读取并将存储在PID文件中的值直接替换为命令,如下所示:
sudo kill -s USR2 `cat /run/nginx.pid`
如果您检查您当前的进程,你会看到,你现在有
两套 Nginx的主/工人:
ps aux | grep nginx
outputroot 10846 0.0 0.3 47564 3280 ? S 13:26 0:00 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf
nginx 10847 0.0 0.1 47936 1908 ? S 13:26 0:00 nginx: worker process
root 11003 0.0 0.3 47564 3132 ? S 13:56 0:00 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf
nginx 11004 0.0 0.1 47936 1912 ? S 13:56 0:00 nginx: worker process
user 11031 0.0 0.0 112640 960 pts/0 S+ 14:01 0:00 grep --color=auto nginx
还可以看到原始
/run/nginx.pid
文件已被移动到
/run/nginx.pid.oldbin
和较新的主进程的PID被写入
/run/nginx.pid
:
tail -n +1 /run/nginx.pid*
output==> /run/nginx.pid <==
11003
==> /run/nginx.pid.oldbin <==
10846
现在可以使用这些文件中包含的PID向任一主进程发送信号。 在这一点上,主/工作集都是可操作的并且能够服务于客户端请求。第一组是使用原始的Nginx可执行文件和配置,第二组是使用较新的版本。他们可以继续并行操作,但为了一致性,我们应该开始转换到新的集合。
关闭第一主人的工人
为了开始转换到新集合,我们可以做的第一件事是停止原来的master的工作进程。原始工作人员将完成处理所有当前连接,然后退出。 通过发出停止原来设定的工人
WINCH
信号的主进程:
sudo kill -s WINCH `cat /run/nginx.pid.oldbin`
这将让新主控的工作人员单独处理新的客户端连接。旧的
主进程仍然会运行,但没有工人:
ps aux | grep nginx
outputroot 10846 0.0 0.3 47564 3280 ? S 13:26 0:00 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf
root 11003 0.0 0.3 47564 3132 ? S 13:56 0:00 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf
nginx 11004 0.0 0.1 47936 1912 ? S 13:56 0:00 nginx: worker process
user 11089 0.0 0.0 112640 964 pts/0 R+ 14:13 0:00 grep --color=auto nginx
这允许您审核新的工作者,因为他们接受隔离的连接,同时保持恢复到旧的可执行文件的能力,如果一些不太正确。
评估结果并采取下一步
此时,您应该测试和审核您的系统,以确保没有问题的迹象。只要您希望确保新的Nginx可执行文件无错误并且能够处理您的流量,您可以将配置保留在此状态。 你的下一步将完全取决于你是否遇到了问题。
如果升级成功,请完成转换
如果您的新集合的工作程序没有遇到问题,您可以安全地关闭旧的主进程。要做到这一点,只是把老师傅
QUIT
信号:
sudo kill -s QUIT `cat /run/nginx.pid.oldbin`
旧的主进程将正常退出,只留下你的新的Nginx master / workers。此时,您已成功执行Nginx In-Place二进制更新,而不中断客户端连接。
如果新工人体验问题,恢复到旧二进制
如果你的新工作组似乎有问题,你可以转换回旧的配置和二进制。这在同一会话期间是可能的。 要做到这一点,最好的办法是通过发送它重新启动你的旧主人的工人
HUP
信号。 通常情况下,当您发送Nginx的大师
HUP
信号,它将重新读取配置文件并启动新工人。但是,当目标是较旧的主机时,它将只使用其原始的工作配置生成新的工作:
sudo kill -s HUP `cat /run/nginx.pid.oldbin`
您现在应该回到有两组主/工作进程:
ps aux | grep nginx
outputroot 10846 0.0 0.3 47564 3280 ? S 13:26 0:00 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf
root 11003 0.0 0.3 47564 3132 ? S 13:56 0:00 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf
nginx 11004 0.0 0.1 47936 1912 ? S 13:56 0:00 nginx: worker process
nginx 19918 0.0 0.1 47936 1900 ? S 14:47 0:00 nginx: worker process
user 19920 0.0 0.0 112640 964 pts/0 R+ 14:48 0:00 grep --color=auto nginx
最新的工人与老工人有关。这两个工作集都将在此时接受客户端连接。现在,停止更新,马车主进程及其工作人员通过发送
QUIT
信号:
sudo kill -s QUIT `cat /run/nginx.pid`
你应该回到你的老主人和工人:
ps aux | grep nginx
outputroot 10846 0.0 0.3 47564 3280 ? S 13:26 0:00 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf
nginx 19918 0.0 0.1 47936 1900 ? S 14:47 0:00 nginx: worker process
user 19935 0.0 0.0 112640 964 pts/0 R+ 14:50 0:00 grep --color=auto nginx
原来的主人会重拾
/run/nginx.pid
其PID文件。 如果上面没有任何理由的工作,你可以尝试只发送新的主服务器
TERM
信号,应该发起一个关机。 这应该停止新的主人和任何工人,同时自动踢过老主人以启动其工作进程。 如果有严重的问题和马车工人不退出,你可以给他们每个人的
KILL
信号进行清理。然而,这应该被视为最后的手段,因为它将切断连接。 在转换回旧二进制文件后,请记住,您的系统上仍然安装了新版本。你应该删除buggy版本并回滚到您的以前的版本,以便Nginx将在重新启动时运行没有问题。
结论
现在,你应该能够将你的机器从一个Nginx二进制转换到另一个。 Nginx处理两个主/工作集的能力,同时保持关于他们的关系的信息,使我们能够升级服务器软件,而不使服务器机器脱机。