gosoly

ゆっくりと趣味に浸る。

Classic Load BalancerからApplication Load Balancerに変更したときのNginxの注意点

f:id:ban367:20171001210817j:plain

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内にもきちんと書く必要あり
  • 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だとしっかりと設定しておかないとダメみたい。
手抜きっといううか、こういう細かい所の設定までしっかりと熟知しておかないと、気づくに気づけないなっとすごく痛感した。