default_server 真的需要 server_name 吗?(Nginx)

default_server 真的需要 server_name 吗?(Nginx)

default_server我在 Nginx 中逐一尝试了下面 4 种代码,default.conf代码文件位于/etc/nginx/conf.d/default.conf

第一:使用server_name _;

server {
    listen 80 default_server;
    listen [::]:80 default_server;
    server_name _;

    return 500;
}

第二:使用不同的服务器名称(私有 IP)server_name 10.0.0.0;(我的电脑的私有 IP 是10.156.58.216

server {
    listen 80 default_server;
    listen [::]:80 default_server;
    server_name 10.0.0.0;
    
    return 500;
}

第三:使用server_name "";

server {
    listen 80 default_server;
    listen [::]:80 default_server;
    server_name "";

    return 500;
}

第四名:无server name

server {
    listen 80 default_server;
    listen [::]:80 default_server;

    return 500;
}

我的电脑的私有ip是10.156.58.216

在此处输入图片描述

然后,结果显示的都是同一个500 Internal Server Error页面。

在此处输入图片描述

我认为对于default server,我们不需要server name。因此,不带 的第 4 个代码server name可以使用。

第四种:没有服务器名称

server {
    listen 80 default_server;
    listen [::]:80 default_server;

    return 500;
}

我再次问,server name真的需要吗default server

答案1

Nginx 文档

如果服务器块中未定义 server_name,则 nginx 使用空名称作为服务器名称。

关于server_name _;,同一文件指出:

这个名字并没有什么特殊之处,它只是无数无效域名中的一个,永远不会与任何真实名称相交。

答案2

NGINX 唯一一次查看server_name指令和listen处理配置时的default_server参数是当有多个server块时listen位于同一个 [ ip_address:]上port。(还值得指出的是,default_server一个配置中可以有多个声明 - 每个 [ ip_address:]一个声明port。)

如果某个server块在活动配置中是独立的(即,没有其他server块在同一个端口上监听,例如 80),那么您的所有示例都可以省略

  • 参数default_server

    (因为它们默认是默认值 - 而且周围也没有其他server块来处理端口 80 上的请求)

  • 指令server_name

    (因为它们是端口 80 的唯一块server,所以 NGINX 甚至不会费心server_name与请求的Host标头进行比较:所有请求都会被定向到那里)

何时server_name需要与该指令一起使用default_server

一个例子是,当您需要一个捕获所有块来关闭其他块中未明确处理的任何连接时server

举一个具体的例子,这是一个 HTTP 到 HTTPS 的重定向:

##########################
# HTTP-to-HTTPS redirect #
##########################
server {
    listen 80;
    server_name ourdomain.com;

    return 301 https://$host$request_uri;
}

##########################
# HTTP-to-HTTPS redirect #
##########################
server {
    listen 80;
    server_name another.doma.in;

    return 301 https://$host$request_uri;
}

# ... more `server` blocks listening on port 80

#############
# CATCH-ALL #
#############
server {
   listen 80 default_server; 
   server_name _;

   return 404;
}

在这种情况下,catch-all 块一定有两个都:

  • server_name与任何有效域不匹配的声明

    当 NGINX 发现端口 80 有多个块时,它会将请求的Host字段与进行比较以server_name选择正确的一个。如果没有匹配,则请求将被路由到default_server。(请参阅NGINX 如何处理请求以及底部的流程图。)

    这个区块很重要不匹配任何内容因为它可以位于配置文件中的任何位置,因此它可能会意外地处理针对另一个请求的请求。(另外,重点是明确配置服务器将处理的域/ IP 地址,并拒绝其他所有内容。)

  • 一份listen ... default_server ...声明

    ip_address如果该 [ :]的 catch-all 块port是文件中的第一个,它将隐式成为其默认服务器。同样,它也可以位于配置中的任何位置,而且明确指定也无妨。

处理 NGINX 配置的流程图

相关内容