直接升级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`