乐趣区

Nginx-按主机名Host路由配置

背景

现客户在一台物理机上部署了多套系统,需要实现每套系统都有一个独立访问域名,不能带端口。之前的方案就是通过 context root 进行路由,比如 A 系统访问路径为 http://definesys.com/A B 系统的访问路径为 http://definesys.com/B,这样有两个问题

  1. 不能使用顶级域名访问,需要带上一个context root,对于系统的推广很不利,不容易记,也不美观。
  2. 有些系统前端资源访问采用绝对路径,这样路由就会出现资源找不到的问题,需要前端做调整,对于产品级系统,基本不现实。

以上的方案是基于 context root 做路由,如果能够基于 Host 做路由,就解决了以上问题,什么意思呢?访问 A 系统域名为 http://A.defiensys.com,访问 B 系统的域名为http://B.definesys.com, 后台代理通过 http 的 Host 字段进行路由。确定方案后,选择了 Nginx 作为反向代理服务器,下面介绍相关配置。

实现

配置上游服务器(upstream)

假设有两套系统,OA 和 HR,需要配置的访问域名分别为 http://oa.definesys.comhttp://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 字段,只要保证上游服务器名称和访问的域名一致即可。

退出移动版