摘 要:Java Web最常用的服務(wù)器是Tomcat,但是Tomcat處理靜態(tài)資源能力有著缺陷,本文介紹了使用tomcat集群加nginx作為web服務(wù)器,同時(shí)nginx做負(fù)載均衡,加上redis內(nèi)存數(shù)據(jù)庫(kù)作為session存儲(chǔ)和數(shù)據(jù)庫(kù)緩存的架構(gòu)方案,所有這些技術(shù)均為開源軟件,免除了授權(quán)的問題。
關(guān)鍵詞:Tomcat;nginx;redis;開源
中圖分類號(hào):TP311.52
Tomcat快速、高效、易于部署,并且開源,是Java Web最常用的開源服務(wù)器。但是在處理靜態(tài)資源上,Tomcat相對(duì)于現(xiàn)在流行的高性能Web服務(wù)器,如nginx、lighttpd尚有不小的差距。因此,在追求高并發(fā)、重負(fù)載的場(chǎng)合,可以在Tomcat集群前加上nginx處理靜態(tài)資源以及負(fù)載均衡。同時(shí),對(duì)于高并發(fā)的場(chǎng)合,數(shù)據(jù)庫(kù)的查詢性能很容易成為瓶頸,使用連接池技術(shù)加上內(nèi)存數(shù)據(jù)庫(kù)redis作緩存可以大幅度的提升查詢性能。
1 Tomcat集群和調(diào)優(yōu)
Tomcat建議安裝在64位Linux系統(tǒng)下,在32位系統(tǒng)中,即使某些操作系統(tǒng)可以使用超過4G,JVM的也限制了最多只能夠使用2G內(nèi)存。Tomcat容器的默認(rèn)配置吞吐量也不能夠滿足高并發(fā)服務(wù)的需要,因此需要更改Tomcat的配置,修改server.xml文件。
URIEncoding=\"UTF-8\" minSpareThreads=\"25\" maxSpareThreads=\"75\" enableLookups=\"1\" disableUploadTimeout=\"true\" connectionTimeout=\"20000\" acceptCount=\"300\" maxThreads=\"300\"maxProcessors=\"1000\" minProcessors=\"5\" useURIValidationHack=\"1\" compression=\"on\" compressionMinSize=\"2048\" compressableMimeType=\"text/html,text/xml,text/javascript,text/css,text/plain\" redirectPort=\"8443\" /> 其中URIEncoding=”UTF-8”表示可以解析含有中文的URL,acceptCount是等待隊(duì)列,maxThreads為最大線程數(shù),即最大并發(fā)數(shù)。 單個(gè)Tomcat處理能力有限,在現(xiàn)在的服務(wù)器配置情況下,常常不能夠利用完CPU和內(nèi)存就達(dá)到最大負(fù)載,此時(shí),可以使用Tomcat的縱向集群,即單臺(tái)服務(wù)器運(yùn)行多個(gè)Tomcat。如果還不能達(dá)到高并發(fā)的需要,那么就需要使用Tomcat的橫向集群,即多臺(tái)服務(wù)器運(yùn)行多個(gè)Tomcat。 集群方案可以使用Tomcat自帶的cluster方式,多個(gè)Tomcat間自動(dòng)實(shí)時(shí)復(fù)制session信息,配置簡(jiǎn)單。但該方案的效率比較低,在高并發(fā)場(chǎng)合下表現(xiàn)并不好。另一種方案是利用nginx的基于訪問IP的hash路由策略,保證訪問的IP始終被路由到同一個(gè)tomcat上。以單服務(wù)器Tomcat集群為例,需要修改Tomcat的三處端口。首先是修改Tomcat的關(guān)閉端口,每個(gè)Tomcat不能重復(fù): 然后修改Tomcat的監(jiān)聽端口,同樣不能重復(fù): redirectPort=\"8443\" /> 第三處端口修改Tomcat的連接端口: 最后Engine元素增加jvmRoute屬性 2 nginx作負(fù)載均衡和動(dòng)靜態(tài)分離 nginx是一個(gè)高性能的HTTP和反向代理服務(wù)器,處理靜態(tài)資源的能力得到了眾多高并發(fā)Web站點(diǎn)的考驗(yàn),nginx可以按照調(diào)度規(guī)則實(shí)現(xiàn)動(dòng)態(tài)、靜態(tài)頁面的分離,可以按照輪詢、ip hash、URL hash、權(quán)重等多種方式對(duì)后端服務(wù)器做負(fù)載均衡。使用nginx在Tomcat的前端作反向代理,nginx處理如html、css、js、圖片等靜態(tài)資源,而將動(dòng)態(tài)的請(qǐng)求轉(zhuǎn)發(fā)給Tomcat集群進(jìn)行處理,從而充分的結(jié)合nginx和Tomcat的長(zhǎng)處,分別處理靜態(tài)和動(dòng)態(tài)資源。 nginx的負(fù)載均衡配置配置如下所示: upstream web_server { #ip_hash; server 127.0.0.1:8080 max_fails=3 fail_timeout=30s; server 127.0.0.1:8081 max_fails=3 fail_timeout=30s; } 其中參數(shù)max_fails=3,表示允許在30秒內(nèi)后端服務(wù)器有3次失敗,如果大于3次,則將該后端服務(wù)器標(biāo)記為不可用,該參數(shù)主要用過于對(duì)后端服務(wù)器進(jìn)行健康檢查。 3 redis做session存儲(chǔ) Web服務(wù)集群最大的難點(diǎn)就是如何能在集群中的多個(gè)節(jié)點(diǎn)之間保持?jǐn)?shù)據(jù)的一致性,Session是這些數(shù)據(jù)中最重要的一塊。Tomcat集群可以通過Tomcat自帶的session復(fù)制,將session同步復(fù)制到每一個(gè)Tomcat中,但如果集群內(nèi)節(jié)點(diǎn)較多,容易引起session廣播風(fēng)暴。還有種方案是將session放到一個(gè)數(shù)據(jù)庫(kù)中集中存儲(chǔ),這就要求該數(shù)據(jù)庫(kù)具備非常高的性能,使用redis內(nèi)存數(shù)據(jù)庫(kù)可以很好的滿足Tomcat集群的需求。在Tomcat 的conf/context.xml 文件里增加如下內(nèi)容: host=\"localhost\" port=\"6379\" database=\"0\" maxInactiveInterval=\"60\" /> 4 redis用作數(shù)據(jù)緩存 Web應(yīng)用并發(fā)數(shù)增大后,數(shù)據(jù)庫(kù)I/O容易成為整個(gè)系統(tǒng)的瓶頸,一般可以通過數(shù)據(jù)庫(kù)拆分,建立數(shù)據(jù)庫(kù)集群來解決該問題,但數(shù)據(jù)庫(kù)集群的建立無疑需要較大的成本,同時(shí)必須要由水平很高的DBA進(jìn)行實(shí)施。如果使用內(nèi)存數(shù)據(jù)庫(kù)對(duì)傳統(tǒng)數(shù)據(jù)庫(kù)做緩存,實(shí)現(xiàn)查詢緩存(以sql為key緩存查詢結(jié)果)和數(shù)據(jù)緩沖,由于內(nèi)存的訪問速度遠(yuǎn)遠(yuǎn)超過硬盤,可以極大的提升查詢效率。同時(shí)也可以將一些更新頻率較低但查詢頻率較高(如基礎(chǔ)數(shù)據(jù)表、配置文件)等數(shù)據(jù)在應(yīng)用啟動(dòng)時(shí)即加載到redis中。 5 結(jié)束語 本文描述了nginx+tomcat集群的配置方案,同時(shí)使用了redis內(nèi)存數(shù)據(jù)庫(kù)做session集中存儲(chǔ)和數(shù)據(jù)庫(kù)緩存,該方案可以應(yīng)對(duì)高并發(fā)和重負(fù)載的Web站點(diǎn)所需,并且使用的所有技術(shù)均為開源軟件,建議使用的服務(wù)器操作系統(tǒng)為L(zhǎng)inux,可以節(jié)省軟件使用的授權(quán)成本。 參考文獻(xiàn): [1]曾超宇,李金香.Redis在高速緩存系統(tǒng)中的應(yīng)用[J].微型機(jī)與應(yīng)用,2013(12). [2]任世宗,李潤(rùn)知,張茜.基于Nginx的可擴(kuò)展負(fù)載均衡Web站點(diǎn)部署[J].中國(guó)教育網(wǎng)絡(luò),2014(08). 作者單位:瀘州職業(yè)技術(shù)學(xué)院,四川瀘州 646005