背景
现客户在一台物理机上部署了多套系统,需要实现每套系统都有一个独立访问域名,不能带端口。之前的方案就是通过 context root
进行路由,比如 A 系统访问路径为 http://definesys.com/A
B 系统的访问路径为 http://definesys.com/B
,这样有两个问题
- 不能使用顶级域名访问,需要带上一个
context root
,对于系统的推广很不利,不容易记,也不美观。 - 有些系统前端资源访问采用绝对路径,这样路由就会出现资源找不到的问题,需要前端做调整,对于产品级系统,基本不现实。
以上的方案是基于 context root 做路由,如果能够基于 Host
做路由,就解决了以上问题,什么意思呢?访问 A 系统域名为 http://A.defiensys.com
,访问 B 系统的域名为http://B.definesys.com
, 后台代理通过 http 的 Host 字段进行路由。确定方案后,选择了 Nginx 作为反向代理服务器,下面介绍相关配置。
实现
配置上游服务器(upstream)
假设有两套系统,OA 和 HR,需要配置的访问域名分别为 http://oa.definesys.com
和 http://hr.definesys.com
,修改 nginx.conf
,增加以下配置项
upstream oa.definesys.com{server 192.168.1.10:8080;}
upstream hr.definesys.com{server 192.168.1.10:8081;}
这两个域名需要在 DNS 中配置好,本地可以修改 hosts 文件进行测试。
配置路由
修改 conf.d/default.conf
增加路由配置,当然你可以可以在 conf.d 目录下新建一个 *.conf 文件,nginx 会默认引用该目录下所有.conf 后缀的文件作为配置项。
location / {
proxy_pass http://$host;
index index.html index.htm;
}
$host
表示 http 头上的 Host 字段,只要保证上游服务器名称和访问的域名一致即可。