本节书摘来自异步社区《精通Nginx》一书中的第2章,第2.5节,作者: 【瑞士】Dimitri Aivaliotis 更多章节内容可以访问云栖社区“异步社区”公众号查看。
2.5 虚拟server部分
任何由关键字server开始的部分都被称作“虚拟服务器”部分。它描述的是一组根据server_name指令逻辑分割的资源,这些虚拟服务器响应Http请求,因此它们都包含在http部分中。
一个虚拟服务器由listen和server_name指令组合定义,listen指令定义了一个IP地址/端口组合或者是UNIX域套接字路径。
listen address[:port];
listen port;
listen unix:path;
如表2-6所示,listen指令唯一地标识了在Nginx下的套接字绑定,此外还有一些其他的可选参数。
server_name指令是相当简单的,但可以用来解决一些配置问题。它的默认值为"",这意味着server部分没有server_name指令,对于没有设置Host头字段的请求将会匹配该server处理。这种情况可用于,例如,丢弃这种缺乏Host头的请求。
server {
listen 80;
return 444;
}
在```
这个例子中使用的Http非标准代码444将会使得Nginx立即关闭一个连接。
除了普通的字符串之外,Nginx也接受通配符作为server_name的参数。
- 通配符可以替代部分子域名:*.example.com。
- 通配符可以替代顶级域部分:www.example.*。
- 一种特殊形式将匹配子域或域本身:
.example.com(匹配*.example.com也包括example.com)。
通过在域名前面加上波浪号(〜),正则表达式也可以被作为参数应用于server_name。
server_name~^www.example.com$;
server_name~^www(d+).example.(com)$;
后一种形式是利用捕获,可以在以后引用中进一步配置(用$1,$2等)指令中使用。
对于一个特定的请求,确定哪些虚拟服务器提供该请求的服务时,应该遵循下面的逻辑。
1.匹配IP地址和listen指令指定的端口。
2.将Host头字段作为一个字符串匹配server_name指令。
3.将Host头字段与server_name指令值字符串的开始部分做匹配。
4.将Host头字段与server_name指令值字符串的尾部分做匹配。
5.将Host头字段与server_name指令值进行正则表达式匹配。
6.如果所有Host头匹配失败,那么将会转向listen指令标记的default_server。
7.如果所有的Host头匹配失败,并且没有default_server,那么将会转向第一个server的listen指令,以满足第1步。
这个逻辑体现在下面的图2-1中。
<div style="text-align: center">
<img src="https://yqfile.alicdn.com/4e9da33c053c4e9b816a682adec144e5c001f231.png " >
</div>
default_server被用于处理其他方式没有处理的请求。因此推荐总是明确地设置default_server,以便这些没有被处理的请求通过这种定义的方式处理。