ネットワーク

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.sh

https://docs.nginx.com/nginx/admin-guide/high-availability/configuration-sharing/

では、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 にて実施

  1. ssh 鍵認証用の秘密鍵/公開鍵を作成して内容をコピーします。
# sudo ssh-keygen -t rsa -b 2048

# sudo cat /root/.ssh/id_rsa.pub
  ssh-rsa AAAAB3Nz4rFgt...vgaD root@centos01

Peer にて実施

  1. 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 アドレスからのみのアクセスに制限できます。

  1. 必要に応じて root ユーザーの ssh ログインを有効化します
# vi /etc/ssh/sshd_config

  # PermitRootLogin without-password
   ↓
   PermitRootLogin without-password

# sudo service sshd reload

なお、Peer が複数台あるときはすべての Peer で実施してください。

Primary にて実施

  1. 公開鍵認証で Peer に ssh ログインできることを確認します
# sudo ssh root@centos02.narailab.local

nginx-sync.conf ファイルの設定

nginx-sync.conf にて、どのファイルをどのインスタンスに転送するかを設定します。

  1. nginx-sync の設定ファイルを作成する
# sudo touch /etc/nginx-sync.conf
  1. 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 にする必要がありますので、この点だけご注意ください。

次回は、今回の続きで設定以外の同期について記載しようと思います。

この記事に関連する製品・サービス

この記事に関連する記事