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; } }