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
是文件中的第一个,它将隐式成为其默认服务器。同样,它也可以位于配置中的任何位置,而且明确指定也无妨。