server_name
由于某种原因,如果我在指令中设置裸 IP 地址,NGINX 将无法工作:
server {
listen 80;
server_name xx.xx.xxx.xx; # doesn't work
server {
listen 80;
server_name ec2-xx-xx-xxx-xx.ap-southeast-2.compute.amazonaws.com; # this works fine
为什么 NGINX 不接受 IP 地址?如何强制它接受 IP?
我与我的域名注册商(确切地说是 namecheap)一起使用动态 DNS,并且有一个“A”记录将我的公共域名映射到 AWS EC2 实例:
因此,当我转到时,example.com
我会被重定向到我的 EC2 实例应用程序。但是我看到的是默认的 NGINX 登录页面,而不是我的应用程序的登录页面。NGINX 不会将请求进一步代理到 Node.js。
答案1
您是否尝试过使用“example.com”代替 IP 地址?
至少对于 Apache 来说,server_name 字段的整个目的是允许从单个 IP 地址为多个网站(名称空间)提供服务。以下客户端“http://example.com“执行 DNS 查找并将请求发送到从 DNS 查找中获得的 IP 地址,但在请求中包含“example.com”,以便 Web 服务器(NGINX)可以确定该请求属于哪个网站。
答案2
如果您只配置了一个站点,那么您可以尝试在 nginx 配置中使用它:
server_name _ ;
它将强制server
接受所有 HTTP 请求,无论Host
标头是什么。
答案3
这个问题表明对 server_name 声明的目的存在误解。在服务器中,通常可以指定要创建侦听套接字的接口的 IP 地址。但是,对于 NGINX,使用 server_name 指令无法实现这一点。
要理解 server_name 指令,您需要了解 HTTP 协议的一部分。当您的 Web 浏览器向网站发出 HTTP 请求时,例如 Stack Overflowhttps://serverfault.com/questions触发您的 Web 浏览器在 DNS 中查找 serverfault.com 以获取 IP 地址 - 这就是您需要 DNS 条目的原因。
一旦你的网络浏览器获得了 IP 地址,它就会打开到该 IP 地址上的端口 80 的 TCP 连接。然后,网络浏览器需要告诉网络服务器正在请求哪个页面。它通过使用 HTTP 协议来实现这一点。请求的第一行将是:
获取/问题 HTTP/1.1
这会告诉服务器 URL 路径以及客户端用于通信的 HTTP 版本。
第二行是:
主机:serverfault.com
这称为 HTTP 标头,Host 标头会告诉 Web 服务器哪个网站需要处理请求。当服务器仅托管一个网站时,这可能感觉有点过头了。但通常情况下,Web 服务器会处理许多网站。
这与 nginx 指令 server_name 匹配。此指令告诉 nginx 仅当 Host 标头与此字符串匹配时才使用此 nginx 站点。
因此,回答您的问题,在 server_name 指令中设置 IP 地址是没有意义的。注册域名,然后创建 CNAME DNS 条目以引用 AWS 服务器 DNS 名称会更正常。启动替换服务器时,更新 CNAME 以指向新服务器的 DNS 名称。
专业网站将被置于弹性负载均衡器后面,然后维护一个恒定的 DNS 名称供您在 DNS 条目中引用。
答案4
我是 NGINX 的新手,但根据官方文档(https://nginx.org/en/docs/http/server_names.html)可以使用数字 IP 地址:
“如果有人使用 IP 地址而不是服务器名称发出请求,则“Host”请求标头字段将包含 IP 地址,并且可以使用 IP 地址作为服务器名称来处理该请求:
server {
listen 80;
server_name example.org
www.example.org
""
192.168.1.1
;
...
}
如果你能控制你的 IP 地址 DNS 记录,那么这样做是有意义的