2022年6月4日土曜日

NGINXで負荷分散装置(ロードバランサ)を構築する

自宅では、プロキシやDNSなどを負荷分散装置(ロードバランサ)にてロードバランスして利用している。負荷分散装置としてはZEVENETを利用していたが、コミュニティ版は2020年5月から更新がないことや、冗長構成した際にうまく切り替わらないなどの問題が起きていたため、今回別製品に変更することにした。

調べていくと、Webサーバ用途のソフトウェアとして知られる「NGINX (エンジンエックス)」が負荷分散装置としても利用できることがわかった。ただし、OSS版のNGINXにおいては、以下機能が実装されていない点に注意しよう。以下機能は商用のNGINX Plusであれば利用可能となる。

  • セッションパーシステンスの機能なし
  • 負荷分散対象サーバに対するNGINXからの定期的なヘルチェック (アクティブヘルスチェック) の機能なし。通信発生時に都度ヘルスチェックを行うパッシブヘルスチェックのみ利用可能
  • NGINXの機能を利用した冗長化構成の機能なし

今回、「NGINX」を利用して負荷分散装置(ロードバランサ)を構築する手順を記載する。先に言っておくと、NGINXの設定は非常に簡単だった。

環境

環境としては以下の通りAlmaLinuxを利用したが、そのほかのRed Hat系のディストリビューションであれば、ほぼ同様の手順で構築できるはずだ。

  • AlmaLinux 8.5
  • NGINX 1.14.1

負荷分散装置の構成は以下の通りとする。クライアントからの通信と負荷分散対象サーバが同一のインタフェースとなる「ワンアーム」構成となる。なお、NGINXでは、通信は必ずSource NATされるため、ワンアーム構成としたとしても特別な設定は不要となる。

負荷分散対象は以下の通りとする。

用途 待ち受けポート 負荷分散対象サーバ ポート番号
Proxy 8080/tcp 192.168.33.27, 192.168.33.28 8080/tcp
DNS 53/udp 192.168.33.27, 192.168.33.28 10053/udp
MTA 25/tcp 192.168.33.27, 192.168.33.28 25/tcp
NTP 123/udp 192.168.33.27, 192.168.33.28 123/udp

NGINXにて負荷分散装置を構築する手順

1. dnfでNGINXをインストール

Red Hat系のディストリビューションの場合は、NGINXは標準のリポジトリに用意されている。NGINX本体に加え、負荷分散装置の設定に必要なstreamモジュールをインストールする。

# dnf install nginx nginx-mod-stream -y

2. NGINXの設定ファイルを作成

負荷分散装置の設定ファイル用のディレクトリを作成する。

# mkdir /etc/nginx/stream.conf.d

ディレクトリ作成後、以下2つのファイルを作成・追記を行う。

/etc/nginx/stream.conf.d/servers.stream.conf

以下内容で設定ファイルを新規作成する。

# Proxy
upstream proxy_server {
    least_conn;
    server 192.168.33.27:8080;
    server 192.168.33.28:8080;
}

server {
    listen       8080;
    proxy_pass   proxy_server;
}

# DNS
upstream dns_server {
    server 192.168.33.27:10053;
    server 192.168.33.28:10053;
}

server {
    listen       53 udp;
    proxy_pass   dns_server;
}

# MTA
upstream mail_server {
    least_conn;
    server 192.168.33.27:25;
    server 192.168.33.28:25;
}

server {
    listen       25;
    proxy_pass   mail_server;
}

# NTP
upstream ntp_server {
    server 192.168.33.27:123;
    server 192.168.33.28:123;
}

server {
    listen       123 udp;
    proxy_pass   ntp_server;
}

/etc/nginx/nginx.conf

以下を最下行に追記する。

stream {
    include /etc/nginx/stream.conf.d/*.conf;
}

3. サービス起動

これだけで必要な設定は完了となるため、NGINXのサービスを起動しよう。

# systemctl start nginx
# systemctl enable nginx

4. 動作確認

サービス起動後に待ち受けポートが開放されていることをssコマンドで確認する。以下の通り、負荷分散装置の設定を行ったポートがLISTEN (UDPに関してはUNCONN) になっていることがわかる。

# ss -nl | egrep ":(8080|53|25|123)" | sed -e 's/  */\t/g'
udp     UNCONN  0       0       0.0.0.0:123     0.0.0.0:*
udp     UNCONN  0       0       0.0.0.0:53      0.0.0.0:*
tcp     LISTEN  0       128     0.0.0.0:8080    0.0.0.0:*
tcp     LISTEN  0       128     0.0.0.0:25      0.0.0.0:*

負荷分散対象サーバに対しても問題なく通信できていることを確認しておこう。

# ss -n | egrep "192.168.33.27:(8080|53|25|123)" | sed -e 's/  */\t/g'
udp     ESTAB   0       0       192.168.33.41:57935     192.168.33.27:123
tcp     ESTAB   0       0       192.168.33.41:39962     192.168.33.27:8080
tcp     ESTAB   0       0       192.168.33.41:39592     192.168.33.27:8080

# ss -n | egrep "192.168.33.28:(8080|53|25|123)" | sed -e 's/  */\t/g'
udp     ESTAB   0       0       192.168.33.41:37953     192.168.33.28:123
tcp     ESTAB   0       0       192.168.33.41:35096     192.168.33.28:8080
tcp     ESTAB   0       0       192.168.33.41:33832     192.168.33.28:8080

以上を確認したうえで、実際にプロキシ経由でのインターネット閲覧やDNSの名前解決を確認し、問題なく動作することを確認した。

以上にて、「NGINX」を利用して負荷分散装置を構築する手順は完了となる。

参考

0 件のコメント:

コメントを投稿

人気の投稿