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