智慧社区集成方案设计
2017-11-07
整套平台采用Nginx的proxy_pass和DNS解析作为核心,即反向代理功能与域名解析功能,整体网络拓扑如图1所示,其中服务器集群分布式部署在各县区机房,防火墙与DNS服务统一放置在市级机房。
单位网内拥有多台互为备份的服务器,当公网用户访问网内设备时,通过两台暴露在公网环境的服务器与防火墙互备组合,利用反向代理提供负载均衡服务。网内用户访问公网设备时,使用另外两台部署在公网NAT后面的服务器与防火墙互备组合,除了提供反向代理外,还设计了缓存机制,加快访问速度。
除了上述公网、内网互访机制,我们还部署了自己的DNS服务,通过定向解析的方式加速服务,即:我们平台的全部域名,在公网上正常解析公网地址;内网用户使用我们自己的DNS服务,访问其他域名时正常转发公网地址,访问我们这些域名时直接解析内网地址。
图1 网络结构拓扑图
Nginx配置
1.Linux系统部署
平台采用Centos6.8系统,使用常规安装的方法即可。两块系统磁盘使用RAID1部署,剩下的存储磁盘使用RAID5部署;磁盘使用GPT分区方式,勿用MBR分区;内存为96GB,CPU使用E5-2650v3两颗。
注意:centos在自动分区时,会自动分配/,/boot、/boot/efi三个数百兆字节的分区和swap分区,然后剩下的全部磁盘空间自动分配给/home。
本平台具有缓存功能,缓存文件存储在/usr/local/nginx/proxy_cache/中,因此可以简单的将/home并入根目录,或者修改分区方式,或者直接修改本文提供的源代码。
表1 分区格式表
笔者分区格式如表1,供参考([root@LeniyTsan ~]#df-h,RAID5的大硬盘分区用来保存Nginx缓存)。
2.服务搭建
Centos服务器本身仓库中有编译好的nginx,但是部署本平台需要定制化,因此需要从源码开始调试。
通过.user.ini中声明open_basedir等参数限制基本目录层级,并设置此文件为chmod 644和chattr +i属性。
除了上述核心部分外,搭建Nginx服务还有很多细节需要调整。我编写了一个自动部署项目,已经以Leniy Tsan为昵称开源发布到了GitHub上,项目名为Leniy/Install_Nginx,供参考。
3.配置文件
完整的配置文件同样开源了,需要注意的是缓存部分的配置:
当内网访问公网服务的时候,需要将一些大文件缓存,加快访问速度,因此我将名为content的缓存创建在了服务器的/usr/local/nginx/proxy_cache目录中,即RAID5的六块1.2TB SAS硬盘,并设计了二层缓存目录,文件超过1年未使用自动删除,最大缓存空间5TB。
当公网访问内网时,不使用缓存策略,单独进行负载均衡转发。
各服务配置
1.公网访问内网服务
智慧社区中有多种服务需要能够在公网访问,如党员管理后台、集群可用性监控、用户医疗档案访问等业务。暴露在公网环境的服务器与防火墙互备组合,具有相同的配置,由DNS同域名多IP解析进行负载均衡。服务器利用反向代理连接内网中的各个双机热备系统进行负载均衡。
以某个服务为例,某一台公网服务器的nginx配置文件如下(为保证服务安全,这里写的端口和IP仅为示例,不是本平台的真实端口):
这个nginx配置文件,会将全部访问公网服务器9090端口的请求,轮询的转发到内网100和200两台服务器的8080端口,并将这两台的响应数据原路发回给用户。
2.内网访问公网服务
内网访问公网的时候,为了加速,将相应的大文件缓存在服务器中。
为了防止公网网站出现访问故障,整个网站默认情况下仅仅转发不缓存,配置文件与上述类似,不使用upstream负载均衡的方法,如下所示(每个配置文件中都有三个与上面相同的proxy_set_header参数,为节省篇幅略过):对于几乎很难更改的文件,则使用前文中定义的content缓存空间:
3.正则表达式与resolver
以本项目为例,需要加速数十个政府网站,如果每个域名写一个配置文件,将会极大地加重维护成本,故而可以在配置文件中设置正则表达式批量匹配:
当我在测试服务器上测试时,发现服务器直接返回502错误。经过查询日志,发现告警信息为:
2016/05/17 20:45:52[error] 25452#17756:*6 no resolver defined toresolveleniy.org, client:127.0.0.1,server:leniy.org,request:"GET / HTTP/1.1",host:"leniy.org"
翻看官方document后得知,新版本的Nginx多了一个配置参数,当proxy_pass使用变量的时候,server name会首先到服务器组upstream中搜索,找不到的时候,会使用resolver解析而不是直接查询域名的IP地址。
本项目的服务加速不使用upstream负载均衡,因此,直接设置resolver 114.114.114.114即 可,当然,DNS的IP地址尽量使用本地ISP提供的服务,解析速度相对于互联网上的公共DNS较为迅速。
DNS服务器配置
1.公网DNS部署
为了让公网用户正常访问业务,我们在域名注册商的NS服务器中,为服务器集群配置了双联路,以portal-1域名为例:
> portal-1.leniy.org
服务器:public1.114dns.com
Address:114.114.114.114
非权威应答:
名称:portal-1.leniy.org
Addresses:1.1.1.1
1.1.1.2
当用户访问portal-1的时候,NS会轮询的解析某一个公网地址,一旦某地址不可访问,则仅仅解析另外一个地址。为了减少切换时间,同时考虑到服务器与电脑的DNS缓存,我将TTL设为了120。
2.Windows Server部署
第一部分概述中提到的三个目标中,内网加速与外网负载均衡第三部分已经讲到了,现在只需要让内网用户直接访问内网服务器即可。
用户访问的业务全部通过域名提供服务,如`portal-1.leniy.org A 1.1.1.1`表 示 将`portal-1`这个二级域名绑定了`1.1.1.1`这个公网地址,域名的NS服务发布在公网上,则公网上的用户可以直接解析。
但是,为了防止内网用户解析出来公网地址,我们给用户DHCP推送的DNS服务器是在内网专门建立的。
DNS服务器使用Windows Server 2008 R2自带的DNS服务,直接添加正向查找zone区域,然后在里面添加需要解析的次级域名。
为了防止配置一个二级域名导致本域名下其他的三级域名无法转发解析,我们可以将各个多级域名分别单独添加为一个zone,然后解析其@地址即可。因为域名太多,我同样写了一个脚本进行批量添加,核心代码为:
其中192.168.100.50即为前面提到的1.1.1.1这个公网地址的内网地址。
3.BRAS服务部署
本平台的DNS需要让全部用户能够自动获取到。我们使用BRAS进行用户身份认证与IP池的分配,采用vbui用户虚接口。
以平台集群中我们某地市的分节点为例,在BRAS上创建名为zhihuishequ的地址 池 :ip-pool pool-name zhihuishequ pool-id 3,然后设置接入域accessdomain yzzhihui。 本 地址池可以直接DHCP获取,不需要拨号,因此不用配置VCC和AAA认证,只需要设置member 1 startip 10.0.0.1 end-ip 10.255.255.254。
假设我们内网的DNS服务器的内网ip地址是192.168.100.60,则设 置pppoe-dns-server 192.168.100.60即可实现目标。
总结
本项目上线以来,业务量快速增加,特别是服务器集群中存储的数据量越来越大。截止投稿时,平台网内流量已经达到8Gbps,出口双方向流量300Mbps。随着本平台的上线,网内用户直接走内网线路,访问直连公网网站大文件走缓存,节省了约1Gbps的带宽,外网用户通过Portal访问,降低了业务宕机的风险并加强了安全防护。对整个项目的提升效果显著。