Nginx“默认”服务器?

Nginx“默认”服务器?

我有一个启用了多个服务器块的 Nginx。每个服务器响应 1 个规范域,并可能将 1 个或多个转发到该规范 URL。我至少有一台服务器(尚未检查所有服务器),如果我输入指向此框的不存在的域,Nginx 会显示它选择的站点(始终是同一个站点,但不是我想要的站点)。

我查看了我经常访问的网站的配置文件,但没有发现任何东西明显的这会将其标识为任何类型的默认站点,但它就在那里,当我错误地输入 URL 时总是会显示出来。

有什么想法我应该寻找什么来追踪这一点?

答案1

在您想要作为默认设置的指令中添加default_serverlisten指令。server

答案2

nginx 为什么这样做?

原因很简单。非常老旧或损坏的客户端不会Host在其请求中发送 HTTP 标头字段,如果您使用基于名称的服务器块(Apache 术语中称为基于名称的虚拟主机),nginx 无法确定您配置的哪个服务器是客户端所指的。对于支持此基于名称的系统的任何其他 Web 服务器,也存在同样的问题。如果您对每个域使用基于 IP 的系统(这也意味着您有多个网络接口),则不会出现此问题。

关于此主题还有更多内容吗?nginx 如何处理请求


哪一个是第一个?

如果任何指令default上未设置标志,则 nginx 将选择首先到达的服务器:listen

server {
  server_name server1.com;
}

server {
  server_name server2.com;
}

server1.com将是默认的。

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


我该怎么做才能防止这种情况发生?

好问题,你应该避免这种情况。没有理由支持这些旧客户端,也绝对没有理由支持损坏的客户端。通过创建一个默认的捕获所有服务器配置,可以轻松解决此问题。以下示例来自我的一个项目,针对当前开发版本的 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;
}

配置经过精简,更多 nginx 配置内容

相关内容