1 分で Nginx のバージョンをスムーズにアップグレードおよびロールバックする方法

1 分で Nginx のバージョンをスムーズにアップグレードおよびロールバックする方法

今日は、企業の実際の本番環境でよく遭遇する、Nginx を新しいバージョンにアップグレードし、古いバージョンにロールバックする方法についてお話しします。

1. 環境の紹介

本日準備された 2 つの nginx バージョンは次のとおりです。

[root@nginx ~]# cd /download/nginx/
[root@nginx nginx]# ll
合計 1952
-rw-r--r-- 1 ルート ルート 981687 2017年10月17日 nginx-1.12.2.tar.gz
-rw-r--r-- 1 ルート ルート 1015384 12月4日 09:58 nginx-1.14.2.tar.gz

2. 古いバージョンと新しいバージョンをコンパイルしてインストールする

nginx-1.12.2をコンパイルしてインストールする

[root@nginx nginx]# tar zxf nginx-1.12.2.tar.gz 
[root@nginx nginx]# cd nginx-1.12.2
[root@nginx nginx-1.12.2]# ./configure --prefix=/usr/local/nginx-1.12.2
[root@nginx nginx-1.12.2]# echo $?
0
[root@nginx nginx-1.12.2]# make && make install
[root@nginx nginx-1.12.2]# echo $?
0
[root@nginx nginx-1.12.2]# ll /usr/local/nginx-1.12.2/
合計 0
drwxr-xr-x 2 ルート ルート 333 3月1日 09:01 conf
drwxr-xr-x 2 ルート ルート 40 3月 1 09:01 html
drwxr-xr-x 2 ルート ルート 6 3月 1 09:01 ログ
drwxr-xr-x 2 ルート ルート 19 3月 1 09:01 sbin

nginx-1.14.2をコンパイルしてインストールする

[root@nginx ~]# cd /download/nginx/
[root@nginx nginx]# tar zxf nginx-1.14.2.tar.gz 
[root@nginx nginx]# cd nginx-1.14.2
[root@nginx nginx-1.14.2]# ./configure --prefix=/usr/local/nginx-1.14.2
[root@nginx nginx-1.14.2]# echo $?
0
[root@nginx nginx-1.14.2]# make && make install
[root@nginx nginx-1.14.2]# echo $?
0
[root@nginx nginx-1.14.2]# ls -l /usr/local/nginx-1.14.2/
合計 0
drwxr-xr-x 2 ルート ルート 333 3月 1 09:03 conf
drwxr-xr-x 2 ルート ルート 40 3月 1 09:03 html
drwxr-xr-x 2 ルート ルート 6 3月 1 09:03 ログ
drwxr-xr-x 2 ルート ルート 19 3月 1 09:03 sbin

この時点で、 nginx ソフトウェアの 2 つのバージョンが展開されています。

3. 古いバージョンのnginxを起動する

[root@nginx ~]# /usr/local/nginx-1.12.2/sbin/nginx -t
nginx: 設定ファイル /usr/local/nginx-1.12.2/conf/nginx.conf の構文は正常です
nginx: 設定ファイル /usr/local/nginx-1.12.2/conf/nginx.conf のテストが成功しました
[root@nginx ~]# /usr/local/nginx-1.12.2/sbin/nginx
[root@nginx ~]# ps -ef|grep nginx
root 6324 1 0 09:06 ? 00:00:00 nginx: マスタープロセス /usr/local/nginx-1.12.2/sbin/nginx
誰も 6325 6324 0 09:06 ? 00:00:00 nginx: ワーカープロセス
ルート 6327 1244 0 09:06 pts/0 00:00:00 grep --color=auto nginx
[root@nginx ~]# lsof -i :80
コマンド PID ユーザー FD タイプ デバイス サイズ/オフ ノード名
nginx 6324 ルート 6u IPv4 26324 0t0 TCP *:http (LISTEN)
nginx 6325 誰も 6u IPv4 26324 0t0 TCP *:http (LISTEN)

4. 最新バージョンにアップグレードする

バージョン アップグレードは、実際にはバイナリ ファイルのアップグレードです。プロセスは次のとおりです。

[root@nginx ~]# /usr/local/nginx-1.12.2/sbin/nginx -v
nginx バージョン: nginx/1.12.2
[root@nginx ~]# cd /usr/local/nginx-1.12.2/sbin/
[root@nginx sbin]# mv nginx nginx-1.12.2
#まず、元の古いバージョンのnginxバイナリファイル[root@nginx sbin]をバックアップします# cp /usr/local/nginx-1.14.2/sbin/nginx ./
#バイナリファイルの新しいバージョンを現在のディレクトリにコピーします

次に、スムーズなアップグレード操作を実行します

[root@nginx ~]# ps -ef|grep nginx
root 6324 1 0 09:06 ? 00:00:00 nginx: マスタープロセス /usr/local/nginx-1.12.2/sbin/nginx
誰も 6325 6324 0 09:06 ? 00:00:00 nginx: ワーカープロセス
ルート 6338 1244 0 09:11 pts/0 00:00:00 grep --color=auto nginx
[root@nginx ~]# kill -USR2 6324
[root@nginx ~]# ps -ef|grep nginx
root 6324 1 0 09:06 ? 00:00:00 nginx: マスタープロセス /usr/local/nginx-1.12.2/sbin/nginx
誰も 6325 6324 0 09:06 ? 00:00:00 nginx: ワーカープロセス
root 6340 6324 0 09:12 ? 00:00:00 nginx: マスタープロセス /usr/local/nginx-1.12.2/sbin/nginx
誰も 6341 6340 0 09:12 ? 00:00:00 nginx: ワーカープロセス
ルート 6343 1244 0 09:12 pts/0 00:00:00 grep --color=auto nginx

この時点で、新しいマスター プロセスは正常に開始されていますが、古いワーカー プロセスはまだ存在しているため、次のコマンドを使用して、古いワーカー プロセスにスムーズに停止するように通知します。

[root@nginx ~]# kill -WINCH 6324
[root@nginx ~]# ps -ef|grep nginx
root 6324 1 0 09:06 ? 00:00:00 nginx: マスタープロセス /usr/local/nginx-1.12.2/sbin/nginx
root 6340 6324 0 09:12 ? 00:00:00 nginx: マスタープロセス /usr/local/nginx-1.12.2/sbin/nginx
誰も 6341 6340 0 09:12 ? 00:00:00 nginx: ワーカープロセス
ルート 6346 1244 0 09:14 pts/0 00:00:00 grep --color=auto nginx

この時点で、古いワーカー プロセスは停止しています。次に、正常にアクセスできるかどうかをテストします。

正常にアクセスできます。実際、このスムーズなアップグレードはアクセスしているユーザーにはまったく気づかれないため、nginx のホット デプロイメントが完了しました。

[root@nginx ~]# /usr/local/nginx-1.12.2/sbin/nginx -v
nginx バージョン: nginx/1.14.2

バージョンを確認すると最新バージョンなので、アップグレードは完了です。

注: バージョン アップグレードが完了した後に問題がなく、古いマスター プロセスをシャットダウンする必要がある場合は、次のコマンドを使用できます。

強制終了 -QUIT 古いマスターPID

5. バージョンのロールバック

アップグレードで最も難しいのはアップグレードではなく、ロールバックです。実際の運用環境ではロールバックの可能性があるためです。たとえば、新しいバージョンが何らかの未知のバグのために既存のアプリケーションと互換性がなかったり、動作が不安定になったりするなどです。

したがって、運用保守エンジニアにとって、障害ロールバックは重要なポイントとなります。

上記の結果では、古いマスター プロセスが常に存在していることもわかります。手動でシャットダウンしない限り、自動的にシャットダウンすることはありません。この設計は有益です。利点は、新しいバージョンにアップグレードした後、問題が発生した場合に、タイムリーかつ迅速に以前の安定したバージョンにロールバックできることです。

[root@nginx ~]# ps -ef|grep nginx
root 6324 1 0 09:06 ? 00:00:00 nginx: マスタープロセス /usr/local/nginx-1.12.2/sbin/nginx
root 6340 6324 0 09:12 ? 00:00:00 nginx: マスタープロセス /usr/local/nginx-1.12.2/sbin/nginx
誰も 6341 6340 0 09:12 ? 00:00:00 nginx: ワーカープロセス
ルート 6350 1244 0 09:23 pts/0 00:00:00 grep --color=auto nginx
[root@nginx ~]# cd /usr/local/nginx-1.12.2/sbin/
[root@nginx sbin]# mv nginx nginx-1.14.2
[root@nginx sbin]# mv nginx-1.12.2 nginx
[root@nginx sbin]# kill -USR1 6324
[root@nginx sbin]# ps -ef|grep nginx
root 6324 1 0 09:06 ? 00:00:00 nginx: マスタープロセス /usr/local/nginx-1.12.2/sbin/nginx
root 6340 6324 0 09:12 ? 00:00:00 nginx: マスタープロセス /usr/local/nginx-1.12.2/sbin/nginx
誰も 6341 6340 0 09:12 ? 00:00:00 nginx: ワーカープロセス
ルート 6355 1244 0 09:24 pts/0 00:00:00 grep --color=auto nginx
[root@nginx sbin]# ./nginx -v
nginx バージョン: nginx/1.12.2

上記の結果から、以前のバージョンにスムーズにロールバックできたことがわかります。次に、正常にアクセスできるかどうかをテストします。

通常どおりアクセス可能なので、ロールバック操作もユーザーにはわかりません。

以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • nginx をアップグレードして HTTP2.0 をサポートする方法の例
  • Nginx バージョンのスムーズなアップグレードソリューションの詳細説明
  • nginx をアップグレードして http2 をサポートする方法
  • Nginx のパフォーマンスを向上させるための提案
  • Nginx サービスのインストールとソフトウェアのアップグレード

<<:  Vueのコンポーネント値の転送から始まるオブザーバーモードの詳細な説明

>>:  MySQLソートにおけるCASE WHENの使用例

推薦する

Docker Composeのデプロイと基本的な使い方の詳しい説明

1. Docker Composeの概要Compose は、マルチコンテナ Docker アプリケー...

Vue で v-for を更新する方法

ヒント:配列変更メソッドによりv-forが更新され、ページが更新されます。配列を変更しないメソッド:...

vue-element-admin グローバル読み込み待機中

最近の要件:グローバルロード、すべてのインターフェースはロード待機機能を表示するかどうかを手動で制御...

Docker イメージのインポートとエクスポートのコード例

Dockerイメージのインポートとエクスポートこの記事では、移行、バックアップ、アップグレードなどの...

高度なクローラー - JS 自動レンダリングのための Scrapy_splash コンポーネントの使用

目次1. scrapy_splash とは何ですか? 2. scrapy_splashの役割3. s...

WangEditor リッチ テキスト コンポーネントを Angular でカプセル化する方法

リッチ テキスト コンポーネントは、Web プログラムで、特にブログやフォーラムなどの Web サイ...

共通要素のデフォルトのマージンとパディング値に関する議論

今日は、さまざまなブラウザでのデフォルト要素のマージン値が何であるかという問題について説明しました。...

HTML のスクロールバーについて/スクロールバーの削除

1. xhtmlの下のスクロールバーの色元の HTML では、ページ全体のスクロール バーを次のよう...

フレックスレイアウトは、上下固定、中間スライドのレイアウトモードを実現します。

この記事では、主に、上下固定と中スライドレイアウトを実現するためのフレックスレイアウトのレイアウト方...

Dockerコンテナ内でホストDocker操作を呼び出して実行する

まず、この投稿は Docker 初心者向けです。もちろん、ベテランであれば記事中の分割線以降の操作方...

Vueはカルーセルのフレームレート再生を実装します

この記事の例では、カルーセルのフレームレート再生を実現するためのVueの具体的なコードを参考までに共...

XHTML チュートリアル: 初心者のための XHTML の基礎

<br />当サイトのオリジナルコンテンツですので、転載の際は出典を123WORDPRE...

WeChatアプレットがテキストスクロールを実装

この記事の例では、WeChatアプレットでテキストスクロールを実装するための具体的なコードを参考まで...

JDBC 探索 SQLException 分析

1. SQLExceptionの概要JDBC を使用してデータ ソース (この記事のデータ ソースは...

HTML CSS3は画像表示効果を引き伸ばさない

1. transform 属性を使用して、画像を拡大せずに表示します (パスの問題は必要に応じて修正...