我正在尝试从我的请求 URL 中删除 www,但是当我将以下内容添加到我的 nginx 配置中时,我的 AWS ELB 运行状况检查失败。
server {
listen 80;
server_name www.example.com;
return 301 $scheme://example.com$request_uri;
}
知道可能导致问题的原因吗?这是我的配置的其余部分:
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;
}
}
这是我的健康检查设置:
来自亚马逊文档:
这听起来像是 ELB 健康检查是通过 AWS 私有 IP 而不是域名进行的。据我对亚马逊的了解,这就是他们在可能的情况下更喜欢做事的方式(出于明显的性能原因,不需要 DNS 查找,可以由更近的路由器处理等)
如果是这种情况,那么主机标头(除非它是空白的,我不能 100% 确定当您向裸 IP 发出请求时主机标头是如何工作的)将是 EC2 实例的私有 AWS 地址(I' m 假设它是 EC2) 运行网络服务器。这会影响 Nginx 选择应由哪个虚拟服务器处理请求的方式。
由于 Nginx 有两个
server
块,它必须决定哪个块获得任何给定的请求。它选择服务器块的过程(详见此处)如下:首先,它查找正在侦听请求传入端口的服务器。在这种情况下,两台服务器都在侦听同一个端口,所以这没有任何帮助。
然后它查看请求的主机头,并寻找与
server_name
主机头匹配的服务器。在这种情况下,它们都不匹配,因为主机标头是分配给实例的私有 AWS IP(或空白,正如我所说,我不确定。)最后,如果这些都没有产生匹配,它只会与默认的服务器一起使用。在没有明确的默认声明的情况下,首先在站点配置中定义的服务器被选为默认值。
如果您的重定向服务器位于主服务器配置之前(正如我想象的那样),那么这可能是您的问题。您需要做以下三件事之一:
通过添加到指令中指定您希望其他服务器(主服务器)成为默认服务器,即
default_server
listen
listen 80 default_server;
将块切换
location /test
到另一个服务器块,或颠倒定义服务器块的顺序。
第一个选项似乎是要走的路,因为
default_server
指令显式而不是隐式是有意义的,主服务器是默认服务器而不是你有一个工作的重定向服务器是有意义的。如果我的假设是正确的,那应该可以解决。
我可以从 AWS ELB I/F 配置的经验中提出以下建议
参考: http:
//nginx.org/en/docs/http/ngx_http_core_module.html#server_name