web-dev-qa-db-ja.com

AWSELBの背後にあるNGINXでwwwを削除します

リクエスト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;
    }
}

これが私のヘルスチェックの設定です:

aws target group health check

2
jwerre

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-ではなくデフォルトにすることは理にかなっているため、最初のオプションは進むべき道のようです。ジョブリダイレクトサーバー。

私の仮説が正しければ、それで解決するはずです。

2

AWS ELB I/F構成の経験から次のことをアドバイスできます

  1. 場所の定義/ {}ブロック
  2. Location =/test {}を使用してURLを正確に一致させる方がよい
  3. 特別なserver_name_を使用し、location =/test {}ブロックを書き込むことをお勧めします。

参照:
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;
    }
}
0
minish