在一个nginx上面可以配置多个虚拟主机,当nginx收到请求时,是怎么确定哪个虚拟主机为该请求提供服务呢?
匹配IP地址和listen指令指定的端口,匹配到IP和端口后,如果该IP和端口只有一个server就给该server处理,如果有多个server进行下一步的匹配。
将Host头字段跟server_name进行全匹配,哪个server的server_name匹配上就将请求发送给该server处理,如果没有匹配到就进行下一步匹配。
server_name可以配置成通配符代替子域名,例如:*.test.com;到这一步nginx将Host头字段与server_name的值进行匹配,如果匹配到就转发给该server,如果没有匹配到进行下一步匹配。
server_name可以配置成通配符代替部分顶级域名,例如:www.test.* ;到这一步nginx将Host头字段与server_name的值进行匹配,如果匹配到就转发给该server,如果没有匹配到进行下一步匹配。
server_name可以配置成正则表达式,例如:server_name ~ ^www(\d+).test\.com$;到这一步nginx将Host头字段与server_name的值进行正则匹配,如果匹配到就转发给该server,如果没有匹配到进行下一步匹配。
如果上面所有server_name都匹配失败,那么将会转向listen指令标记的default_server,如果没有配置default_server,就转到下一步匹配。
上一步找不到default_server,请求就会被转到第一个server的listen指令。
下面是网络上找到的一张图(借用一下哈):
如果有多个server的情况下,需要理清楚请求过程,不然很容易出现错误。