server_name _;
: 这里指定的不是什么特别的名字,它表示的是一个无效的域名。
假设配置是这样的
nginx.conf
http
{
include vhost/*.conf;
}
/usr/local/nginx/conf/vhost/ 目录下包含3个conf:
a.conf
server
{
listen 80;
server_name a.com;
}
b.conf
server
{
listen 80;
server_name _;
}
c.conf
server
{
listen 8082;
server_name c.com;
return 301 http://c.com$request_uri;
}
如上配置
注意 :
nginx 批量载入配置 conf 时会按 ascii 排序载入,这就会以 a.conf b.conf c.conf 的顺序载入,如果没有声明 default_server 的话,那 a 会作为默认的 server 去处理 未绑定域名/ip 的请求。
nginx中有3个server_name,生效顺序如下:
a.com
_
c.com
若访问 http://127.0.0.1
, 实际加载的是 a.com
的内容 。 在请求的Host没有命中其他规则且没有指定 default_server
的情况下,比较的是 server 的加载顺序,而不是去找 _
;这个要注意下,之前我一直以为 127.0.0.1 指向的是 _
,其实 _
并不是指向有意义的域名。对于要想监听ip访问的可以将 server_name 直接写为具体ip。
很多人复制粘贴广泛传播 server_name
要设为 _
,其实一毛钱的关系也没有。_
只是作为一个和业务域名无关的请求回收服务而已,如果我们线上的业务都是明确的业务域名访问,那泛解析造成的一些非业务域名或ip访问都会被这个 server 回收处理。 _
并不是重点 __
可以 ___
、&、@只要表示无效域名都可以。
若nginx 配置有 default_server
,访问服务器对应ip127.0.0.1
在一个请求的Host没有命中其他规则的情况下,无论_
在第几位加载都是指向的_
。应该说是指向的 default_server
server{
listen 80 default_server;
server_name _;
access_log off;
return 301 https://www.test.com$request_uri;
}
nginx 的 default_server 指令可以定义默认的 server 去处理一些没有匹配到 server_name 的请求,如果没有显式定义,则会选取第一个定义的 server 作为 default_server。
一般情况下 _
都是和 default_server
配合使用来设置默认server。当一个请求的Host没有命中其他规则时,会采用默认server的配置。若没有配置 default_server,则使用第一个加载的 server 做为默认配置。