我正在尝试从我的请求URL中删除www,但是当我将以下内容添加到我的nginxconfiguration时,我的AWS ELB运行状况检查失败。
server { listen 80; server_name www.example.com; return 301 $scheme://example.com$request_uri; }
任何想法可能会导致这个问题? 这是我的configuration的其余部分:
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; } }
这是我的健康检查设置:
来自亚马逊的文档 :
要确保您的负载均衡器可以正确扩展,请确认您的负载均衡器的每个子网都具有至less具有/ 27位掩码(例如10.0.0.0/27)且至less有8个空闲IP地址的CIDR块。 您的负载均衡器使用这些IP地址与实例build立连接。
这听起来像ELB运行状况检查是通过AWS私有IP而不是域名进行的。 从我所了解的亚马逊,这是他们喜欢做的事情,当他们可以(由于明显的性能原因,不需要DNS查找,可以处理更近的路由器等)
如果是这样的话,那么主机头(除非它是空白的,我不能100%确定主机头如何向裸IP发送请求时工作)将成为EC2实例的私有AWS地址(I'假设它是EC2)运行networking服务器。 这会影响Nginxselect虚拟服务器处理请求的方式。
由于Nginx有两个server块,它必须决定哪一个获得任何请求。 它select服务器块的过程(细节在这里 )如下:
首先它会寻找监听请求所在端口的服务器。在这种情况下,两台服务器都在同一个端口上监听,所以这没有任何帮助。
然后,它查看请求的主机头,并查找与主机头相匹配的server_name服务器。 在这种情况下,它们都不匹配,因为主机头是分配给实例的私有AWS IP(或空白,因为我说我不确定)。
最后,如果这两者都不匹配,则只要使用默认的服务器即可。 在没有明确的默认声明的情况下, 首先在站点configuration中定义的服务器被select为默认值。
如果你的redirect服务器在主服务器configuration之前(我会想象它),那么这可能是你的问题。 你需要做三件事情之一:
通过将default_server添加到listen指令,指定您希望将其他服务器(主服务器)作为默认服务器,即listen 80 default_server;
将location /test块切换到另一个服务器块,或
颠倒服务器块的定义顺序。
第一个选项似乎是要走的路,因为default_server指令是明确的而不是隐式的,而且主服务器是默认的,而不是你一个工作的redirect服务器是合理的。
如果我的假设是正确的,那就应该解决它。
我可以从AWS ELB I / Fconfiguration的经验中提出以下build议
参考:
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; } }