Nginx配置中没有server_name会怎样?

Nginx配置中没有server_name会怎样?

答:此时Nginx会自动设置成 server_name ""; 它不会匹配任何域名,导致Nginx会优先将HTTP请求交给其它server处理。如果其它server不处理,则还是交给该server处理。

Nginx选用server的规则

参考官方文档,Nginx处理HTTP请求的流程如下:

  1. 当Nginx在某个端口收到一个HTTP请求时,会交给监听该端口的server处理。
  2. 如果监听该端口的server有多个,则取决于请求头的Host与哪个server的域名(server_name)匹配。
  3. 如果没有匹配的域名,或者请求头的Host是IP地址,则交给监听该端口的默认server处理。
  4. 选用了server之后,Nginx会寻找与HTTP请求的URL匹配的location,决定如何做出响应。

如果监听一个端口的server有多个,则最前面定义的那个是默认server。也可以手动指定:

	server {
	    listen       80  default_server;
	    ...
  • 例如,/etc/nginx/conf.d/default.conf中定义了一个监听80端口的server,它会返回Nginx的欢迎页面。如果用户不定义其它监听80端口的server,则它就会成为默认server,处理所有发到80端口的HTTP请求。

server_name有以下几种格式,排在前面的优先匹配:

server_name  www.test.com localhost;		# 匹配明确的域名(可以填多个,Nginx不会去验证DNS)
server_name  *.test.com;					# 以 *. 开头,模糊匹配
server_name  www.test.*;					# 以 .* 结尾
server_name  ~^(?<www>.+)\.test\.com$;		# 正则表达式
server_name  "";							# 空字符串,不会匹配任何域名

如果有两个server监听的端口和域名都相同,运行Nginx时就会报错:conflicting server name
同理,如果有两个server监听的端口相同,并且都没有设置server_name,运行Nginx也会报错:conflicting server name

测试验证

将 /etc/nginx/conf.d/default.conf 改为如下内容,然后启动Nginx。

server {
    listen       80;
    server_name  localhost;
    return 200 "This is 1\n";
}

server {
    listen       80;
    server_name  *.test.com;
    return 200 "This is 2\n";
}

server {
    listen       80 default_server;
    # server_name  "";
    return 200 "This is 3\n";
}

测试发送不同域名的HTTP请求到80端口:
在这里插入图片描述
curl 127.0.0.1:80
由于没有发送域名,所以Nginx会选用监听80端口的默认server,即第三个server。

curl localhost:80
匹配第一个server。

curl www.test.com:80
匹配第二个server。

  • 20
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 10
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值