直接升级nginx而不进行停机操作

进行nginx的升级步骤时不停止

以下是直接进行nginx升级到新版本的步骤,不会中断服务。

大致上面有提到的内容写在这里。
http://nginx.org/en/docs/control.html#upgrade

任务内容

将Nginx 1.7.3升级至1.9.9。

环境

    • OS

 

    • CentOS 6.6

 

    • nginx1.7.3が起動している

 

    • nginx.confなどがすでに存在

 

    • nginx1.7.3 は ソースからインストールされている(/usr/local/nginx/以下)

 

    php-fpm等は起動していない

所有的任务都将以root用户身份执行。

在使用kill/make install等命令时可能需要sudo权限。由于是以root用户执行,因此不需要考虑这些方面。

准备 Nginx 1.9.9 的二进制文件

配置选项随意设置。

# wget http://nginx.org/download/nginx-1.9.9.tar.gz
# tar zxf nginx-1.9.9.tar.gz
# cd nginx-1.9.9 ; pwd
# ./configure
# make
# make install

在目前的状态下,还没有进行升级。

# /usr/local/nginx/sbin/nginx -V
nginx version: nginx/1.7.3

升级后,系统将自动替换为此状态。真了不起。

升级步骤

如果只给出步骤的话,最初就会是下面的内容。

# /usr/local/nginx/sbin/nginx -t
# kill -USR2 `cat /usr/local/nginx/logs/nginx.pid`
# kill -WINCH `cat /usr/local/nginx/logs/nginx.pid.oldbin`
# kill -QUIT `cat /usr/local/nginx/logs/nginx.pid.oldbin`
# /usr/local/nginx/sbin/nginx -V

我们将观察其动作。

    • アップグレード前の状態

 

    masterプロセスのpidは4388です。
# ps auxww | grep 'nginx'
root      4388  0.1  0.3 105792  6304 ?        S    02:29   0:00 nginx: master process /usr/local/nginx/sbin/nginx -c /usr/local/ngin /etc/nginx.conf
nginx     4389  0.0  0.1 106228  2836 ?        S    02:29   0:00 nginx: worker process
nginx     4390  0.0  0.1 106228  2904 ?        S    02:29   0:00 nginx: worker process
nginx     4391  0.0  0.1 106228  2884 ?        S    02:29   0:00 nginx: worker process
root      4397  0.0  0.0   6388   680 pts/2    S+   02:29   0:00 grep --color=auto nginx
#

1. 配置测试

# /usr/local/nginx/sbin/nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
#

发送USR2信号。

    • 新しいバイナリのnginxプロセスが起動

 

    • アップグレード前nginxのpidファイルがnginx.pid.oldbinとなる

 

    アップグレード後のnginxが処理を開始
# kill -USR2 `cat /usr/local/nginx/logs/nginx.pid`
# ps auxwwf | grep 'ngin[x]'
root      4388  0.0  0.3 105792  6304 ?        S    02:29   0:00 nginx: master process /usr/local/nginx/sbin/nginx -c /usr/local/ngin /etc/nginx.conf
nginx     4389  0.0  0.1 106228  2836 ?        S    02:29   0:00  \_ nginx: worker process
nginx     4390  0.0  0.1 106228  2904 ?        S    02:29   0:00  \_ nginx: worker process
nginx     4391  0.0  0.1 106228  2884 ?        S    02:29   0:00  \_ nginx: worker process
root      4464  0.0  0.3 103516  6240 ?        S    02:31   0:00  \_ nginx: master process /usr/local/nginx/sbin/nginx -c /usr/local/nginx/etc/nginx.conf
nginx     4465  0.0  0.1 103944  2828 ?        S    02:31   0:00      \_ nginx: worker process                                        
nginx     4466  0.0  0.1 103944  2896 ?        S    02:31   0:00      \_ nginx: worker process                                        
nginx     4467  0.0  0.1 103944  2872 ?        S    02:31   0:00      \_ nginx: worker process                                        
#
#
# ls -la /usr/local/nginx/logs/nginx.pid*
-rw-r--r-- 1 root  root         5 Feb  4 02:31 nginx.pid
-rw-r--r-- 1 root  root         5 Feb  4 02:29 nginx.pid.oldbin
#

升级后,nginx的主进程已经启动了。它的进程ID是4464。
可以看出,在升级之前,nginx的主进程4388也在运行。

发送USR2信号

    • アップグレード後masterプロセスとアップグレード前masterプロセスが混在する事に

 

    • アップグレード後nginxのpid -> nginx.pid

アップグレード前nginxのpid -> nginx.pid.oldbin

通过向nginx.pid.oldbin发送信号来操作之前的nginx,通过向nginx.pid发送信号来操作升级后的nginx。

3. 发送WINCH信号

    アップグレード前masterプロセスがworkerプロセスを終了し、アップグレード後のnginxのみで処理を開始
# kill -WINCH `cat /usr/local/nginx/logs/nginx.pid.oldbin`
#
# ps auxwwf | grep 'ngin[x]'
root      4388  0.0  0.3 105792  6304 ?        S    02:29   0:00 nginx: master process /usr/local/nginx/sbin/nginx -c /usr/local/ngin /etc/nginx.conf
root      4464  0.0  0.3 103516  6240 ?        S    02:31   0:00  \_ nginx: master process /usr/local/nginx/sbin/nginx -c /usr/local/nginx/etc/nginx.conf
nginx     4465  0.0  0.1 103944  2828 ?        S    02:31   0:00      \_ nginx: worker process                                        
nginx     4466  0.0  0.1 103944  2896 ?        S    02:31   0:00      \_ nginx: worker process                                        
nginx     4467  0.0  0.1 103944  2872 ?        S    02:31   0:00      \_ nginx: worker process                                        
#

升级之前,存在着一个称为pid4388的主进程,而工作进程已经消失。

当发送WINCH信号时。

升级之前的主进程将终止受其管理的工作进程。在此状态下,所有的请求将由新的nginx处理。如果在此状态下,Web浏览变得不可用等情况出现,则会进行回退操作。回退步骤将在后文中说明。

将QUIT信号发送到升级前的nginx。

    アップグレード前nginxのマスタープロセスが完全に終了
# kill -QUIT `cat /usr/local/nginx/logs/nginx.pid.oldbin`
# ps auxwwf | grep 'ngin[x]'
root      4464  0.0  0.3 103516  6240 ?        S    02:31   0:00 nginx: master process /usr/local/nginx/sbin/nginx -c /usr/local/ngin /etc/nginx.conf
nginx     4465  0.0  0.1 103944  2828 ?        S    02:31   0:00  \_ nginx: worker process
nginx     4466  0.0  0.1 103944  2896 ?        S    02:31   0:00  \_ nginx: worker process
nginx     4467  0.0  0.1 103944  2872 ?        S    02:31   0:00  \_ nginx: worker process
#
# ls -l /usr/local/nginx/logs/nginx.pid
-rw-r--r-- 1 root root 5 Feb  4 02:31 /usr/local/nginx/logs/nginx.pid
#
#
# /usr/local/nginx/sbin/nginx -V
nginx version: nginx/1.9.9
built by gcc 4.4.7 20120313 (Red Hat 4.4.7-11) (GCC)
built with OpenSSL 1.0.1e-fips 11 Feb 2013
TLS SNI support enabled
#

主进程在升级之前已经完全结束。
现在升级已经完成了。

切り戻し手段

如果在途中出现问题,将会选择回退。有两种方法可供选择。

    • アップグレード前masterプロセスへHUPシグナルを送信

 

    • アップグレード後masterプロセスを終了し、アップグレード前masterプロセスがworkerプロセスを作成します。

 

    • アップグレード後TERMシグナルを送信

 

    アップグレード前masterプロセスがアップグレード後masterプロセスの終了を検知すると、workerプロセスを作成します。
# kill -s HUP `cat /usr/local/nginx/logs/nginx.pid.oldbin`
广告
将在 10 秒后关闭
bannerAds