Nginx的“默认”服务器?

我有一个Nginx与一些启用服务器块。 每个服务器都回答1个规范域,并可能向该规范URL转发1个或更多。 我有至less一个服务器(还没有检查所有),如果我input一个不存在的域指向这个盒子,Nginx显示一个它select的网站(总是同一个网站,但不是一个我后)。

我已经为我经常登陆的站点的configuration文件捅了一圈,但没有看到任何明显的东西,将其标识为任何types的默认站点,但它仍然存在,当我手指指向一个URL时总是显示出来。

有什么想法,我应该寻找什么追踪这个?

default_server添加到要作为默认server中的listen指令。

为什么nginx这样做?

这样做的原因是简单的。 非常旧的或破损的客户端不会在其请求中发送Host HTTP头字段,并且如果您使用的是基于名称的服务器块(基于名称的虚拟主机,按照Apache的说法),nginx无法确定您configuration的服务器是由客户。 任何其他支持这个基于名字的系统的networking服务器也是如此。 如果您要为每个域使用基于IP的系统(这也意味着您有多个networking接口),则不会出现此问题。

更多关于这个话题? nginx如何处理请求


哪一个是第一个?

如果在任何listen指令中没有default标志,nginx将select第一个来的服务器:

 server { server_name server1.com; } server { server_name server2.com; } 

server1.com将是默认的。

如果自动包含sites-enabled的符号链接(默认configuration),则该目录中第一个文件将成为您的第一个服务器。


我能做些什么来防止这种情况?

好问题,你应该防止它。 没有理由支持这些老客户,绝对没有理由支持破碎的客户。 这个问题很容易通过创build一个默认的catch all server config来解决。 以下示例来自我的一个项目,面向当前的nginx开发版本(1.5.2,但也适用于旧版本):

 # /etc/nginx/sites-enabled/_.conf # Default server for clients who do not send correct Host header. # The underline in the file name makes sure that this file comes first in the dir. server { server_name _; listen *:80 default_server deferred; return 444; } 

configuration被修剪, 更多的nginxconfiguration的东西 。