如何升级Nginx In-Place而不会丢失客户端连接

介绍

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处理两个主/工作集的能力,同时保持关于他们的关系的信息,使我们能够升级服务器软件,而不使服务器机器脱机。
赞(52) 打赏
未经允许不得转载:优客志 » 系统运维
分享到:

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏