NGINX Plus での設定同期について
NGINX で冗長構成を組んでいたり、ロードバランサー配下で並べて利用している場合等、設定管理が煩雑になりやすいです。
そんなとき、設定同期が出来たら楽になりますね。
今回は、NGINX Plus で設定同期する方法を紹介します。
こんにちは、narai です。
冒頭の通り今回は設定同期について見ていきましょう。
NGINX Plus で設定同期をする際は nginx-sync パッケージを使用します。
また、NGINX Plus の冗長化について で紹介した nginx-ha-keepalived と nginx-sync は別機能となりますので、冗長構成を構築せずに設定同期だけを行うことも可能です。
では、この nginx-sync パッケージについてみていきましょう。
nginx-sync について
nginx-sync は以下の図のように、設定元となる Primary の設定を Peer に転送することで、設定を同期させます。
この、Primary から Peer への設定同期には rsync を使用しておりますので、同期させるファイルやフォルダを自由に選択することができます。
では、nginx-sync をインストールして実際に設定を同期させてみましょう。
nginx-sync の設定
構成
nginx-sync の動作確認のための構成としては、シンプルに2台の NGINX Plus がそれぞれ同じ web コンテンツを提供しているものとします。
- NGINX Plus :
- centos01.narailab.local (Primary)
- centos02.narailab.local (Peer)
/etc/nginx/conf.d/
|-- api.conf
|-- default.conf
|-- test.conf
/usr/share/nginx/html/
|-- 50x.html
|-- dashboard.html
|-- index.html
事前準備
はじめに nginx-sync を利用するためには、以下の条件をクリアしている必要があります。
- Primary に nginx-sync パッケージがインストールされている
- Primary – Peer 間で root ユーザーの SSH 鍵認証ができる
- nginx-sync.conf ファイルが作成されている
各項目の設定方法を見ていきましょう。
nginx-sync パッケージのインストール
以下のコマンドを使用して Primary の NGINX Plus に nginx-sync パッケージをインストールします。
sudo yum install nginx-sync
なお、nginx-sync パッケージは nginx-plus と同じリポジトリに保存されていますので、インストールには NGINX Plus のライセンスが必要となります。
Primary – Peer 間で root ユーザーの SSH 鍵認証設定
nginx-sync では root ユーザーで SSH をして転送しますので、Primary から Peer に対して ssh の鍵認証ができる必要があります。
なぜ、root ユーザーが必要かというと Peer の /etc/nginx
ディレクトリを操作したり、nginx -s reload
コマンドを発行したりする必要があるためです。
この辺りは、各ディストリビューションによって若干変わりますので、適宜読み替えてください。
※ 今回は Centos8 で実施しています。
設定方法
SSH 鍵認証を行うには、Primary と Peer 両方の NGINX Plus で設定が必要となります。
Primary にて実施
- ssh 鍵認証用の秘密鍵/公開鍵を作成して内容をコピーします。
# sudo ssh-keygen -t rsa -b 2048
# sudo cat /root/.ssh/id_rsa.pub
ssh-rsa AAAAB3Nz4rFgt...vgaD root@centos01
Peer にて実施
- Primary の公開鍵情報を authorized_keys に登録します
# sudo mkdir /root/.ssh
# sudo echo `from="centos01.narailab.local" ssh-rsa AAAAB3Nz4rFgt...vgaD root@nginx01` >> /root/.ssh/authorized_keys
authroized_keys ファイルについて
authroized_keys ファイルに公開鍵を登録しておくことで、公開鍵認証ができるようになります。また、from を使用することで指定した IP アドレスからのみのアクセスに制限できます。
- 必要に応じて root ユーザーの ssh ログインを有効化します
# vi /etc/ssh/sshd_config
# PermitRootLogin without-password
↓
PermitRootLogin without-password
# sudo service sshd reload
なお、Peer が複数台あるときはすべての Peer で実施してください。
Primary にて実施
- 公開鍵認証で Peer に ssh ログインできることを確認します
# sudo ssh root@centos02.narailab.local
nginx-sync.conf ファイルの設定
nginx-sync.conf にて、どのファイルをどのインスタンスに転送するかを設定します。
- nginx-sync の設定ファイルを作成する
# sudo touch /etc/nginx-sync.conf
- nginx-sync.conf を設定する
sudo vi /etc/nginx-sync.conf
ここでは、centos02 に対して、nginx の設定とコンテンツディレクトリを同期させるようにします。
NODES="centos02.narailab.local"
CONFPATHS="/etc/nginx/conf.d/*.conf /usr/share/nginx/html/"
EXCLUDE="test.conf"
NODES : 設定を同期させる NGINX Plus インスタンスを指定します。
IPアドレスとホスト名のどちらでも指定可能です。
CONFPATHS : 同期させるファイルやディレクトリを指定します。
EXCLUDE : CONFPATHS のなかで同期させたくないファイルやディレクトリを指定します。
ここまでできれば、準備完了です。
NGINX Plus の設定同期
では、以下のように、centos02 には設定が無い状態から
centos01
[root@centos01 html]# ls -l /etc/nginx/conf.d/
-rw-r--r-- 1 root root 227 7月 3 21:42 api.conf
-rw-r--r-- 1 root root 511 7月 18 14:11 test.conf
[root@centos01 html]# ls -l /usr/share/nginx/html
-rw-r--r-- 1 nginx nginx 497 10月 11 2022 50x.html
-rw-r--r-- 1 nginx nginx 748339 10月 11 2022 dashboard.html
-rw-r--r-- 1 nginx nginx 615 10月 11 2022 index.html
centos02
[root@centos02 html]# ls -l /etc/nginx/conf.d/
合計 0
[root@centos02 html]# ls -l /usr/share/nginx/html
合計 0
nginx-sync で設定を同期させてみましょう
[root@centos01 conf.d]# nginx-sync.sh
* Synchronization started at 2023年 7月 18日 火曜日 08:24:42 UTC
* Checking prerequisites
* Testing local nginx configuration file
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
nginx version: nginx/1.21.6 (nginx-plus-r27)
* Deleting remote backup directory
* Backing up configuration on centos02.narailab.local
* Updating configuration on centos02.narailab.local
* Testing nginx config on centos02.narailab.local
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
Redirecting to /bin/systemctl status nginx.service
Redirecting to /bin/systemctl reload nginx.service
* Synchronization ended at 2023年 7月 18日 火曜日 08:24:46 UTC
centos02 の設定をバックアップしてから、centos01 のファイルを転送して内容をチェックしていることがわかりますね。
このように、nginx-sync ではただファイルを転送するだけでなく、正しく読みこめるかを確認したうえで設定を反映させています。
では、本当にファイルが転送されたか見てみましょう。
[root@centos02 conf.d]# ls -l /etc/nginx/conf.d/
合計 8
drwxr-xr-x. 2 root root 59 7月 18 17:24 .
drwxr-xr-x. 3 root root 132 7月 3 21:36 ..
-rw-r--r-- 1 root root 227 7月 3 21:42 api.conf
-rw-r--r-- 1 root root 1490 7月 18 14:07 default.conf
[root@centos02 conf.d]# ls -l /usr/share/nginx/html/
-rw-r--r-- 1 nginx nginx 497 10月 11 2022 50x.html
-rw-r--r-- 1 nginx nginx 748339 10月 11 2022 dashboard.html
-rw-r--r-- 1 nginx nginx 615 10月 11 2022 index.html
ちゃんと同期されていますね。
設定比較
これまで見てきた通り nginx-sync は Primary の設定をコピーしますので Peer にしかない設定がある場合、nginx-sync.sh によって上書きされてしまいます。
それを防ぐために、以下のコマンドにて Primary と Peer の設定を比較することができます。
nginx-sync.sh -C "Peerのaddress" -d
以下の例は centos01 の待ち受けポートを変更したときの比較結果です。
[root@centos01 conf.d]# nginx-sync.sh -C centos02 -d
* Synchronization started at 2023年 7月 18日 火曜日 08:46:42 UTC
* Checking prerequisites
* Comparing local and remote configs
diff -ru local:/etc/nginx/conf.d/default.conf remote:/etc/nginx/conf.d/default.conf
--- local:/etc/nginx/conf.d/default.conf 2023-07-18 17:46:40.965772606 +0900
+++ remote:/etc/nginx/conf.d/default.conf 2023-07-18 13:30:16.872495721 +0900
@@ -1,5 +1,5 @@
server {
- listen 88 default_server; ### centos01 の待ち受けポートを変更
+ listen 80 default_server;
server_name app.narailab.local;
#access_log /var/log/nginx/host.access.log main;
@@ -59,13 +59,3 @@
# root /usr/share/nginx/html;
#}
}
* Synchronization ended at 2023年 7月 18日 火曜日 08:46:44 UTC
まとめ
このとおり、NGINX Plus では、nginx-sync を使うことで非常に簡単に設定同期を行うことができます。
nginx を web サーバーとして利用する場合、複数台並べることが多いと思います。そういった時に設定管理が 1 台で済むのは嬉しいですね。
なお、Primary に障害が発生すると設定同期が出来なくなるため、Peer のいずれかに nginx-sync をインストールして Primary にする必要がありますので、この点だけご注意ください。
次回は、今回の続きで設定以外の同期について記載しようと思います。