使用NameVirtualHosts并重定向到www时,应如何配置ELB运行状况检查?


8

我的ELB继续使我的实例停止服务,因为HTTP运行状况检查失败。

我们有一个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正常工作?


只需使用TCP运行状况检查,直到AWS允许自定义为运行状况检查发送的主机标头即可。即使您的网络服务器上有默认条目,您实际上并没有在检查应用程序的运行状况,而只是在检查网络服务器,这与检查tcp端口是否打开几乎相同。
皮克勒2015年

Answers:


11

在AWS论坛上已经过这个问题,答案是设置一个默认虚拟主机,该虚拟主机处理裸IP地址上的流量并且不执行任何重定向。这意味着打您IP地址的普通用户也不会被重定向。

您也可以通过添加另一个RewriteCond,指定希望ELB请求的URL的路径部分,并忽略该路径:

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标头内容的正确部分。只要正确设置,普通用户就不可能避免重定向响应。


设置默认虚拟主机的问题在于,每次启动或重新启动新实例时,IP地址都会更改,我希望我的默认AMI包括对运行状况检查的支持。我将研究其他选项。
克里斯

我包括的IP地址检查仅检查IP地址是否以开头10.。IP地址的其余部分可以根据需要进行任意更改,并且仍将匹配。该10.*.*.*IP地址(或10.0.0.0/8)范围内不通过互联网路由。
Ladadadada

我已经在使用远程IP记录请求者的IP地址(而不是ELB IP),因此第三个选项有效-谢谢!
克里斯

0

添加虚拟主机不是一个好主意,因为必须重新启动httpd服务才能反映虚拟主机。有另一种方法可以做到这一点

  1. 忽略.htaccess文件中的ELB运行状况检查路径
    ,将dns名称的所有四个部分分开,如下所示
    :elb_dns_name:elb-name.subnet_zone.elb.amazonaws.com
  2. 对于所有其余URL,都有内部重写规则
    directory_scructure:code_folder / website

    RewriteEngine叙述论
    的RewriteCond%{HTTP_HOST}!$ [NC]
    的RewriteCond%{REQUEST_URI}!^ / index.php的$
    重写规则^(。*)$ / $ 1 [L,QSA]

这对我来说非常有效。请建议是否有更好的方法助威!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.