nginx – 怎么确定哪些虚拟服务主机提供请求服务的?

天企网络:网站搭建之网站安装步骤,安装前的准备工作
2017年11月29日
对比BAT免费主机 哪个比较好?
2017年12月1日

前言

在一个nginx上面可以配置多个虚拟主机,当nginx收到请求时,是怎么确定哪个虚拟主机为该请求提供服务呢?

nginx - 怎么确定哪些虚拟服务主机提供请求服务的?


nginx处理请求逻辑

  1. 匹配IP地址和listen指令指定的端口,匹配到IP和端口后,如果该IP和端口只有一个server就给该server处理,如果有多个server进行下一步的匹配。

  2. 将Host头字段跟server_name进行全匹配,哪个server的server_name匹配上就将请求发送给该server处理,如果没有匹配到就进行下一步匹配。

  3. server_name可以配置成通配符代替子域名,例如:*.test.com;到这一步nginx将Host头字段与server_name的值进行匹配,如果匹配到就转发给该server,如果没有匹配到进行下一步匹配。

  4. server_name可以配置成通配符代替部分顶级域名,例如:www.test.* ;到这一步nginx将Host头字段与server_name的值进行匹配,如果匹配到就转发给该server,如果没有匹配到进行下一步匹配。

  5. server_name可以配置成正则表达式,例如:server_name ~ ^www(\d+).test\.com$;到这一步nginx将Host头字段与server_name的值进行正则匹配,如果匹配到就转发给该server,如果没有匹配到进行下一步匹配。

  6. 如果上面所有server_name都匹配失败,那么将会转向listen指令标记的default_server,如果没有配置default_server,就转到下一步匹配。

  7. 上一步找不到default_server,请求就会被转到第一个server的listen指令。

下面是网络上找到的一张图(借用一下哈):

nginx - 怎么确定哪些虚拟服务主机提供请求服务的?


总结

如果有多个server的情况下,需要理清楚请求过程,不然很容易出现错误。

nginx - 怎么确定哪些虚拟服务主机提供请求服务的?

发表评论

电子邮件地址不会被公开。 必填项已用*标注