企業実戦--Nginx(実戦事例--ホットアップグレードとスムーズリターン)

10367 ワード

ホット・アップグレードとは、ホット・デプロイメント、またはスムーズ・アップグレードとも呼ばれます.つまり、nginxサービスを停止せずにnginxのアップグレードを完了します.
しかし、ここで注意したいのは、コマンドラインに直接「nginx」と入力して起動するnginxサービスではなく、nginxを起動するときにnginxバイナリファイルの絶対パスを使用することを前提としています.絶対パスで起動しない方法は、通常、nginx関連の環境変数を便利に構成するためです.絶対パスでnginxを起動していない場合は、nginxプロセスに更新された信号を送信すると、nginxプロセスは新しいバイナリプログラムを見つけることができない可能性があります(新しいバージョンのバイナリプログラムが見つからないため、何の反応もありません).
実験準備:2つのバージョンのnginx
[root@server3 ~]# ls
nginx-1.16.1.tar.gz  nginx-1.17.8.tar.gz

古いバージョンのインストール:
tar zxf nginx-1.16.1.tar.gz
cd nginx-1.16.1
yum install gcc openssl-devel pcre-devel -y
./configure --prefix=/usr/local/nginx
make && make install

nginxがサービスを提供していると仮定します.すべて正常です.今、nginxをホットアップグレードしたいと思っています.大体の手順は以下の通りです.
0、最も重要なステップ、バックアップ.
[root@server3 nginx-1.16.1]# cd /usr/local/nginx/sbin/
[root@server3 sbin]# ls
nginx
[root@server3 sbin]# ./nginx 			#  nginx
[root@server3 sbin]# netstat -antlupe | grep nginx 
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      0          21348      4709/nginx: master  
[root@server3 sbin]# ./nginx -v			#    ngixn   
nginx version: nginx/1.16.1
[root@server3 sbin]# ls
nginx
[root@server3 sbin]# cp nginx nginx.old				#     nginx.old
[root@server3 sbin]# ls
nginx  nginx.old

  

1、新しいバージョンのコンパイル
新しいバージョンのnginxをダウンロードし、古いバージョンのコンパイルオプションに基づいて、新しいバージョンのコンパイルを完了するには、新しいバージョンのみをコンパイルし、インストール操作を実行しません.言い換えれば、makeコマンドのみを実行し、make installコマンドを実行しません.コンパイル操作を完了すると、必要な新しいバージョンのバイナリファイルを取得できます.nginx-Vコマンドを使用して、古いバージョンのコンパイルオプションを表示します.新しいバージョンのコンパイルでは、これらのオプションを使用する必要があります.ここでは、古いバージョンをインストールするときにインストールオプションがないため、このステップは無視します.
[root@server3 ~]# tar zxf nginx-1.17.8.tar.gz 		#       
[root@server3 ~]# ls
gd-devel-2.0.35-26.el7.x86_64.rpm  nginx-1.16.1.tar.gz  nginx-1.17.8.tar.gz
nginx-1.16.1                       nginx-1.17.8
[root@server3 ~]# cd nginx-1.17.8
[root@server3 nginx-1.17.8]# ls
auto     CHANGES.ru  configure  html     man     src
CHANGES  conf        contrib    LICENSE  README
[root@server3 nginx-1.17.8]# ./configure --prefix=/usr/local/nginx			#  
[root@server3 nginx-1.17.8]# make

2、コンパイルされた新しいバージョンのnginxバイナリファイルを使用して古いバージョンのnginxバイナリファイルを置き換える
古いバージョンのnginxバイナリファイルがバックアップされていることを確認します.念のため、コンパイルされた新しいバージョンのnginxバイナリファイルで古いバージョンのnginxバイナリファイルを置き換えます.このとき、古いバージョンのnginxはメモリの中で正常に動作しているので、心配しないでください.私たちが置き換えたのはハードディスクのバイナリファイルだけです.バックアップをすればいいです.
[root@server3 nginx-1.17.8]# cd /usr/local/nginx/sbin/
[root@server3 sbin]# ls
nginx  nginx.old
[root@server3 sbin]# cp -f ~/nginx-1.17.8/objs/nginx .
cp: overwrite ‘./nginx’? y  

3.nginxのマスタープロセス(実行中の旧バージョンのマスタープロセス)に対してUSR 2信号を送信する
USR 2信号をnginxのmasterプロセス(実行中の古いバージョンのmasterプロセス)に送信します.古いバージョンのmasterプロセスは信号を受信すると、新しいバージョンのバイナリファイルを通じて新しいバージョンのmasterプロセスが起動し、新しいバージョンのmasterプロセスは新しいバージョンのworkerプロセスが起動します.このとき、新しい古いバージョンのnginxプロセスは同時に存在します.
[root@server3 sbin]# ps -ef | grep nginx | grep -v grep
root      4709     1  0 23:28 ?        00:00:00 nginx: master process ./nginx
nobody    4710  4709  0 23:28 ?        00:00:00 nginx: worker process
[root@server3 sbin]# kill -USR2 4709				#4709    master   4709
[root@server3 sbin]# ps -ef | grep nginx | grep -v grep
root      4709     1  0 23:28 ?        00:00:00 nginx: master process ./nginx		#   
nobody    4710  4709  0 23:28 ?        00:00:00 nginx: worker process				#   
root      7258  4709  0 23:44 ?        00:00:00 nginx: master process ./nginx		#   
nobody    7259  7258  0 23:44 ?        00:00:00 nginx: worker process				#   

4、旧バージョンのマスタープロセスにWINCH信号を送る
古いバージョンのmasterプロセスにWINCH信号を送信して、先に優雅に古いバージョンのworkerプロセスを停止して、新しい要求は新しいバージョンのworkerプロセスに処理されて、この時古いmasterプロセスは依然として存在して、古いmasterプロセスを残して万一に備えて、いつでもロールバックするためで、この時古いバージョンのmasterプロセス、新しいバージョンのmasterプロセスと新しいバージョンのworkerプロセスが同時に存在し、アップグレードプロセスはしばらく終了します.
[root@server3 sbin]# kill -WINCH 4709
[root@server3 sbin]# ps -ef | grep nginx | grep -v grep
root      4709     1  0 23:28 ?        00:00:00 nginx: master process ./nginx		#   
root      7258  4709  0 23:44 ?        00:00:00 nginx: master process ./nginx		#   
nobody    7259  7258  0 23:44 ?        00:00:00 nginx: worker process				#   

バージョンを表示します.
[root@server3 sbin]# /usr/local/nginx/sbin/nginx -v
nginx version: nginx/1.17.8					#        

    

5、スムーズなロールバック
アップグレード後に万一問題が発生した場合、いつでもロールバックを行うことができ、古いバージョンのmasterプロセスが停止していないため、古いバージョンのmasterプロセスにHUP信号を送信することができ、古いバージョンのmasterプロセスを通じて古いバージョンのworkerプロセスを再生成することができ、古いバージョンのworkerプロセスが再び引き上げられた後、新しいバージョンのmasterプロセスにUSR 2信号を送信することができる.新しいバージョンのmasterプロセスをworkerプロセスを解散させ、その後、新しいバージョンのmasterプロセスにWINCH信号を送信して、古いバージョンのmasterプロセスを新しいバージョンのmasterプロセスに引き継ぐ作業が正常に古いバージョンに戻りました.
[root@server3 sbin]# kill -HUP 4709					#      master          worker  
[root@server3 sbin]# ps -ef | grep nginx | grep -v grep
root      4709     1  0 Feb26 ?        00:00:00 nginx: master process ./nginx		#   
root      7258  4709  0 Feb26 ?        00:00:00 nginx: master process ./nginx		#   
nobody    7259  7258  0 Feb26 ?        00:00:00 nginx: worker process			#   
nobody    7291  4709  0 00:10 ?        00:00:00 nginx: worker process			#   
[root@server3 sbin]# kill -USR2 7258						#7258    master  pid
[root@server3 sbin]# ps -ef | grep nginx | grep -v grep
root      4709     1  0 Feb26 ?        00:00:00 nginx: master process ./nginx
root      7258  4709  0 Feb26 ?        00:00:00 nginx: master process ./nginx
nobody    7259  7258  0 Feb26 ?        00:00:00 nginx: worker process
nobody    7291  4709  0 00:10 ?        00:00:00 nginx: worker process
[root@server3 sbin]# kill -WINCH 7258
[root@server3 sbin]# ps -ef | grep nginx | grep -v grep
root      4709     1  0 Feb26 ?        00:00:00 nginx: master process ./nginx
root      7258  4709  0 Feb26 ?        00:00:00 nginx: master process ./nginx
nobody    7291  4709  0 00:10 ?        00:00:00 nginx: worker process
[root@server3 sbin]# /usr/local/nginx/sbin/nginx -v
nginx version: nginx/1.16.1					#