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