出于某种原因,如果我在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?
我使用dynamicDNS与我的域名注册商(确切地说是namecheap),并有一个我有公共域名映射到AWS EC2实例的“A”logging:
所以,当我去到example.com我redirect到我的EC2实例应用程序。 不过,我看到的是一个默认的NGINXlogin页面,而不是我应用的login页面。 NGINX不会将请求进一步代理到Node.js。
你有没有尝试使用“example.com”,而不是IP地址?
至less在Apache中,server_name字段的全部内容是允许从一个IP地址提供多个网站(名称空间)。 跟随“ http://example.com ”的客户端执行DNS查找,并将请求发送到从DNS查找中获得的IP地址,但在请求中包含“example.com”,以便Web服务器(NGINX )可以找出请求所属的网站。
如果你只有一个站点configuration,那么你可以尝试在nginxconfiguration中使用这个:
server_name _ ;
如果强制server接受所有的HTTP请求,不pipeHost头是什么。
这个问题显示了对server_name声明目的的误解。 服务器之间通常能够指定您希望创build侦听套接字的接口的IP地址。 但是,使用NGINX,这不是使用server_name指令实现的。
要了解server_name指令,您需要了解部分HTTP协议。 当您的网页浏览器向网站发出HTTP请求时,例如堆栈溢出https://serverfault.com/questions会触发您的网页浏览器在DNS中查找serverfault.com以获取IP地址 – 这就是为什么您需要DNS条目。
一旦您的Web浏览器具有IP地址,它将打开一个到该IP地址的端口80的TCP连接。 networking浏览器然后需要告诉networking服务器正在请求哪个页面。 它通过使用HTTP协议来完成。 请求的第一行是:
GET /问题HTTP / 1.1
这告诉服务器URLpath,以及客户端用于通信的HTTP版本。
第二行是:
主机:serverfault.com
这被称为HTTP头,Host头告诉networking服务器哪个网站需要处理请求。 当一台服务器只托pipe一个网站时,这可能会感觉过度。 但通常,networking服务器处理许多网站。
这匹配到nginx指令server_name。 这个指令告诉nginx只有在Host标头匹配这个string时才使用这个nginx站点。
所以,要回答你的问题,在server_name指令中设置一个IP地址是没有意义的。 注册一个域名更为正常,然后创build一个CNAME DNS条目来引用AWS服务器的DNS名称。 启动replace服务器时,请更新CNAME以指向新服务器的DNS名称。
一个专业的网站将被放置在一个弹性负载平衡器的后面,然后保持一个恒定的DNS名称,供您参考您的DNS条目。