Nginx+Tomcat集群环境搭建
Tomcat集群能帶來什么?
提高服務(wù)的性能
實(shí)際公司線上生產(chǎn)環(huán)境都會選擇一臺機(jī)器部署一個(gè)tomcat,多臺機(jī)器完成集群,畢竟一臺機(jī)器部署多個(gè)tomcat還是有一些共享瓶頸的,例如它們的網(wǎng)卡只有一個(gè),內(nèi)存和磁盤IO等都是共用的。而多臺機(jī)器共同提供相同的服務(wù),能夠充分利用每一臺機(jī)器的資源,自然能夠提高服務(wù)的性能。
并發(fā)能力
很好理解,一臺tomcat的http線程池是有限的,那么兩臺能承載的http線程自然是一臺的2倍。
高可用性
簡單理解在Nginx下面掛了多臺tomcat節(jié)點(diǎn),當(dāng)其中一臺tomcat掛掉的時(shí)候,那么我們可以把這個(gè)節(jié)點(diǎn)從Nginx負(fù)載均衡tomcat集群的配置當(dāng)中移除,那么對于請求nginx還會打到可用的tomcat服務(wù)器上,并不影響我們提供的服務(wù)。所以tomcat集群就能帶來一定的高可用性。
橫向擴(kuò)展能力
假設(shè)對于一臺服務(wù)器,通過不斷的升級它的cpu、內(nèi)存、更換固態(tài)硬盤等,我們認(rèn)為這是縱向提高機(jī)器的配置,來達(dá)到提高tomcat所提供服務(wù)的性能,隨著硬件不斷提高,成本是指數(shù)級上升的。
而橫向擴(kuò)展能力則不同,比如天貓的雙11活動,因?yàn)槠綍r(shí)訪問量沒有那么高,但是雙11訪問量非常高,當(dāng)tomcat集群完成后我們就可以做一個(gè)橫向擴(kuò)展,只要增加tomcat節(jié)點(diǎn)就可以了,根據(jù)實(shí)際數(shù)據(jù)、歷史數(shù)據(jù)去做一個(gè)評估,當(dāng)然這個(gè)還要有一定的動態(tài)能力,根據(jù)實(shí)際的情況動態(tài)的增加幾個(gè)節(jié)點(diǎn),讓nginx進(jìn)行熱部署,就把新增的節(jié)點(diǎn)加入到集群中。
Tomcat集群實(shí)現(xiàn)原理
通過Nginx負(fù)載均衡對多個(gè)tomcat進(jìn)行請求轉(zhuǎn)發(fā),也就是說將多個(gè)用戶的請求通過一定的策略打到集群的各個(gè)tomcat服務(wù)器中。
Tomcat集群帶來了什么新問題
1.Session登錄信息存儲及讀取問題
通常在單tomcat環(huán)境下,我們都是將登錄信息存儲在原生提供的Session對象中。那么在集群環(huán)境下,當(dāng)用戶A發(fā)起登錄請求被轉(zhuǎn)發(fā)到tomcat1上,最終登錄的session信息存儲到了tomcat1上,用戶A此時(shí)訪問系統(tǒng)的某個(gè)服務(wù),該請求被轉(zhuǎn)發(fā)到了tomcat2上,但是tomcat2并沒有該用戶的登錄信息,所以會提示用戶未登錄,顯然這是不合理的。
所以在集群環(huán)境下我們必須要解決多個(gè)tomcat之間session共享問題,讓用戶只需要登錄一次就可以繼續(xù)訪問其他的服務(wù)。
2.服務(wù)器定時(shí)任務(wù)并發(fā)的問題
當(dāng)服務(wù)器存在定時(shí)任務(wù)時(shí),假設(shè)配置的30分鐘執(zhí)行一次,那么到了執(zhí)行的時(shí)間點(diǎn),多個(gè)tomcat就會同時(shí)啟動這個(gè)定時(shí)任務(wù),帶來的問題就是首先如果定時(shí)任務(wù)的業(yè)務(wù)邏輯很復(fù)雜時(shí),非常容易造成線上的數(shù)據(jù)錯亂,其次我們其實(shí)只希望有一臺服務(wù)器去執(zhí)行定時(shí)任務(wù)就夠了,那么多臺同時(shí)執(zhí)行也會帶來不必要的資源浪費(fèi)。
3.根據(jù)項(xiàng)目架構(gòu)和現(xiàn)有業(yè)務(wù)還有可能有更多的問題
對于實(shí)際不同的場景還會有很多的問題,所以隨著項(xiàng)目架構(gòu)的演進(jìn),從架構(gòu)層面的變化會引起代碼層面的變化以及解決方案的變化,不要想當(dāng)然的認(rèn)為集群就是多部署幾臺tomcat就行了。
Tomcat集群架構(gòu)
如圖為tomcat集群后簡要的架構(gòu)圖,左側(cè)是一個(gè)分布式的Redis Session Server,無論用戶請求哪臺tomcat,都將session信息存儲在這里,tomcat請求session也都從這里獲取。所以這里還需要做單點(diǎn)登錄功能。
同時(shí)可以利用分布式Redis來做一個(gè)分布式鎖,解決多個(gè)tomcat在同一時(shí)間點(diǎn)啟動定時(shí)任務(wù)的問題。
?
Nginx負(fù)載均衡配置
負(fù)載均衡用于從 “upstream” 模塊定義的后端服務(wù)器列表中選取一臺服務(wù)器接受用戶的請求。模塊內(nèi)的server是服務(wù)器列表。Nginx負(fù)載均衡常用策略主要有以下5種,下面進(jìn)行分別介紹這幾種策略,包括一些擴(kuò)展的配置參數(shù)。
輪詢
默認(rèn)的負(fù)載均衡策略,每個(gè)請求會按時(shí)間順序逐一分配到不同的后端服務(wù)器
優(yōu)點(diǎn):實(shí)現(xiàn)簡單
缺點(diǎn):不考慮每臺服務(wù)器的處理能力
權(quán)重
在輪詢策略的基礎(chǔ)上指定輪詢的幾率,通過weight參數(shù)指定輪詢幾率,權(quán)重(weight)越高分配到需要處理的請求越多。
weight默認(rèn)值為1,如果多臺都配置了權(quán)重,比較相對值,意思是說如果兩臺服務(wù)器一臺權(quán)重為15,一臺為10,只代表訪問第一臺的概率是第二臺的1.5倍,而不是說25次訪問,有15次訪問第一臺。
優(yōu)點(diǎn):考慮了每臺服務(wù)器處理能力的不同(實(shí)際生產(chǎn)環(huán)境用的比較多的策略)
ip hash
根據(jù)請求的IP,將IP進(jìn)行哈希取模,分配到指定的服務(wù)器,對于同一客戶端IP的請求將發(fā)送到相同的服務(wù)器。
優(yōu)點(diǎn):能實(shí)現(xiàn)同一個(gè)用戶訪問同一個(gè)服務(wù)器,可以解決session共享問題。
缺點(diǎn):根據(jù)ip hash不一定分配平均,在IP變化的情況下也無法保證session會話。
url hash
按訪問url的hash結(jié)果來分配請求,使每個(gè)url定向到同一個(gè)后端服務(wù)器
優(yōu)點(diǎn):能實(shí)現(xiàn)同一個(gè)服務(wù)訪問同一個(gè)服務(wù)器
缺點(diǎn):根據(jù)url hash分配請求會不平均,請求頻繁的url會請求到同一個(gè)服務(wù)器上
fair
特點(diǎn):按后端服務(wù)器的響應(yīng)時(shí)間來分配請求,響應(yīng)時(shí)間短的優(yōu)先分配
upstream www.silly.com{server 192.168.1.109:8080;server 192.168.1.111:8080;fair; }參數(shù)擴(kuò)展
down:表示當(dāng)前的server暫時(shí)不參與負(fù)載
backup:當(dāng)其他非backup的機(jī)器down或者忙的時(shí)候,請求backup機(jī)器
backup相當(dāng)于備用機(jī)器,能提高項(xiàng)目架構(gòu)的一定高可用性,用的不多,畢竟機(jī)器也是資源,需要成本
Tomcat集群環(huán)境搭建
為了方便學(xué)習(xí)這里演示的是單機(jī)部署多應(yīng)用,也就是說在一臺Linux服務(wù)器上部署多個(gè)tomcat服務(wù)器,這里只配置兩臺tomcat,如果要配置更多臺tomcat實(shí)例,方法是一樣的,只需要保證tomcat的端口號必須不能重復(fù),必須是系統(tǒng)沒有使用的。
安裝環(huán)境
CentOS安裝參考:Linux安裝
虛擬機(jī)使用參考:虛擬機(jī)的使用
tomcat安裝參考:Linux下安裝Tomcat
nginx安裝參考:Linux下安裝Nginx
安裝兩個(gè)tomcat可以先解壓下載的tomcat安裝包,然后復(fù)制一份解壓縮目錄重命名即可。
這里將nginx和tomcat都安裝在/usr/local目錄下,tomcat目錄分別命名為tomcat1和tomcat2。
配置環(huán)境變量
vim /etc/profile # 在文件末尾添加如下內(nèi)容 export CATALINA_BASE=/usr/local/tomcat1 export CATALINA_HOME=/usr/local/tomcat1 export TOMCAT_HOME=/usr/local/tomcat1export CATALINA_2_BASE=/usr/local/tomcat2 export CATALINA_2_HOME=/usr/local/tomcat2 export TOMCAT_2_HOME=/usr/local/tomcat2 # 通過vim的 ":wq" 命令進(jìn)行保存退出 # 使配置生效 source /etc/profile修改兩個(gè)tomcat的編碼
vim ${tomcat}/conf/server.xml
進(jìn)入tomcat安裝目錄,編輯conf目錄下的server.xml文件,找到如下節(jié)點(diǎn)添加編碼配置:URIEncoding="UTF-8"
修改第二個(gè)tomcat的配置
修改第二個(gè)tomcat的bin目錄下的catalina.sh文件,找到# OS注釋內(nèi)容,在其下面新增配置
vim /usr/local/tomcat2/bin/catalina.sh # 新增如下配置 # OS specific support. $var _must_ be set to either true or false. export CATALINA_BASE=$CATALINA_2_BASE export CATALINA_HOME=$CATALINA_2_HOME修改第二個(gè)tomcat的conf目錄下的server.xml文件,,修改3個(gè)端口配置
vim /usr/local/tomcat2/conf/server.xml # 修改以下3個(gè)端口,修改為9005,9080,9009 <Server port="9005" shutdown="SHUTDOWN"><Listener className="org.apache.catalina.startup.VersionLoggerListener" /><Connector port="9080" protocol="HTTP/1.1"connectionTimeout="20000"redirectPort="8443" URIEncoding="UTF-8"/><Connector port="9009" protocol="AJP/1.3" redirectPort="8443" />為了方便對兩個(gè)tomcat進(jìn)行區(qū)分,我們修改第二個(gè)tomcat的主頁logo圖片,即替換/usr/local/tomcat2/webapps/ROOT/tomcat.png,圖片名保持一致。
防火墻配置
如果開啟了防火墻,需要配置防火墻規(guī)則,先將兩個(gè)tomcat的端口進(jìn)行開放,主要是為了測試,在配置了Nginx負(fù)載均衡后就可以關(guān)閉端口了。
vim /etc/sysconfig/iptables # 添加如下規(guī)則 -A INPUT -p tcp -m tcp --dport 8080 -j ACCEPT -A INPUT -p tcp -m tcp --dport 9080 -j ACCEPT # 重啟iptables service iptables restarttomcat驗(yàn)證
分別啟動兩個(gè)tomcat,即執(zhí)行命令:${tomcat}/bin/startup.sh
注意檢查兩個(gè)tomcat啟動使用的環(huán)境變量是否正確。
分別訪問兩個(gè)tomcat,這里是在windows下訪問虛擬機(jī)的IP + 端口。
host配置
由于我們是在本機(jī)進(jìn)行搭建,所以需要配置host虛擬域名映射,如果是線上環(huán)境有真實(shí)域名,請忽略此步。
修改瀏覽器所在的主機(jī)的host文件,這里修改的是windows的host文件:C:\Windows\System32\drivers\etc
在末尾添加一行配置:192.168.0.109 www.silly.com
打開cmd,執(zhí)行命令:ping www.silly.com,回復(fù)中顯示的是虛擬機(jī)的IP則說明OK。
Nginx配置
? ? ?2.?在Nginx安裝目錄的conf目錄下新建一個(gè)vhost目錄,然后在vhost目錄下新建配置文件,文件? ? ? ? ? ?名需要以.conf結(jié)尾
cd /usr/local/nginx/conf/ mkdir vhost cd vhost/ vim www.silly.com.conf配置文件添加如下內(nèi)容,這里server_name配置的是主機(jī)對應(yīng)的域名,proxy_pass是反向代理配置,upstream是負(fù)載均衡配置。
upstream www.silly.com{server 127.0.0.1:8080 weight=1;server 127.0.0.1:9080 weight=2; }server {listen 80;autoindex on;server_name silly.com www.silly.com;access_log /usr/local/nginx/logs/access.log combined;index index.html index.htm index.jsp index.php;location / {proxy_pass http://www.silly.com;add_header Access-Control-Allow-Origin *;} }集群驗(yàn)證
啟動Nginx,即執(zhí)行命令:${nginx}/sbin/nginx,打開瀏覽器,清除緩存,訪問域名即http://www.silly.com,不停刷新瀏覽器,可以發(fā)現(xiàn)一會訪問到了8080的tomcat,一會訪問到了9090的tomcat,到此整個(gè)Tomcat集群及Nginx負(fù)載均衡環(huán)境也就搭建完成了,當(dāng)然關(guān)于nginx的配置還有很多細(xì)節(jié)的配置項(xiàng)這里就不做介紹了。
多機(jī)部署多應(yīng)用
事實(shí)上多機(jī)部署多應(yīng)用更加簡單,所以學(xué)會單機(jī)部署多應(yīng)用也就自然能搞定實(shí)際生成環(huán)境多機(jī)的部署了。
?
?
總結(jié)
以上是生活随笔為你收集整理的Nginx+Tomcat集群环境搭建的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 普通高中计算机装备标准,福建省普通高中图
- 下一篇: 软件测试代码表,软件测试函数列表功能图程