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=enforcing
をSELINUX=disabled
に編集。
再起動!
reboot
再起動後にgetenforce
やってDisabled
になっておけばOK
あとはnginxの起動コマンド実行したらすんなりいけます。
/bin/systemctl start nginx.service
おまけ
以下の情報を見ると、「え、--with-stream
等つけてビルドしなきゃ、ロードバランサーとして使えない??」ってなったのですが、上記の方法でも起動できたので気のせいのはずです。(途中でAWSのNLB使うことになったので、実用では使っていないのですが、一応一回疎通確認はしました)
ビルドはなかなかでした・・・
最後まで到達していない。GeoIP
関連はGeoIP2
になっていて入れられないし・・・
ちなみにyum
でnginx入れると今んとこバージョンは1.14.1
になるみたいです。
ではでは、また何かネタがたまったら書きますー