企業実戦--Nginx(実戦事例--ホットアップグレードとスムーズリターン)
10367 ワード
ホット・アップグレードとは、ホット・デプロイメント、またはスムーズ・アップグレードとも呼ばれます.つまり、nginxサービスを停止せずにnginxのアップグレードを完了します.
しかし、ここで注意したいのは、コマンドラインに直接「nginx」と入力して起動するnginxサービスではなく、nginxを起動するときにnginxバイナリファイルの絶対パスを使用することを前提としています.絶対パスで起動しない方法は、通常、nginx関連の環境変数を便利に構成するためです.絶対パスでnginxを起動していない場合は、nginxプロセスに更新された信号を送信すると、nginxプロセスは新しいバイナリプログラムを見つけることができない可能性があります(新しいバージョンのバイナリプログラムが見つからないため、何の反応もありません).
実験準備:2つのバージョンのnginx
古いバージョンのインストール:
nginxがサービスを提供していると仮定します.すべて正常です.今、nginxをホットアップグレードしたいと思っています.大体の手順は以下の通りです.
0、最も重要なステップ、バックアップ.
1、新しいバージョンのコンパイル
新しいバージョンのnginxをダウンロードし、古いバージョンのコンパイルオプションに基づいて、新しいバージョンのコンパイルを完了するには、新しいバージョンのみをコンパイルし、インストール操作を実行しません.言い換えれば、makeコマンドのみを実行し、make installコマンドを実行しません.コンパイル操作を完了すると、必要な新しいバージョンのバイナリファイルを取得できます.nginx-Vコマンドを使用して、古いバージョンのコンパイルオプションを表示します.新しいバージョンのコンパイルでは、これらのオプションを使用する必要があります.ここでは、古いバージョンをインストールするときにインストールオプションがないため、このステップは無視します.
2、コンパイルされた新しいバージョンのnginxバイナリファイルを使用して古いバージョンのnginxバイナリファイルを置き換える
古いバージョンのnginxバイナリファイルがバックアップされていることを確認します.念のため、コンパイルされた新しいバージョンのnginxバイナリファイルで古いバージョンのnginxバイナリファイルを置き換えます.このとき、古いバージョンのnginxはメモリの中で正常に動作しているので、心配しないでください.私たちが置き換えたのはハードディスクのバイナリファイルだけです.バックアップをすればいいです.
3.nginxのマスタープロセス(実行中の旧バージョンのマスタープロセス)に対してUSR 2信号を送信する
USR 2信号をnginxのmasterプロセス(実行中の古いバージョンのmasterプロセス)に送信します.古いバージョンのmasterプロセスは信号を受信すると、新しいバージョンのバイナリファイルを通じて新しいバージョンのmasterプロセスが起動し、新しいバージョンのmasterプロセスは新しいバージョンのworkerプロセスが起動します.このとき、新しい古いバージョンのnginxプロセスは同時に存在します.
4、旧バージョンのマスタープロセスにWINCH信号を送る
古いバージョンのmasterプロセスにWINCH信号を送信して、先に優雅に古いバージョンのworkerプロセスを停止して、新しい要求は新しいバージョンのworkerプロセスに処理されて、この時古いmasterプロセスは依然として存在して、古いmasterプロセスを残して万一に備えて、いつでもロールバックするためで、この時古いバージョンのmasterプロセス、新しいバージョンのmasterプロセスと新しいバージョンのworkerプロセスが同時に存在し、アップグレードプロセスはしばらく終了します.
バージョンを表示します.
5、スムーズなロールバック
アップグレード後に万一問題が発生した場合、いつでもロールバックを行うことができ、古いバージョンのmasterプロセスが停止していないため、古いバージョンのmasterプロセスにHUP信号を送信することができ、古いバージョンのmasterプロセスを通じて古いバージョンのworkerプロセスを再生成することができ、古いバージョンのworkerプロセスが再び引き上げられた後、新しいバージョンのmasterプロセスにUSR 2信号を送信することができる.新しいバージョンのmasterプロセスをworkerプロセスを解散させ、その後、新しいバージョンのmasterプロセスにWINCH信号を送信して、古いバージョンのmasterプロセスを新しいバージョンのmasterプロセスに引き継ぐ作業が正常に古いバージョンに戻りました.
しかし、ここで注意したいのは、コマンドラインに直接「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 #