整套平臺(tái)采用Nginx的proxy_pass和DNS解析作為核心,即反向代理功能與域名解析功能,整體網(wǎng)絡(luò)拓?fù)淙鐖D1所示,其中服務(wù)器集群分布式部署在各縣區(qū)機(jī)房,防火墻與DNS服務(wù)統(tǒng)一放置在市級(jí)機(jī)房。
單位網(wǎng)內(nèi)擁有多臺(tái)互為備份的服務(wù)器,當(dāng)公網(wǎng)用戶訪問(wèn)網(wǎng)內(nèi)設(shè)備時(shí),通過(guò)兩臺(tái)暴露在公網(wǎng)環(huán)境的服務(wù)器與防火墻互備組合,利用反向代理提供負(fù)載均衡服務(wù)。網(wǎng)內(nèi)用戶訪問(wèn)公網(wǎng)設(shè)備時(shí),使用另外兩臺(tái)部署在公網(wǎng)NAT后面的服務(wù)器與防火墻互備組合,除了提供反向代理外,還設(shè)計(jì)了緩存機(jī)制,加快訪問(wèn)速度。
除了上述公網(wǎng)、內(nèi)網(wǎng)互訪機(jī)制,我們還部署了自己的DNS服務(wù),通過(guò)定向解析的方式加速服務(wù),即:我們平臺(tái)的全部域名,在公網(wǎng)上正常解析公網(wǎng)地址;內(nèi)網(wǎng)用戶使用我們自己的DNS服務(wù),訪問(wèn)其他域名時(shí)正常轉(zhuǎn)發(fā)公網(wǎng)地址,訪問(wèn)我們這些域名時(shí)直接解析內(nèi)網(wǎng)地址。
圖1 網(wǎng)絡(luò)結(jié)構(gòu)拓?fù)鋱D
平臺(tái)采用Centos6.8系統(tǒng),使用常規(guī)安裝的方法即可。兩塊系統(tǒng)磁盤使用RAID1部署,剩下的存儲(chǔ)磁盤使用RAID5部署;磁盤使用GPT分區(qū)方式,勿用MBR分區(qū);內(nèi)存為96GB,CPU使用E5-2650v3兩顆。
注意:centos在自動(dòng)分區(qū)時(shí),會(huì)自動(dòng)分配/,/boot、/boot/efi三個(gè)數(shù)百兆字節(jié)的分區(qū)和swap分區(qū),然后剩下的全部磁盤空間自動(dòng)分配給/home。
本平臺(tái)具有緩存功能,緩存文件存儲(chǔ)在/usr/local/nginx/proxy_cache/中,因此可以簡(jiǎn)單的將/home并入根目錄,或者修改分區(qū)方式,或者直接修改本文提供的源代碼。
表1 分區(qū)格式表
筆者分區(qū)格式如表1,供參考([root@LeniyTsan ~]#df-h,RAID5的大硬盤分區(qū)用來(lái)保存Nginx緩存)。
Centos服務(wù)器本身倉(cāng)庫(kù)中有編譯好的nginx,但是部署本平臺(tái)需要定制化,因此需要從源碼開始調(diào)試。
通過(guò).user.ini中聲明open_basedir等參數(shù)限制基本目錄層級(jí),并設(shè)置此文件為chmod 644和chattr +i屬性。
除了上述核心部分外,搭建Nginx服務(wù)還有很多細(xì)節(jié)需要調(diào)整。我編寫了一個(gè)自動(dòng)部署項(xiàng)目,已經(jīng)以Leniy Tsan為昵稱開源發(fā)布到了GitHub上,項(xiàng)目名為L(zhǎng)eniy/Install_Nginx,供參考。
完整的配置文件同樣開源了,需要注意的是緩存部分的配置:
當(dāng)內(nèi)網(wǎng)訪問(wèn)公網(wǎng)服務(wù)的時(shí)候,需要將一些大文件緩存,加快訪問(wèn)速度,因此我將名為content的緩存創(chuàng)建在了服務(wù)器的/usr/local/nginx/proxy_cache目錄中,即RAID5的六塊1.2TB SAS硬盤,并設(shè)計(jì)了二層緩存目錄,文件超過(guò)1年未使用自動(dòng)刪除,最大緩存空間5TB。
當(dāng)公網(wǎng)訪問(wèn)內(nèi)網(wǎng)時(shí),不使用緩存策略,單獨(dú)進(jìn)行負(fù)載均衡轉(zhuǎn)發(fā)。
智慧社區(qū)中有多種服務(wù)需要能夠在公網(wǎng)訪問(wèn),如黨員管理后臺(tái)、集群可用性監(jiān)控、用戶醫(yī)療檔案訪問(wèn)等業(yè)務(wù)。暴露在公網(wǎng)環(huán)境的服務(wù)器與防火墻互備組合,具有相同的配置,由DNS同域名多IP解析進(jìn)行負(fù)載均衡。服務(wù)器利用反向代理連接內(nèi)網(wǎng)中的各個(gè)雙機(jī)熱備系統(tǒng)進(jìn)行負(fù)載均衡。
以某個(gè)服務(wù)為例,某一臺(tái)公網(wǎng)服務(wù)器的nginx配置文件如下(為保證服務(wù)安全,這里寫的端口和IP僅為示例,不是本平臺(tái)的真實(shí)端口):
這個(gè)nginx配置文件,會(huì)將全部訪問(wèn)公網(wǎng)服務(wù)器9090端口的請(qǐng)求,輪詢的轉(zhuǎn)發(fā)到內(nèi)網(wǎng)100和200兩臺(tái)服務(wù)器的8080端口,并將這兩臺(tái)的響應(yīng)數(shù)據(jù)原路發(fā)回給用戶。
內(nèi)網(wǎng)訪問(wèn)公網(wǎng)的時(shí)候,為了加速,將相應(yīng)的大文件緩存在服務(wù)器中。
為了防止公網(wǎng)網(wǎng)站出現(xiàn)訪問(wèn)故障,整個(gè)網(wǎng)站默認(rèn)情況下僅僅轉(zhuǎn)發(fā)不緩存,配置文件與上述類似,不使用upstream負(fù)載均衡的方法,如下所示(每個(gè)配置文件中都有三個(gè)與上面相同的proxy_set_header參數(shù),為節(jié)省篇幅略過(guò)):對(duì)于幾乎很難更改的文件,則使用前文中定義的content緩存空間:
以本項(xiàng)目為例,需要加速數(shù)十個(gè)政府網(wǎng)站,如果每個(gè)域名寫一個(gè)配置文件,將會(huì)極大地加重維護(hù)成本,故而可以在配置文件中設(shè)置正則表達(dá)式批量匹配:
當(dāng)我在測(cè)試服務(wù)器上測(cè)試時(shí),發(fā)現(xiàn)服務(wù)器直接返回502錯(cuò)誤。經(jīng)過(guò)查詢?nèi)罩?,發(fā)現(xiàn)告警信息為:
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多了一個(gè)配置參數(shù),當(dāng)proxy_pass使用變量的時(shí)候,server name會(huì)首先到服務(wù)器組upstream中搜索,找不到的時(shí)候,會(huì)使用resolver解析而不是直接查詢域名的IP地址。
本項(xiàng)目的服務(wù)加速不使用upstream負(fù)載均衡,因此,直接設(shè)置resolver 114.114.114.114即 可,當(dāng)然,DNS的IP地址盡量使用本地ISP提供的服務(wù),解析速度相對(duì)于互聯(lián)網(wǎng)上的公共DNS較為迅速。
為了讓公網(wǎng)用戶正常訪問(wèn)業(yè)務(wù),我們?cè)谟蛎?cè)商的NS服務(wù)器中,為服務(wù)器集群配置了雙聯(lián)路,以portal-1域名為例:
> portal-1.leniy.org
服務(wù)器:public1.114dns.com
Address:114.114.114.114
非權(quán)威應(yīng)答:
名稱:portal-1.leniy.org
Addresses:1.1.1.1
1.1.1.2
當(dāng)用戶訪問(wèn)portal-1的時(shí)候,NS會(huì)輪詢的解析某一個(gè)公網(wǎng)地址,一旦某地址不可訪問(wèn),則僅僅解析另外一個(gè)地址。為了減少切換時(shí)間,同時(shí)考慮到服務(wù)器與電腦的DNS緩存,我將TTL設(shè)為了120。
2.Windows Server部署
第一部分概述中提到的三個(gè)目標(biāo)中,內(nèi)網(wǎng)加速與外網(wǎng)負(fù)載均衡第三部分已經(jīng)講到了,現(xiàn)在只需要讓內(nèi)網(wǎng)用戶直接訪問(wèn)內(nèi)網(wǎng)服務(wù)器即可。
用戶訪問(wèn)的業(yè)務(wù)全部通過(guò)域名提供服務(wù),如`portal-1.leniy.org A 1.1.1.1`表 示 將`portal-1`這個(gè)二級(jí)域名綁定了`1.1.1.1`這個(gè)公網(wǎng)地址,域名的NS服務(wù)發(fā)布在公網(wǎng)上,則公網(wǎng)上的用戶可以直接解析。
但是,為了防止內(nèi)網(wǎng)用戶解析出來(lái)公網(wǎng)地址,我們給用戶DHCP推送的DNS服務(wù)器是在內(nèi)網(wǎng)專門建立的。
DNS服務(wù)器使用Windows Server 2008 R2自帶的DNS服務(wù),直接添加正向查找zone區(qū)域,然后在里面添加需要解析的次級(jí)域名。
為了防止配置一個(gè)二級(jí)域名導(dǎo)致本域名下其他的三級(jí)域名無(wú)法轉(zhuǎn)發(fā)解析,我們可以將各個(gè)多級(jí)域名分別單獨(dú)添加為一個(gè)zone,然后解析其@地址即可。因?yàn)橛蛎啵彝瑯訉懥艘粋€(gè)腳本進(jìn)行批量添加,核心代碼為:
其中192.168.100.50即為前面提到的1.1.1.1這個(gè)公網(wǎng)地址的內(nèi)網(wǎng)地址。
本平臺(tái)的DNS需要讓全部用戶能夠自動(dòng)獲取到。我們使用BRAS進(jìn)行用戶身份認(rèn)證與IP池的分配,采用vbui用戶虛接口。
以平臺(tái)集群中我們某地市的分節(jié)點(diǎn)為例,在BRAS上創(chuàng)建名為zhihuishequ的地址 池 :ip-pool pool-name zhihuishequ pool-id 3,然后設(shè)置接入域accessdomain yzzhihui。 本 地址池可以直接DHCP獲取,不需要撥號(hào),因此不用配置VCC和AAA認(rèn)證,只需要設(shè)置member 1 startip 10.0.0.1 end-ip 10.255.255.254。
假設(shè)我們內(nèi)網(wǎng)的DNS服務(wù)器的內(nèi)網(wǎng)ip地址是192.168.100.60,則設(shè) 置pppoe-dns-server 192.168.100.60即可實(shí)現(xiàn)目標(biāo)。
本項(xiàng)目上線以來(lái),業(yè)務(wù)量快速增加,特別是服務(wù)器集群中存儲(chǔ)的數(shù)據(jù)量越來(lái)越大。截止投稿時(shí),平臺(tái)網(wǎng)內(nèi)流量已經(jīng)達(dá)到8Gbps,出口雙方向流量300Mbps。隨著本平臺(tái)的上線,網(wǎng)內(nèi)用戶直接走內(nèi)網(wǎng)線路,訪問(wèn)直連公網(wǎng)網(wǎng)站大文件走緩存,節(jié)省了約1Gbps的帶寬,外網(wǎng)用戶通過(guò)Portal訪問(wèn),降低了業(yè)務(wù)宕機(jī)的風(fēng)險(xiǎn)并加強(qiáng)了安全防護(hù)。對(duì)整個(gè)項(xiàng)目的提升效果顯著。