fysh blog

備忘録とかにする予定

AWSのELBとNginxとUnicornと

クライアントからのリクエストをELBで2台のEC2(Nginx+Unicorn)に振り分ける構成を構築をしていた時に, ヘルスチェックが想定通りに動作しない問題が発生した.
Unicornが停止していてもNginxが起動していればHealthy状態とされてしまい,そのEC2にもリクエストの振り分けが続いてしまった.

原因はNginx設定ファイルの不備.
ELBはプライベートIPアドレスによりヘルスチェックを行っていたが,その場合の設定を追記していなかった.
そのためデフォルトの設定が適用され,ドキュメントルートが指定したパスではなく/usr/share/nginx/html/となっており, そちらに対しヘルスチェックが行われ続けていた.
以下の設定ファイルを適用することで解決.

upstream sample_app {
    server unix:///opt/sample_app/tmp/sockets/unicorn.sock fail_timeout=0;
}
server {
    listen 80;
    server_name {ELBのDNS名};
    root /opt/sample_app/public;

    try_files $uri/index.html $uri @sample_app;

    location @sample_app {
        proxy_pass http://sample_app;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_redirect off;
    }
}
server {
    listen 80;
    server_name {EC2のプライベートIPアドレス};
    root /opt/sample_app/public;

    try_files $uri/index.html $uri @sample_app;

    location @sample_app {
        proxy_pass http://sample_app;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_redirect off;
    }
}