杜冬梅+許彩欣+張磊
摘要:日益增長(zhǎng)的用戶訪問(wèn)對(duì)企業(yè)Web應(yīng)用系統(tǒng)提出來(lái)越來(lái)越嚴(yán)重的挑戰(zhàn),Web服務(wù)器端保持應(yīng)對(duì)高并發(fā)訪問(wèn)的能力,必須使用多臺(tái)服務(wù)器進(jìn)行負(fù)載均衡。Nginx可以在低內(nèi)存消耗的前提下實(shí)現(xiàn)高并發(fā)連接訪問(wèn),并具有很高的可靠性。近年來(lái),Nginx服務(wù)器作為反向代理服務(wù)器在網(wǎng)絡(luò)接入層應(yīng)用比較廣泛,使用nginx進(jìn)行應(yīng)用服務(wù)器負(fù)載均衡,根據(jù)配置將用戶的請(qǐng)求轉(zhuǎn)發(fā)到后端的服務(wù)器集群是nginx的主要功能。該文闡述了nginx與memcache工作原理,提出了基于nginx的web應(yīng)用系統(tǒng)負(fù)載均衡實(shí)現(xiàn)方案,并進(jìn)行了具體實(shí)現(xiàn)。
關(guān)鍵詞:負(fù)載均衡;nginx;memcached
中圖分類號(hào):TP334.8 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1009-3044(2017)06-0096-03
Abstract: With the growing visit user, web application system is faced with more and more challenges, to maintain the web servers high woking ability, we must use multiple servers for load balancing. Nginx can achieve high parallel and unfailing access under the low memory .As a reverse proxy ,the Nginx sever is widely used in recent years. Bulid the load balance application server using nginx is the main function of nginx. This paper expounds the operational principle of nginx and memcache, puts forward and implementation the load balancing on Web application system based on nginx.
Key words: load balance; nginx; memcached
1 Nginx負(fù)載均衡
Nginx是一款高性能的HTTP服務(wù)器和反向代理服務(wù)器開源框架,能夠很好地解決應(yīng)用程序高連接并發(fā)問(wèn)題,可在內(nèi)存和CPU占用資源較低的情況下,同時(shí)支持高達(dá)5萬(wàn)個(gè)并發(fā)連接數(shù)的快速響應(yīng)。在服務(wù)器和帶寬受限的情況下,利用Nginx會(huì)加大服務(wù)器的吞吐量,大大提高應(yīng)用系統(tǒng)的運(yùn)行效率,減低因數(shù)據(jù)擁堵造成的連接延遲或等待現(xiàn)象。
Nginx反向代理是解決公網(wǎng)IPv4資源緊缺條件下對(duì)外發(fā)布多個(gè)Web應(yīng)用的常用方法[2]。Nginx采用的是反向代理技術(shù)。代理服務(wù)器來(lái)接受internet上的連接請(qǐng)求,然后將請(qǐng)求轉(zhuǎn)發(fā)給內(nèi)部網(wǎng)絡(luò)上的服務(wù)器,并將從服務(wù)器上得到的結(jié)果返回給internet上請(qǐng)求連接的客戶端,此時(shí)代理服務(wù)器對(duì)外就表現(xiàn)為一個(gè)服務(wù)器。反向代理負(fù)載均衡技術(shù)是把將來(lái)自internet上的連接請(qǐng)求以反向代理的方式動(dòng)態(tài)地轉(zhuǎn)發(fā)給內(nèi)部網(wǎng)絡(luò)上的多臺(tái)服務(wù)器進(jìn)行處理[3],從而達(dá)到負(fù)載均衡的目的。
Nginx的特點(diǎn)使得其應(yīng)用越來(lái)越廣[1]。新浪、網(wǎng)易等門戶類網(wǎng)站,淘寶、好樂(lè)買等電子商務(wù)類網(wǎng)站,新浪博客、網(wǎng)易博客、搜狐博客等博客類網(wǎng)站,支付寶、手機(jī)支付等支付類網(wǎng)站,均在使用。面對(duì)巨大的訪問(wèn)量,Nginx運(yùn)行穩(wěn)定,正常。
2 memcached實(shí)現(xiàn)tomcat的Session共享
對(duì)于廣大java開發(fā)者而已,對(duì)于J2EE規(guī)范中的Session應(yīng)該并不陌生,我們可以使用Session管理用戶的會(huì)話信息,最常見的就是拿Session用來(lái)存放用戶登錄、身份、權(quán)限及狀態(tài)等信息。對(duì)于使用Tomcat作為Web容器的大部分開發(fā)人員而言,Tomcat是如何實(shí)現(xiàn)Session標(biāo)記用戶和管理Session信息的呢
利用memcached-session-manager開源tomcat插件改變tomcat原始的session存儲(chǔ)機(jī)制,將session的存儲(chǔ)放到分布式緩存memcache中,從而實(shí)現(xiàn)對(duì)session的共享
MSM(memcached-session-manager) 支持tomcat6 和tomcat7 ,利用 Value(Tomcat 閥)對(duì)Request進(jìn)行跟蹤。Request請(qǐng)求到來(lái)時(shí),從memcached加載session,Request請(qǐng)求結(jié)束時(shí),將tomcat session更新至memcached,以達(dá)到session共享之目的, 支持 sticky 和 non-sticky 模式。
memcached當(dāng)初是Danga Interactive為了LiveJournal所發(fā)展的,但被許多軟件(如MediaWiki)所使用。Memcached 是一個(gè)高性能的分布式內(nèi)存對(duì)象緩存系統(tǒng),用于動(dòng)態(tài)Web應(yīng)用以減輕數(shù)據(jù)庫(kù)負(fù)載。它通過(guò)在內(nèi)存中緩存數(shù)據(jù)和對(duì)象來(lái)減少讀取數(shù)據(jù)庫(kù)的次數(shù),從而提高動(dòng)態(tài)、數(shù)據(jù)庫(kù)驅(qū)動(dòng)網(wǎng)站的速度。memcached基于一個(gè)存儲(chǔ)鍵/值對(duì)的hashmap。
memcached支持tomcat6和tomcat7 ,Request請(qǐng)求到來(lái)時(shí),從memcached加載session,Request請(qǐng)求結(jié)束時(shí),將tomcat session更新至memcached,以達(dá)到session共享的目的。
3 基于Nginx的應(yīng)用系統(tǒng)模型設(shè)計(jì)
3.1 遠(yuǎn)程教育培訓(xùn)系統(tǒng)
遠(yuǎn)程教育培訓(xùn)系統(tǒng)包含多個(gè)子系統(tǒng):統(tǒng)一認(rèn)證、遠(yuǎn)程教育、職業(yè)鑒定、考試競(jìng)賽、調(diào)查問(wèn)卷、內(nèi)容管理、資源管理等。按照規(guī)劃,各子系統(tǒng)需要部署在三臺(tái)應(yīng)用服務(wù)器上,進(jìn)行負(fù)載均衡。但是如果每個(gè)應(yīng)用使用獨(dú)立服務(wù)器,受到外網(wǎng)ip地址資源有限的限制,同時(shí),獨(dú)立使用服務(wù)器不能更好地使用服務(wù)器資源,造成資源浪費(fèi)。
在不適用nginx情況下,為更好利用服務(wù)器資源,各子系統(tǒng)分別部署到三臺(tái)服務(wù)器上,使用不同的端口提供對(duì)外服務(wù)。
具體規(guī)劃如下。
上述規(guī)劃中不同服務(wù)器、不同端口號(hào)對(duì)外提供服務(wù)對(duì)學(xué)員使用造成不便。
利用Nginx的特點(diǎn),在軟件層面基于的URL重定向功能,簡(jiǎn)化用戶訪問(wèn)各子系統(tǒng)的途徑(統(tǒng)一域名、統(tǒng)一端口訪問(wèn))[5],實(shí)現(xiàn)應(yīng)用系統(tǒng)處理高并發(fā)事件的能力,在服務(wù)器資源和IP資源有限的情況下,綜合高效利用資源,為學(xué)員提供優(yōu)質(zhì)服務(wù),顯得尤為重要。
實(shí)現(xiàn)系統(tǒng)的負(fù)載均衡,主要有三個(gè)方面:系統(tǒng)的模型設(shè)計(jì),Session共享實(shí)現(xiàn),站點(diǎn)管理實(shí)現(xiàn)。
3.2 Nginx應(yīng)用系統(tǒng)模型設(shè)計(jì)
根據(jù)Nginx的反向代理服務(wù)器架構(gòu),將遠(yuǎn)程教育培訓(xùn)系統(tǒng)進(jìn)行如圖1的設(shè)計(jì),實(shí)現(xiàn)各應(yīng)用的負(fù)載均衡。
Nginx和MSM分別部署在2臺(tái)應(yīng)用服務(wù)器APP1和APP2上,既可以實(shí)現(xiàn)應(yīng)用系統(tǒng)的負(fù)載均衡,又可以避免Nginx的單點(diǎn)故障。
Nginx為用戶訪問(wèn)入口,當(dāng)用戶向Nginx反向代理服務(wù)器發(fā)送請(qǐng)求時(shí),Nginx利用它的Handers處理模塊進(jìn)行服務(wù),服務(wù)器根據(jù)配置好的Location信息判斷向哪個(gè)后端Web服務(wù)器發(fā)送請(qǐng)求。
Nginx和Memorycached的安裝過(guò)程省略,下面在安裝成功的前提下,介紹兩者的關(guān)鍵配置參數(shù)。
3.3 memcached實(shí)現(xiàn)Session共享
存入memcached 的數(shù)據(jù)必須實(shí)現(xiàn)序列化。memcached支持的序列化參數(shù)包含javolution序列化、flexjson序列化、kryo序列化等。使用kryo來(lái)做序列化,實(shí)現(xiàn)memcached的session共享是目前性能優(yōu)化比較好的方式。
Tomcat的context.xml增加如下配置:
[ memcachedNodes="n1:app1:11211,n2:app3:11211" sticky="false" lockingMode="auto" sessionBackupAsync="false" sessionBackupTimeout="100000" requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$" transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory" ] 3.4 Nginx實(shí)現(xiàn)應(yīng)用系統(tǒng)模型 Nginx配置中,實(shí)現(xiàn)各子系統(tǒng)分別配置不同的域名,而且可以將不同端口的tomcat應(yīng)用,統(tǒng)一使用Nginx的一個(gè)端口實(shí)現(xiàn)。配置之后,用戶訪問(wèn)各個(gè)子系統(tǒng)只需記住不同域名,而不需要記住不同端口號(hào),大大方便了用戶的使用。主要配置內(nèi)容如下。 設(shè)置proxy.conf參數(shù): [proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; ] Proxy.conf參數(shù),使得反向代理層的Nginx重寫請(qǐng)求頭中的host字段,避免后端Web服務(wù)器設(shè)有防掉鏈或根據(jù)http請(qǐng)求頭中的host字段進(jìn)行路由或判斷功能時(shí)[4],訪問(wèn)失敗。Proxy.conf包含在nginx.conf配置文件中,保證所有子系統(tǒng)訪問(wèn)方式相同。 設(shè)置nginx.conf參數(shù): [include proxy.conf; …… #以遠(yuǎn)程培訓(xùn)為例 設(shè)置負(fù)載均衡 upstream ycpx.domain{ server app2:7001 weight=5; server app3:7001 weight=5; } server { listen 9008; #port server_name ycpx.domain; location / { proxy_pass http:// ycpx.domain /; } ] Nginx.conf簡(jiǎn)單配置完成,訪問(wèn):http://ycpx.domain:9008/ 即可隨機(jī)訪問(wèn)app1和app3應(yīng)用服務(wù)器上的遠(yuǎn)程培訓(xùn)子系統(tǒng)。其他子系統(tǒng)設(shè)置相同,配置完成,可通過(guò)http://***.domain:9008/訪問(wèn)。 其他如服務(wù)器權(quán)重等,可以根據(jù)實(shí)際服務(wù)器硬件配置進(jìn)行合理分配。這里只是最簡(jiǎn)單的配置實(shí)現(xiàn)方式。 4 結(jié)束語(yǔ) Nginx與MSM結(jié)合實(shí)現(xiàn)系統(tǒng)的負(fù)載均衡,不但節(jié)約ip資源,提高應(yīng)用服務(wù)器利用率,而且在一定程度上可以提高Web系統(tǒng)的安全性。Nginx提供了豐富的參數(shù)配置,用于提高系統(tǒng)性能,因篇幅有限,本文只介紹了關(guān)鍵配置方法,可再深入研究Ngnix配置參數(shù),進(jìn)一步提供系統(tǒng)的高并發(fā)行和運(yùn)行效率。 參考文獻(xiàn): [1] 趙瑞雪. 基于Nginx的智能管理方案的研究[D]. 北京:北京郵電大學(xué), 2013. [2] 林宏. Nginx反向代理可視化管理方案研究與編程實(shí)現(xiàn)[J]. 貴州師范學(xué)院學(xué)報(bào), 2015, 31(12): 32-35. [3] 嚴(yán)方東, 劉玉鳳. 利用Nginx實(shí)現(xiàn)網(wǎng)站負(fù)載均衡[J]. 數(shù)字化用戶, 2013, 15(6): 96-96. [4] 吳翔毅. Nginx在校園網(wǎng)絡(luò)中的應(yīng)用研究[J]. 福建電腦, 2009, 25(7): 103-104. [5] 劉全飛, 周相兵. 基于Nginx的站點(diǎn)管理系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)[J]. 電腦開發(fā)與應(yīng)用, 2015(1).