Server的匹配逻辑
Nginx在决定请求由哪个server块执行时,主要关注的是server块中的listen和server_name两个字段
listen指令
listen字段定义server响应的ip和端口,如果没有明确配置listen字段,默认监听0.0.0.0:80(root)或者0.0.0.0:8080(非root)
listen可以被配置为:
- 一个ip和端口的组合
- 一个单独的ip,默认监听80端口
- 一个单独的端口,默认监听所有的ip接口
- 一个Unix socket路径
其中最后一项通常只用于在不同的server之间传递请求
选择要使用的server的规则如下:
- Nginx首先将所有"不完整"的listen指令进行转换,比如没有listen字段的转换为listen 0.0.0.0:80,listen 1.1.1.1转换为listen 1.1.1.1:80等
- Nginx根据请求的ip和端口创建一个与请求最匹配的server块列表,优先匹配指定了特定ip的server块,其次才会选择listen 0.0.0.0的这种server块.但是无论是哪种情况,端口必须是完全匹配的
- 如果只有一个最佳匹配,那么将使用匹配的server块响应请求,否则开始评估每一个server块的server_name指令
再次强调一遍,只有当listen指令无法找到最佳匹配时才会考虑评估server_name指令.
比如,我们假设example.com域名指向了192.168.0.1,且位于192.168.0.1上的nginx有且仅有如下两个server块:
# server block 1server { listen 192.168.0.1; server_name other.com ...}# server block 2server { listen 80; server_name example.com ...}
评论列表()