ITと創作でねこを飼いたい

プログラミングやITで勉強したこと、疑問をまとめます。

NginxをEC2でUDPロードバランサーとして起動する方法

はじめに

AWSでNTPサーバーを立てようとして調べたこと。
ロードバランサー→NTPサーバーの構成にしたかったが、
2019年6月24日までAWSロードバランサー(NLB)がUDPに対応していなかったので、Nginxで自作しようとしていた。
(しかし、既の所でAWSが対応したという・・・)
細かい設定の調整はできていないが、Nginxでもロードバランサーとして起動できたのでここにまとめます。

前提

EC2のOSはRed Hatを想定

Nginxのインストール

あまり難しいことは考えず、yumで入れてしまいます。
以下のコマンドは基本的に管理者権限で実行する必要があります。(実際実行したときはec2-userだったのでsudoつけてます)

yumのupdateとnginxのインストール

yum update
yum install nginx

設定ファイルの編集

vi  /etc/nginx/nginx.conf

編集時の追記内容

 stream {
     upstream dns_upstream {
        server 192.168.136.130:123;
        server 192.168.136.131:123;
        server 192.168.136.132:123;
     }
     server {
             listen          123 udp;
             proxy_pass      dns_upstream;
             proxy_timeout   1s;
             proxy_responses 1;
             # error_log       logs/dns.log;
         }
 }

上記内容は、公式のUDPヘルスチェックのところを参考にしています。
html通信しないのであれば設定ファイルのhtml{}の部分をコメントアウトしても動くはずです。
ちなみに123ポートはntpのポート。dns_upstreamは各自指定しているDNS名なので条件に応じて編集が必要です。
error_logコメントアウトしているのは、取り敢えず初回起動させるためです。
ログファイルは、後々必要であれば作成してください。

nginx起動!

/bin/systemctl start nginx.service

# 以下のようなエラーが出る
Job for nginx.service failed because the control process exited with error code.
See "systemctl status nginx.service" and "journalctl -xe" for details.

お達しの通りsystemctl status nginx.serviceを実行すると・・・
結果↓

# 省略箇所あり

 ..Starting The nginx HTTP and reverse proxy server...
 ..nginx: the configuration file /etc/nginx/nginx.conf syntax is ok  
 ..nginx: [emerg] bind() to 0.0.0.0:123 failed (13: Permission denied)
 ..nginx: configuration file /etc/nginx/nginx.conf test failed
 ..nginx.service: Control process exited, code=exited status=1
 ..nginx.service: Failed with result 'exit-code'.
 ..Failed to start The nginx HTTP and reverse proxy server.

bind() to 0.0.0.0:123 failed (13: Permission denied)ってやつが一番重要な情報っぽい・・・
実際はsudoで実行しているし、権限大丈夫なはずなんやけどなぁと思って迷走してめちゃめちゃ時間取られてはまりました。
今回の原因はSELinux:Linuxカーネルに強制アクセス制御 (MAC) 機能を付加するモジュール(Wiki情報)のせいでした。
対応方法はこちら↓

# 現在の状態確認
getenforce

ここで Enforcingと出たらアウト
参考サイト通りに永続的に無効にします。

vi /etc/selinux/config

SELINUX=enforcingSELINUX=disabledに編集。

再起動!

reboot

再起動後にgetenforceやってDisabledになっておけばOK
あとはnginxの起動コマンド実行したらすんなりいけます。

/bin/systemctl start nginx.service

おまけ

以下の情報を見ると、「え、--with-stream等つけてビルドしなきゃ、ロードバランサーとして使えない??」ってなったのですが、上記の方法でも起動できたので気のせいのはずです。(途中でAWSのNLB使うことになったので、実用では使っていないのですが、一応一回疎通確認はしました)

ビルドはなかなかでした・・・
最後まで到達していない。GeoIP関連はGeoIP2になっていて入れられないし・・・

ちなみにyumでnginx入れると今んとこバージョンは1.14.1になるみたいです。

ではでは、また何かネタがたまったら書きますー