一、前景提要
最近在工作中遇到一个坑,之前配置了很多次nginx虚拟主机及多级代理,自以为对这块已经很了解了,但前几天在和京东做对接的时候,发现完全被整蒙圈了,配了多个虚拟主机,不知道默认走那个了,多加一个又会影响之前的,少加一个,新的接口又不生效,后来又分析了下,之所以会乱,也是因为调用方也是多样的,有直接IP的,有直接域名的,还有二级代理的,nginx虚拟主机对访问的地址有严格的匹配规则,好多人都说ip和域名不都是同一个机子吗,但对于nginx虚拟主机来说,IP和域名是两个不同的server。
二、真实环境简述
A1侧(调用方1)
A2侧(调用方2)
A3侧(调用方3)
B侧(中转侧,直接IP)
C侧(服务代理提供侧)
D侧(后端服务)
A1侧通过B转到C侧,再通过C侧调用D侧后端服务
A2侧访问C侧IP,再通过C侧调用D侧后端服务
A3侧访问C侧域名,再通过C侧调用D侧后端服务
三、虚拟主机配置注意事项
1、建议如果配置了include ,则nginx.conf 里不要在添加server,不然include 放在server前和server后也有影响;
2、如果之前已经在nginx.conf 里配置了server,后续要添加采用include添加server,时,include如果放在server前面:情况如下:
2.1 如果nginx.conf 里只有一个server,则只要访问的url能到达该nginx主机,都会走这个server匹配
2.2 如果nginx.conf里有多个server,如果url的host地址匹配该server_name 则走该server,如果不匹配,则走第一个server;
2.3 如果nginx.conf里include指定的vhosts目录里有****.conf,则会优先匹配该conf文件的server,如果vhosts有多个conf文件,则匹配不到的都默认走该vhosts目录下第一个文件,并且不会走nginx.conf文件里的server
3、如果之前已经在nginx.conf 里配置了server,后续要添加采用include添加server,时,include如果放在server之后:情况如下:
3.1 如果vhosts目录没有conf文件,则默认匹配nginx.conf 里的server,且第一个server为默认匹配
3.2 如果vhosts目录有conf文件,如果匹配到vhosts目录下的server ,则走该配置,如果匹配不到,则走nginx.conf里的第一个server
综上,如果采用include配置多虚拟主机,建议nginx.conf 文件里不要再配置server,统一配置到vhosts目录下去
4、二次跳转如何配置server
经多次实验,不管中间经过几次代理,最终的nginx匹配只认原始的url地址,如果目标nginx有该server则匹配,没有则走默认
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。