如何在 server_name 指令中设置 IP 地址,而不是域名?

Gre*_*een 3 nginx dynamic-dns

出于某种原因,如果我在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
Run Code Online (Sandbox Code Playgroud)

为什么NGINX不接受IP地址?如何强制它接受IP?

我将动态 DNS 与我的域名注册商(确切地说是 namecheap)一起使用,并且有一个“A”记录将我的公共域名映射到 AWS EC2 实例:

在此处输入图片说明

所以当我去example.com我被重定向到我的 EC2 实例应用程序。但是,我看到的是默认的 NGINX 登录页面,而不是我的应用的登录页面。NGINX 不会将请求进一步代理到 Node.js。

小智 6

您是否尝试过使用“example.com”而不是 IP 地址?

至少对于 Apache,server_name 字段的全部意义在于允许从单个 IP 地址提供多个网站(命名空间)。跟随“ http://example.com ”的客户端执行 DNS 查找并将请求发送到它从 DNS 查找中获得的 IP 地址,但在请求中包含“example.com”,以便 Web 服务器(NGINX ) 可以找出请求属于哪个网站。

  • 为什么 namecheap 审查您对 nginx 配置文件的更改? (3认同)

小智 5

如果您只配置了一个站点,那么您可以尝试在 nginx 配置中使用它:

server_name _ ;

if 将强制server接受所有 HTTP 请求,无论Host标头是什么。


Mic*_*haw 5

这个问题表明对 server_name 声明的目的的误解。服务器之间通常能够指定您希望创建侦听套接字的接口的 IP 地址。但是,对于 NGINX,使用 server_name 指令无法实现这一点。

要了解 server_name 指令,您需要了解部分 HTTP 协议。当您的 Web 浏览器向网站发出 HTTP 请求时,例如堆栈溢出https://serverfault.com/questions会触发您的 Web 浏览器在 DNS 中查找 serverfault.com 以获取 IP 地址 - 这就是为什么您需要一个DNS 条目。

一旦您的 Web 浏览器获得了 IP 地址,它就会在该 IP 地址上打开一个到端口 80 的 TCP 连接。然后,Web 浏览器需要告诉 Web 服务器正在请求哪个页面。它通过使用 HTTP 协议来做到这一点。请求的第一行将是:

获取/问题 HTTP/1.1

这会告诉服务器 URL 路径以及客户端用于通信的 HTTP 版本。

第二行是:

主机:serverfault.com

这称为 HTTP 标头,主机标头告诉网络服务器哪个网站需要处理请求。当服务器只托管一个网站时,这可能会让人觉得有点过分。但通常,网络服务器处理许多网站。

这与 nginx 指令 server_name 匹配。该指令告诉 nginx 仅在 Host 标头与此字符串匹配时才使用此 nginx 站点。

因此,要回答您的问题,在 server_name 指令中设置 IP 地址是没有意义的。注册一个域名,然后创建一个 CNAME DNS 条目来引用 AWS 服务器的 DNS 名称会更正常。当您启动替代服务器时,更新 CNAME 以指向新服务器的 DNS 名称。

一个专业的网站会被放置在一个弹性负载均衡器后面,然后它会维护一个恒定的 DNS 名称,供您参考您的 DNS 条目。