背景
现客户在一台物理机上部署了多套系统,需要实现每套系统都有一个独立访问域名,不能带端口。之前的方案就是通过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字段,只要保证上游服务器名称和访问的域名一致即可。