Classic Load BalancerからApplication Load Balancerに変更したときのNginxの注意点
AWSのClassic Load Balancer(以下、CLB)からApplication Load Balancer(以下、ALB)に変更したときに、Nginxがコケたお話。
リダイレクト設定やSSL設定をしていた場合、一手間加える必要があった…。
前置き
今まではCLBにて運用していたサイトを、サーバーを増やしALBで振り分けてサーバーの負荷を軽減し強くすることが目的。
これを成し遂げるためにCLBからALBに変え、ロードバランサーの設定を調整し、いざ接続したら「502 bad gateway」に襲われた。
旧設定
今まで使っていたNginxの設定(一部抜粋)
CMS(app)とAPI(api)はhttps、LPはhttpです。
# hoge.jpをwww.hoge.jpに統一 server { listen 80; server_name hoge.jp; location ~ ^/(api|app) { return 301 https://www.hoge.jp$request_uri; } location / { return 301 http://www.hoge.jp$request_uri; } } server { listen 443; server_name hoge.jp; location ~ ^/(api|app) { return 301 https://www.hoge.jp$request_uri; } location / { return 301 http://www.hoge.jp$request_uri; } } # ルーティング upstream unicorn { server unix:/tmp/unicorn.sock; } server { listen 443; server_name www.hoge.jp; fastcgi_read_timeout 1800s; location ~ ^/(api|app) { root /home/hoge/src/public; ここらへんにunicron設定 } location / { return 301 http://www.hoge.jp$request_uri; } } server { listen 80; server_name www.hoge.jp; location ~ ^/(api|app) { return 301 https://www.hoge.jp$request_uri; } location / { root /home/hoge/lp-site/public; } }
変わった点としては、hoge.jp
からwww.hoge.jp
にリダイレクトすることと、unicronを使っていることぐらいかと思います。
このような設定でALBで使おうとしたところ、怒られました…
しかもerror_logには何も出ないという辛さ。。。
新設定
ダメだった点
- AWSのロードバランサーにSSL証明書を付けるだけでなく、Nginx内にもきちんと書く必要あり
- CLBではロードバランサーに設定のみで大丈夫
- listenの設定に
default_server
が必要- リダイレクト設定をしているせいで、付けておかないと、きちんとルーティングしてくれない…
新しいNginxの設定
# hoge.jpをwww.hoge.jpに統一 server { listen 80; server_name hoge.jp; location ~ ^/(api|app) { return 301 https://www.hoge.jp$request_uri; } location / { return 301 http://www.hoge.jp$request_uri; } } server { listen 443; server_name hoge.jp; location ~ ^/(api|app) { return 301 https://www.hoge.jp$request_uri; } location / { return 301 http://www.hoge.jp$request_uri; } } # ルーティング upstream unicorn { server unix:/tmp/unicorn.sock; } server { listen 443 default_server; server_name www.hoge.jp; fastcgi_read_timeout 1800s; ssl on; ssl_certificate /etc/nginx/fuga.pem; ssl_certificate_key /etc/nginx/fuga.key; location ~ ^/(api|app) { root /home/hoge/src/public; ここらへんにunicron設定 } location / { return 301 http://www.hoge.jp$request_uri; } } server { listen 80; server_name www.hoge.jp; location ~ ^/(api|app) { return 301 https://www.hoge.jp$request_uri; } location / { root /home/hoge/lp-site/public; } }
まとめ
CLBは割りと融通きかせてくれたみたいだけれど、ALBだとしっかりと設定しておかないとダメみたい。
手抜きっといううか、こういう細かい所の設定までしっかりと熟知しておかないと、気づくに気づけないなっとすごく痛感した。