文/任世宗 李潤(rùn)知 張茜 王宗敏
基于Nginx的可擴(kuò)展負(fù)載均衡Web站點(diǎn)部署
文/任世宗 李潤(rùn)知 張茜 王宗敏
隨著網(wǎng)絡(luò)服務(wù)的日趨完善,我們?cè)讷@得方便的同時(shí),也面臨著巨大的挑戰(zhàn):并發(fā)業(yè)務(wù)訪問數(shù)量的直線增長(zhǎng),是網(wǎng)絡(luò)中的Web服務(wù)器工作能力的嚴(yán)峻考驗(yàn)。
采用多服務(wù)器集群技術(shù)是解決上述問題的有效方案,而負(fù)載均衡是集群技術(shù)的核心問題。負(fù)載均衡能夠?qū)⒋罅康牟l(fā)訪問請(qǐng)求合理地均分到集群內(nèi)的各服務(wù)器上進(jìn)行處理,有效地避免了單一服務(wù)器數(shù)據(jù)流過大的問題,同時(shí)能夠使各個(gè)服務(wù)器的資源得到均衡的使用。負(fù)載均衡包括硬件和軟件兩種類型,硬件的成本高昂,軟件的負(fù)載均衡配置部署靈活,越來越受到人們的親睞。
Nginx是中小企業(yè)軟件負(fù)載均衡的不錯(cuò)選擇。Nginx支持高并發(fā),官方測(cè)試可支持5萬的并發(fā)連接。進(jìn)程消耗內(nèi)存少,每個(gè)Nginx進(jìn)程僅消耗十幾兆的內(nèi)存。Nginx作為開源軟件,成本低廉。另外,Nginx配置文件簡(jiǎn)單,穩(wěn)定性高,且非常易于部署。但是Nginx也存在一些問題:它作為反向代理服務(wù)器時(shí),連接的后端物理Web應(yīng)用服務(wù)器(如Apache、IIS等)性能無法得到充分利用,不易于根據(jù)業(yè)務(wù)并發(fā)量動(dòng)態(tài)的調(diào)整后端服務(wù)器的數(shù)量,負(fù)載均衡的效果不是特別理想。
本文提出了用Nginx反向代理虛擬機(jī)的方式實(shí)現(xiàn)Web站點(diǎn)的負(fù)載均衡,既充分的利用了CPU、內(nèi)存等硬件資源,又滿足了高并發(fā)的需求,并且具有非常好的擴(kuò)展性。
如圖1所示,我們對(duì)服務(wù)A啟用A1、A2兩臺(tái)虛擬機(jī),部署到兩臺(tái)不同的物理機(jī)上,對(duì)服務(wù)B做類似的部署。這樣,既避免了由于物理機(jī)故障,導(dǎo)致服務(wù)中斷,又有效地利用了物理機(jī)的資源。
在采用此種架構(gòu)的基礎(chǔ)上,我們對(duì)Nginx的主配置文件nginx.conf進(jìn)行一些優(yōu)化:
user www www;
#只開啟一個(gè)進(jìn)程,節(jié)省內(nèi)存
work_processes 1;
error_log /usr/local/nginx/nginx_error.log crit;
pid /usr/local/nginx/nginx.pid;
work_rlimit_nofile51200;
events
{
use epoll;
work_connections 51200; }
http
{
include /user/local/nginx/mime.types; default_type application/octet-stream; #charset utf-8
server_names_hash_bucket_size 128; client_header_buffer_size 32k;
large_client_header_buffers 4 64k;
#指定 nginx 是否調(diào)用 sendfile 函數(shù)(zero copy 方式)來輸出文件,對(duì)于普通應(yīng)用,
必須設(shè)為 on,如果用來進(jìn)行下載等應(yīng)用磁盤
IO重負(fù)載應(yīng)用,可設(shè)置為 off,以平衡磁盤與網(wǎng)絡(luò)I/O處理速度,降低系統(tǒng)的uptime
sendfile on;
#tcp_nopush和tcp_nodely兩個(gè)指令設(shè)置為on,用于防止網(wǎng)絡(luò)阻塞
tcp_nopush on tcp_nodelay on; keepalive_timeout 65;
#對(duì)網(wǎng)頁(yè)文件、CSS、JS、XML等啟動(dòng)gzip壓縮,減少數(shù)據(jù)傳輸量,提高訪問速度。
gzip on;
gzip_min_length 1k; gzip_buffers 4 8k;
gzip_http_version 1.1; gzip_comp_level 3;
gzip_typestext/plain application/x-javascripts test/ css application/xml;
gzip_vary on;
#設(shè)定負(fù)載均衡服務(wù)器列表,采用ip hash的方式進(jìn)行負(fù)載均衡,使來自同一個(gè)ip的訪客固定訪問一個(gè)后端服務(wù)器,有效解決session共享問題。
upstream myserver {
ip_hash;
server 192.168.100.1∶80 weight=5 max_fails=2 fail_ timeout=30s;
server 192.168.100.2∶80 weight=5 max_fails=2 fail_ timeout=30s;
}
server
{
listen80;
server_namewww.youdomain.com;
root www/myserver
location/
{
proxy_next_upstream http_502 http_504 error timeout invalid_header;
proxy_pass http∶//myserver;
proxy_set_header Host www.youdomain.com;
proxy_set_header X-Forward-For $remote_addr; }
#將動(dòng)態(tài)的頁(yè)面交給后端的Web服務(wù)器群組處理。
location ~ .*.(php|jsp|cgi)?$
{
proxy_set_header Host www.youdomain.com;
proxy_set_header X-Forward-For $remote_addr; proxy_pass http∶//myserver;
#將動(dòng)靜頁(yè)面進(jìn)行分離,定義靜態(tài)資源由Nginx發(fā)布目錄讀取。
location ~ .*.(html|htm|gif|jpg|jpeg|bmp|png|ico|txt|j s|css)$
{
root /www/myserver;
# 圖片、靜態(tài)頁(yè)等不常更改,設(shè)置它們?cè)谟脩魹g覽器的本地緩存為3天,提高訪問速度
圖1 實(shí)現(xiàn)Web站點(diǎn)的負(fù)載均衡
expires 3d;
access_log /logs/www.youdomain.com_access.log; }足這種動(dòng)態(tài)的業(yè)務(wù)需求,隨時(shí)的增加、減少虛擬機(jī),非常方便。
1.利用Nginx進(jìn)行動(dòng)靜分離,充分發(fā)揮Nginx處理靜態(tài)頁(yè)的優(yōu)勢(shì),有效減輕后端虛擬機(jī)的負(fù)載。
2.通過ip hash實(shí)現(xiàn)后端虛擬機(jī)的負(fù)載均衡,保證來自同一ip的訪問請(qǐng)求定位在一個(gè)虛擬機(jī)上,有效解決session共享問題。
3.通過gzip壓縮、用戶瀏覽器緩存等的設(shè)置,節(jié)省帶寬,提高訪問速度。
4.傳統(tǒng)的IIS、Apache服務(wù)器等在并發(fā)連接高的時(shí)候,很容易崩潰。利用本文提出的架構(gòu)可以有效地將并發(fā)連接均分到多個(gè)虛擬機(jī),這樣每個(gè)虛擬機(jī)的并發(fā)連接數(shù)在相對(duì)較低的情況下,減小了崩潰的可能性。
5.軟件依賴于硬件,因此計(jì)算機(jī)硬件的更新速度始終快于軟件??紤]到IIS、Apache等的并發(fā)瓶頸問題,如果我們的服務(wù)器僅僅作為一個(gè)Web服務(wù)器的話,其性能很難得到充分的發(fā)揮,資源利用率并不高。采用虛擬機(jī)的方式可以充分的利用系統(tǒng)資源,借助于Nginx最為反向代理,在低成本投入的前提下,實(shí)現(xiàn)高并發(fā)、高性能的Web服務(wù)。
6.隨著企業(yè)業(yè)務(wù)的發(fā)展,用戶的數(shù)量可能會(huì)不斷增加;另外,某些企業(yè)也可能在不同的時(shí)間段內(nèi)有差別很大的訪問量。用Nginx反向代理虛擬機(jī)的形式可以很好的滿
工具介紹
本次測(cè)試采用的軟件是LoadRunner。
LoadRunner是一種適用于各種體系架構(gòu)的自動(dòng)化負(fù)載測(cè)試工具,它通過模擬大量實(shí)際用戶的操作行為,對(duì)被測(cè)試系統(tǒng)實(shí)施并發(fā)負(fù)載測(cè)試,同時(shí)對(duì)被測(cè)試的系統(tǒng)進(jìn)行實(shí)時(shí)的性能監(jiān)測(cè),并自動(dòng)整理生成測(cè)試結(jié)果,以便于找出性能的瓶頸。它主要由六部分組成:
1.虛擬用戶生成器(Vugen):追蹤業(yè)務(wù)和生成測(cè)試腳本
2.壓力生成器:模擬真實(shí)用戶產(chǎn)生負(fù)載。
3.用戶代理:調(diào)整整個(gè)虛擬用戶,使步調(diào)一致。
4.壓力調(diào)度:跟蹤用戶需求,改變虛擬用戶數(shù)量。
5.監(jiān)控系統(tǒng):監(jiān)控性能指標(biāo)。
6.測(cè)試結(jié)果分析器:生成各種分析圖表,用于分析瓶頸。
性能指標(biāo)
本次測(cè)試主要選取了并發(fā)用戶、響應(yīng)時(shí)間、系統(tǒng)資源利用率三個(gè)比較具有代表性的參數(shù)進(jìn)行記錄分析。
1.并發(fā)用戶
指所有用戶在同一時(shí)刻做同一事情或操作,這種操作一般針對(duì)通一類型的業(yè)務(wù);或者所有用戶進(jìn)行完全一樣的操作,目的是測(cè)試程序?qū)Σl(fā)操作的處理。
2.響應(yīng)時(shí)間
響應(yīng)時(shí)間是從用戶的角度分析的時(shí)間延遲,單位為毫秒或秒。作為最終用戶來說,評(píng)價(jià)系統(tǒng)性能的好壞只能根據(jù)感覺時(shí)間的快慢,他不關(guān)心并發(fā)訪問系統(tǒng)的人數(shù)等其他因素。Web應(yīng)用系統(tǒng)的性能,可以認(rèn)為是系統(tǒng)的平均響應(yīng)時(shí)間。通常情況下,系統(tǒng)負(fù)載能力越大,響應(yīng)時(shí)間越短。訪問的用戶數(shù)越大,響應(yīng)時(shí)間越長(zhǎng)。
3.資源利用率
資源利用率是只對(duì)不同系統(tǒng)資源的使用程度,是測(cè)試和分析瓶頸,改善系統(tǒng)性能的主要依據(jù)。
圖2
圖3
圖4
圖5
圖6
圖7
圖8
本次測(cè)試的對(duì)象是某高校的研究生院網(wǎng)站,它的邏輯并不復(fù)雜,但在每年的招生期間有很高的并發(fā)量。首先,單臺(tái)物理機(jī)下進(jìn)行測(cè)試;然后,搭建Nginx反向代理服務(wù)器,再次進(jìn)行測(cè)試;最后,對(duì)Nginx進(jìn)行優(yōu)化后的測(cè)試。
三次測(cè)試的過程中均錄制統(tǒng)一的腳本,設(shè)置初始用戶100,每次增加50的并發(fā)用戶。
1.單臺(tái)物理機(jī)搭建LLS服務(wù)器性能測(cè)試
測(cè)試環(huán)境:Xeon 4核處理器+4G內(nèi)存+Windows Server 2003+IIS6.0
測(cè)試分析:
(1)并發(fā)用戶
當(dāng)并發(fā)用戶到達(dá)200的時(shí)候開始出現(xiàn)錯(cuò)誤,隨著虛擬用戶的繼續(xù)增長(zhǎng),大部分訪問請(qǐng)求都不能pass,打開瀏覽器發(fā)現(xiàn)網(wǎng)站頁(yè)面打不開,如圖2所示。
(2)系統(tǒng)平均響應(yīng)時(shí)間
我們發(fā)現(xiàn)隨著并發(fā)訪問數(shù)量的增加,系統(tǒng)的響應(yīng)時(shí)間直線增長(zhǎng),系統(tǒng)的平均響應(yīng)時(shí)間很高,最高超過100秒,如圖3所示。
(3)系統(tǒng)資源
我們可以看到隨著虛擬用戶的增長(zhǎng),CPU資源的占用率沒有明顯增長(zhǎng)的趨勢(shì),內(nèi)存空閑資源僅稍有減少,如圖4所示。
通過對(duì)結(jié)果的分析,我們看到,LLS服務(wù)器在虛擬用戶數(shù)達(dá)到將近200的時(shí)候開始出錯(cuò),300的時(shí)候已經(jīng)崩潰,而系統(tǒng)的資源利用率實(shí)際上并不高。
2.利用Nginx反向代理虛擬機(jī)時(shí)的性能測(cè)試
測(cè)試環(huán)境:2臺(tái)單核2G的虛擬機(jī)(Windows Server 2003+IIS6.0)+雙核4G的Nginx物理機(jī)。
測(cè)試分析:
(1)并發(fā)用戶
當(dāng)并發(fā)用戶到達(dá)550的時(shí)候開始出現(xiàn)錯(cuò)誤,部分訪問請(qǐng)求不能pass,打開瀏覽器發(fā)現(xiàn)網(wǎng)站頁(yè)面打開極慢,如圖5所示。
(2)系統(tǒng)平均響應(yīng)時(shí)間
我們看到,使用Nginx進(jìn)行反向代理之后,系統(tǒng)的響應(yīng)時(shí)間有所降低,最高50秒左右,但是還是很高,可能與測(cè)試環(huán)境有關(guān),如圖6所示。
(3)系統(tǒng)資源
Loadrunner只能監(jiān)測(cè)到Nginx服務(wù)器的系統(tǒng)資源,我們?cè)跍y(cè)試的過程中通過登錄IIS服務(wù)器發(fā)現(xiàn)CPU資源利用率在平均約45%,內(nèi)存利用率平均約50%,都沒有隨并發(fā)連接數(shù)急劇增長(zhǎng)的現(xiàn)象。
通過對(duì)結(jié)果的分析,我們看到,通過Nginx反向代理IIS虛擬機(jī),有效的提升了網(wǎng)站并發(fā)訪問的負(fù)載能力,IIS虛擬機(jī)的資源利用率比單個(gè)物理機(jī)時(shí)更充分。
3.對(duì)Nginx進(jìn)行優(yōu)化后的性能測(cè)試
測(cè)試環(huán)境:2臺(tái)單核2G的虛擬機(jī)(Windows Server 2003+IIS6.0)+雙核4G的Nginx物理機(jī)(優(yōu)化后的)。
測(cè)試分析:
(1)并發(fā)用戶
我們發(fā)現(xiàn),經(jīng)過對(duì)Nginx的優(yōu)化,當(dāng)并發(fā)用戶到達(dá)650的時(shí)候才開始出現(xiàn)第一個(gè)錯(cuò)誤,隨著虛擬用戶的增加,錯(cuò)誤數(shù)量的增加不是太快,打開瀏覽器發(fā)現(xiàn)網(wǎng)站頁(yè)面還能打開,只是訪問速度慢,說明Nginx服務(wù)器和IIS服務(wù)器均沒有崩潰,如圖7所示。
(2)系統(tǒng)平均響應(yīng)時(shí)間
從圖表中我們看到,響應(yīng)時(shí)間和對(duì)Nginx進(jìn)行優(yōu)化前對(duì)比有顯著減少,平均在12秒左右,最高24秒,如圖8所示。
(3)系統(tǒng)資源
同樣通過直接登錄查看IIS虛擬機(jī)的系統(tǒng)資源,發(fā)現(xiàn)CPU利用率平均約45%,內(nèi)存利用率平均約50%,跟優(yōu)化前沒有明顯區(qū)別。
通過對(duì)結(jié)果的分析,我們看到,對(duì)Nginx的合理優(yōu)化有效的增加了并發(fā)訪問量,減少了系統(tǒng)響應(yīng)時(shí)間,進(jìn)一步提高了Web服務(wù)的性能,系統(tǒng)資源的利用率保持不變。
Nginx是一款不錯(cuò)的反向代理軟件,利用Nginx反向代理虛擬機(jī)的架構(gòu)可以有效避免IIS、Apache的并發(fā)瓶頸問題,并且增加了網(wǎng)站的可擴(kuò)展性。通過對(duì)高校網(wǎng)站的壓力測(cè)試,證實(shí)了Nginx反向代理虛擬機(jī)架構(gòu)的可用性,同時(shí)發(fā)現(xiàn)了網(wǎng)站的瓶頸所在??偟膩碚f,Web應(yīng)用的性能是受多方面影響的,不能一味去增加硬件設(shè)備,要通過實(shí)際的測(cè)試,找出瓶頸所在,多從優(yōu)化架構(gòu)、優(yōu)化參數(shù)配置入手,從而提高性能,提高Web服務(wù)的質(zhì)量。
(作者單位為鄭州大學(xué)信息網(wǎng)絡(luò)重點(diǎn)開放實(shí)驗(yàn)室)