Como devo configurar minha verificação de integridade do ELB ao usar NameVirtualHosts e redirecionar para www?


8

Meu ELB continua desativando minhas instâncias, porque a verificação de integridade do HTTP está falhando.

Temos um curinga de DNS e redirecionamos tudo para 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]

Isso funciona bem para navegadores reais, mas a verificação de integridade HTTP para / falha, presumivelmente porque está recebendo um 302.

É a melhor opção para usar uma verificação de integridade do TCP ou existe uma maneira de fazer o HTTP funcionar?


Basta usar uma verificação de integridade do TCP até que a AWS permita personalizar o cabeçalho do host enviado para a verificação de saúde. Mesmo com uma entrada padrão no servidor da web, você não está realmente verificando a integridade do seu aplicativo, apenas o servidor da web, que é praticamente o mesmo que verificar se a porta tcp está aberta.
Pykler

Respostas:


11

Esta pergunta foi feita nos fóruns da AWS e a resposta foi configurar um vhost padrão que lida com tráfego no endereço IP simples e não faz redirecionamentos. Isso significa que os usuários normais que acessarem seu endereço IP também não serão redirecionados.

Como alternativa, você pode especificar a parte do caminho da URL que deseja que o ELB solicite e ignorar esse caminho adicionando outro RewriteCond:

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

Usuários normais que acessam esse URL não serão redirecionados.

Você também pode usar a mesma técnica para detectar o User-Agent do ELB.

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

Usuários normais que falsificam seu User-Agent não serão redirecionados.

Ou o endereço IP interno do ELB.

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

Para que esta opção funcione, você precisará mod_rpaf(no Apache 2.2) ou mod_remoteip(no Apache 2.4) modificar a REMOTE_ADDRvariável para conter a parte correta do conteúdo do X-Forwarded-Forcabeçalho. Desde que você o configure corretamente, não deve ser possível para um usuário normal evitar a resposta de redirecionamento.


O problema com a configuração de um vhost padrão é que o endereço IP muda sempre que uma nova instância é ativada ou reinicializada, e eu gostaria que minha AMI padrão incluísse suporte para a verificação de saúde. Vou dar uma olhada nas outras opções.
21413 chris

A verificação do endereço IP que incluí apenas verifica se o endereço IP começa com 10. . O restante das partes do endereço IP pode mudar o quanto quiserem e ainda serão correspondidas. O 10.*.*.*intervalo (ou 10.0.0.0/8) de endereços IP não é roteável pela Internet.
precisa saber é

Já estou usando o IP remoto para registrar o endereço IP dos solicitantes (em oposição ao ELB IP), portanto a terceira opção funcionou - obrigado!
chris

0

Adicionar hosts virtuais não é uma boa ideia, pois é necessário reiniciar o serviço httpd para que os hosts virtuais sejam refletidos. Existe uma maneira alternativa de fazer isso

  1. Ignore o caminho da verificação de integridade do ELB no arquivo .htaccess,
    separe todas as quatro partes do nome do DNS, como segue
    elb_dns_name: elb-name.subnet_zone.elb.amazonaws.com
  2. Para todos os URLs restantes, existem regras internas de reescrita
    directory_scructure: code_folder / website

    RewriteEngine On
    RewriteCond% {HTTP_HOST}! $ [NC]
    RewriteCond% {REQUEST_URI}! ^ / Index.php $
    RewriteRule ^ (. *) $ / $ 1 [L, QSA]

Isso funcionou muito bem para mim. Por favor, sugira se existem melhores métodos de saúde!

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.