Nginx中server的匹配顺序

2022/05/20 framework 共 1684 字,约 5 分钟
Bob.Zhu

在开始处理一个http请求时,nginx会取出header头中的host,与 nginx.conf 中每个 server 的 server_name 进行匹配,以此决定到底由哪一个server块来处理这个请求。

匹配规则

server_name与host匹配优先级如下: 1、完全匹配 2、通配符在前的,如 *.test.com 3、在后的,如 www.test.* 4、正则匹配,如 ~^\.www\.test\.com$

如果都不匹配 1、优先选择 listen 配置项后有 defaultdefault_server 的 2、找到匹配 listen 端口的第一个 server

准备测试环境

安装nginx

使用的brew进行nginx的安装,因为需要使用echo指令,所以需要安装nginx-full才能使用相关模块:

brew tap denji/nginx
brew install nginx-full --with-echo-module
# 安装的时候需要使用编译工具,如果没指定需要指定
sudo xcode-select --switch /Applications/Xcode.app
# 启动
brew services restart denji/nginx/nginx-full

配置host记录

sudo vim /eth/hosts

增加解析:

127.0.0.1 server.1
127.0.0.1 server.2
127.0.0.1 test.1
127.0.0.1 test.2

测试host生效:

➜ ping server.1
PING server.1 (127.0.0.1): 56 data bytes
64 bytes from 127.0.0.1: icmp_seq=0 ttl=64 time=0.076 ms
64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.074 ms
……

最高优先级:完全匹配

配置文件

all-match-8081.conf

server {
    listen 8081;
    server_name *.1;
    location / {
        default_type text/html;
        echo "通配符在前";
    }
}
server {
    listen 8081;
    server_name server.1;
    location / {
        default_type text/html;
        echo "完全匹配";
    }
}

结果验证

$ curl http://server.1:8081
完全匹配
$  curl http://test.1:8081
通配符在前

listen配置项中default的影响

配置文件

default-8082.conf

server {
    listen 8082;
    server_name ~^\w+\.1$;
    location / {
        default_type text/html;
        echo "正则匹配";
    }
}
server {
    listen 8082;
    server_name xixi.xixi;
    location / {
        default_type text/html;
        echo "不匹配";
    }
}
server {
    listen 8082 default;
    server_name haha.haha;
    location / {
        default_type text/html;
        echo "不匹配 default";
    }
}

结果验证

$ curl http://server.1:8082
正则匹配
$ curl http://server.2:8082
不匹配 default

没有匹配成功,且没有default的情况

配置文件

no-default-8083.conf

server {
    listen 8083;
    server_name xixi.xixi;
    location / {
        default_type text/html;
        echo "不匹配,位置靠前";
    }
}
server {
    listen 8083;
    server_name haha.haha;
    location / {
        default_type text/html;
        echo "不匹配,位置靠后";
    }
}

结果验证

$ curl http://server.1:8083
不匹配,位置靠前

参考资料

文档信息

Search

    Table of Contents