web-dev-qa-db-ja.com

NameVirtualHostを使用してwwwにリダイレクトする場合、ELBヘルスチェックをどのように設定すればよいですか?

HTTPヘルスチェックが失敗しているため、ELBはインスタンスをサービスから外し続けています。

DNSワイルドカードがあり、すべてをwwwにリダイレクトします。

vhost.conf:

ServerName www.example.com
ServerAlias *.example.com
RewriteEngine on
RewriteCond %{HTTP_Host} !^www\.example\.com$ [NC]
RewriteRule ^ http://www.example.com/$1 [R=301,L]

これは実際のブラウザでは問題なく機能しますが、/へのHTTPヘルスチェックは失敗します。これはおそらく302を取得しているためです。

TCPヘルスチェックを使用する最善のオプションですか、それともHTTPを機能させる方法はありますか?

8
chris

この質問は AWSフォーラムで尋ねられました であり、答えは、裸のIPアドレスのトラフィックを処理し、リダイレクトを行わないデフォルトの仮想ホストを設定することでした。これは、IPアドレスにヒットした通常のユーザーもリダイレクトされないことを意味します。

または、ELBに要求するURLのパス部分を指定し、別のRewriteCondを追加してそのパスを無視することもできます。

RewriteCond %{HTTP_Host} !^www\.example\.com$ [NC]
RewriteCond %{REQUEST_URI} !^/health-check$
RewriteRule ^ http://www.example.com/$1 [R=301,L]

そのURLにアクセスした通常のユーザーはリダイレクトされません。

同じ手法を使用して、ELBのユーザーエージェントを検出することもできます。

RewriteCond %{HTTP_Host} !^www\.example\.com$ [NC]
RewriteCond %{HTTP_USER_AGENT} !^ELB-HealthChecker
RewriteRule ^ http://www.example.com/$1 [R=301,L]

User-Agentを偽装する通常のユーザーはリダイレクトされません。

または、ELBの内部IPアドレス。

RewriteCond %{HTTP_Host} !^www\.example\.com$ [NC]
RewriteCond %{REMOTE_ADDR} !^10\.
RewriteRule ^ http://www.example.com/$1 [R=301,L]

このオプションを機能させるには、mod_rpaf(Apache 2.2の場合)またはmod_remoteip(Apache 2.4の場合)REMOTE_ADDR変数の内容の正しい部分を含むX-Forwarded-Forヘッダー。これを正しく設定する限り、通常のユーザーがリダイレクト応答を回避することはできません。

11
Ladadadada

仮想ホストを反映するには、httpdサービスを再起動する必要があるため、仮想ホストを追加することはお勧めできません。これを行う別の方法があります

  1. .htaccessファイルのELBヘルスチェックパスを無視する
    DNS名の4つの部分すべてを次のように分離します
    elb_dns_name:elb-name.subnet_zone.elb.amazonaws.com
  2. 残りのすべてのURLには内部書き換えルールがあります
    directory_scructure:code_folder/website

    RewriteEngine On
    RewriteCond%{HTTP_Host}!$ [NC]
    RewriteCond%{REQUEST_URI}!^/index.php $
    RewriteRule ^(。*)$/$ 1 [L、QSA]

これは私にとって非常にうまくいきました。よりよい方法の応援があれば提案してください!

0
ravibalgi