¿Cómo debo configurar mi comprobación de estado de ELB cuando uso NameVirtualHosts y redirecciono a www?


8

Mi ELB sigue sacando mis instancias de servicio, porque la comprobación de estado de HTTP está fallando.

Tenemos un comodín DNS y redirigimos todo a 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]

Esto funciona bien para los navegadores reales, pero la comprobación de estado HTTP no funciona, presumiblemente porque está obteniendo un 302.

¿Es la mejor opción para usar una comprobación de estado de TCP o hay una manera de hacer que HTTP funcione?


Simplemente use una comprobación de estado de TCP hasta que AWS permita personalizar el encabezado del host enviado para la comprobación de estado. Incluso con una entrada predeterminada en su servidor web, en realidad no está verificando el estado de su aplicación, solo su servidor web, que es casi lo mismo que verificar si el puerto tcp está abierto.
Pykler

Respuestas:


11

Esta pregunta se hizo en los foros de AWS y la respuesta fue configurar un servidor virtual predeterminado que maneje el tráfico en la dirección IP y no realice ningún redireccionamiento. Esto significará que los usuarios normales que accedan a su dirección IP tampoco serán redirigidos.

Alternativamente, puede especificar la parte de ruta de la URL que desea que solicite el ELB e ignorar esa ruta agregando otro RewriteCond:

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

Los usuarios normales que lleguen a esa URL no serán redirigidos.

También podría usar la misma técnica para detectar el User-Agent del ELB.

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

Los usuarios normales que falsifiquen su User-Agent no serán redirigidos.

O la dirección IP interna del ELB.

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

Para que esta opción funcione, necesitará mod_rpaf(para Apache 2.2) o mod_remoteip(para Apache 2.4) modificar la REMOTE_ADDRvariable para que contenga la parte correcta del contenido del X-Forwarded-Forencabezado. Siempre que lo configure correctamente, un usuario normal no debería poder evitar la respuesta de redireccionamiento.


El problema con la configuración de un vhost predeterminado es que la dirección IP cambiará cada vez que se activa o reinicia una nueva instancia, y me gustaría que mi AMI predeterminada incluya soporte para la comprobación de estado. Examinaré las otras opciones.
Chris

La verificación de la dirección IP que incluí solo verifica que la dirección IP comience 10.. El resto de las partes de la dirección IP pueden cambiar todo lo que quieran y seguirán coincidiendo. El 10.*.*.*rango (o 10.0.0.0/8) de direcciones IP no se puede enrutar a través de Internet.
Ladadadada

Ya estoy usando la IP remota para registrar la dirección IP de los solicitantes (a diferencia de la IP ELB), por lo que la tercera opción funcionó, ¡gracias!
Chris

0

Agregar hosts virtuales no es una buena idea, ya que uno tiene que reiniciar el servicio httpd para que los hosts virtuales se reflejen. Hay una forma alternativa de hacer esto

  1. Ignore la ruta de comprobación de estado de ELB en el archivo .htaccess,
    separe las cuatro partes del nombre dns como sigue
    elb_dns_name: elb-name.subnet_zone.elb.amazonaws.com
  2. Para todas las URL restantes, tenga reglas internas de reescritura
    directorio_scructura: carpeta_código / sitio web

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

Esto funcionó muy bien para mí. Por favor sugiera si hay mejores métodos ¡salud!

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.