背景
nginx是个强大的开源项目,它既能作为一个web服务器,又能做一个反向代理服务器,今天主要说一下nginx做反向代理,反向代理常用来做网络安全,负载均衡等。其中server_name是nginx反向代理的重要字段,因为nginx通过server_name字段来和http请求中的host字段做匹配,进而将不同的请求转发到后台不同的服务器,实现反向代理的功能。
示例demo
我这里只举两个nginx配置例子,如下:
server {
listen 80;
location / {
proxy_pass http://192.168.20.142;
}
}
---------------------------------------------------------------------
server {
listen 80;
location / {
proxy_pass http://192.168.20.141;
}
}
---------------------------------------------------------------------
server_name 匹配优先级
优先级从1到5,优先级从高到低
1、精确匹配:server_name后面的字段是完整的域名或ip
server {
proxy_pass http://192.168.20.142;
}
2、最长通配符前缀匹配
server {
server_name *.test.com;
proxy_pass http://192.168.20.142;
}
3、最长通配符后缀匹配
server {
server_name www.test.*;
proxy_pass http://192.168.20.142;
}
4、正则匹配
server {
server_name ~^(www\.)?(.+)$;
proxy_pass http://192.168.20.122;
}
5、匹配所有host字段
server {
server_name _;
proxy_pass http://192.156.20.1;
}
代码实现
优先级代码实现如下:
1、前三种优先级的代码实现如下
具体实现在ngx_hash_find_combined里
2、正则匹配代码实现如下
每个server_name都有一个srv_conf与他们绑定,如上面,将正则匹配的结果sn[i].server赋值给cscfp。
3、ngx_hash_find_combined代码实现如下
1》精准匹配代码实现如下
2》最长通配符前缀匹配代码实现如下
3》最长通配符后缀匹配代码实现如下
另外,server_name后面可以加多个域名或ip,,如果配置里没有server_name字段,则表明server_name "" ,后面是个空字符串;server_name与default_server字段有关,以后有时间再分享。
各位,晚安~
领取专属 10元无门槛券
私享最新 技术干货