リクエストURLからwwwを削除しようとしていますが、nginx設定に以下を追加すると、AWSELBヘルスチェックが失敗します。
server {
listen 80;
server_name www.example.com;
return 301 $scheme://example.com$request_uri;
}
何が問題を引き起こしている可能性があるのか考えていますか?これは私の設定の残りです:
server {
listen 80;
server_name .example.com;
root /var/www/static;
index index.html;
try_files $uri.html $uri $uri/ =404;
charset UTF-8;
error_log /var/log/error.log;
access_log /var/log/access.log;
# ELB test route
location /test {
add_header X-Robots-Tag noindex;
default_type text/plain;
return 200 'success';
}
# Redirect any request http request that come from AWS ELB to https
if ($http_x_forwarded_proto = "http") {
return 301 https://$server_name$request_uri;
}
}
これが私のヘルスチェックの設定です:
Amazon docs から:
ロードバランサーが適切にスケーリングできるようにするには、ロードバランサーの各サブネットに少なくとも/ 27ビットマスク(たとえば、10.0.0.0/27)のCIDRブロックがあり、少なくとも8つの空きIPアドレスがあることを確認します。 ロードバランサーはこれらのIPアドレスを使用して、インスタンスとの接続を確立します。
これにより、ELBヘルスチェックがドメイン名ではなくAWSプライベートIPを介して行われているように聞こえます。私がAmazonについて知っていることから、それは彼らができるときに物事を行うことを好む方法です(明らかなパフォーマンス上の理由から、DNSルックアップの必要がなく、より近いルーターで処理できるなど)
その場合、Hostヘッダー(空白でない限り、ベアIPにリクエストを送信するときにHostヘッダーがどのように機能するかは100%わかりません)がEC2インスタンスのプライベートAWSアドレスになります(私はm Webサーバーを実行しているEC2)であると想定します。これは、Nginxがリクエストを処理する仮想サーバーを選択する方法に影響を与えます。
Nginxには2つのserver
ブロックがあるため、特定のリクエストを受け取るブロックを決定する必要があります。サーバーブロックを選択するプロセス(詳細 ここ )は次のとおりです。
最初に、リクエストが着信したポートでリッスンしているサーバーを探します。この場合、両方のサーバーが同じポートでリッスンしているため、これは役に立ちません。
次に、リクエストのHostヘッダーを調べ、Hostヘッダーと一致するserver_name
を持つサーバーを探します。この場合、Hostヘッダーはインスタンスに割り当てられたプライベートAWS IPであるため(または、私がよくわからないので空白)、それらのいずれも一致しません。
最後に、どちらも一致しない場合は、デフォルトのサーバーを使用します。明示的なデフォルト宣言がない場合、サイト構成でfirstと定義されているサーバーがデフォルトとして選択されます。
リダイレクトサーバーがメインサーバーの構成の前にある場合(私が想像するように)、これはおそらくあなたの問題です。次の3つのいずれかを行う必要があります。
listen
ディレクティブにdefault_server
を追加して、otherサーバー(メインサーバー)をデフォルトにすることを指定します。つまり、listen 80 default_server;
location /test
ブロックを他のサーバーブロックに切り替えるか、
サーバーブロックが定義されている順序を逆にします。
default_server
ディレクティブを暗黙的ではなく明示的にすることは理にかなっており、メインサーバーをyou-had-one-ではなくデフォルトにすることは理にかなっているため、最初のオプションは進むべき道のようです。ジョブリダイレクトサーバー。
私の仮説が正しければ、それで解決するはずです。
AWS ELB I/F構成の経験から次のことをアドバイスできます
参照:
http://nginx.org/en/docs/http/ngx_http_core_module.html#server_name
server {
listen 80;
# changed for 1. "anonymous server" (without Host: header) will accept request.
server_name _ .example.com;
root /var/www/static;
index index.html;
try_files $uri.html $uri $uri/ =404;
charset UTF-8;
error_log /var/log/error.log;
access_log /var/log/access.log;
# changed for 1. defined location / {} for default behavior
location / {
try_files $uri $uri/ =404;
}
# ELB test route
# changed for 2. exactly match only /test request
location = /test {
add_header X-Robots-Tag noindex;
default_type text/plain;
return 200 'success';
}
# Redirect any request http request that come from AWS ELB to https
if ($http_x_forwarded_proto = "http") {
return 301 https://$server_name$request_uri;
}
}