Nginx 連接tomcat時(shí)會(huì)話粘性問(wèn)題分析及解決方法
在多臺(tái)后臺(tái)服務(wù)器的環(huán)境下,我們?yōu)榱舜_保一個(gè)客戶(hù)只和一臺(tái)服務(wù)器通信,我們勢(shì)必使用長(zhǎng)連接。使用什么方式來(lái)實(shí)現(xiàn)這種連接呢,常見(jiàn)的有使用nginx自帶的ip_hash來(lái)做,我想這絕對(duì)不是一個(gè)好的辦法,如果前端是CDN,或者說(shuō)一個(gè)局域網(wǎng)的客戶(hù)同時(shí)訪問(wèn)服務(wù)器,導(dǎo)致出現(xiàn)服務(wù)器分配不均衡,以及不能保證每次訪問(wèn)都粘滯在同一臺(tái)服務(wù)器。如果基于cookie會(huì)是一種什么情形,想想看, 每臺(tái)電腦都會(huì)有不同的cookie,在保持長(zhǎng)連接的同時(shí)還保證了服務(wù)器的壓力均衡。
問(wèn)題分析:
1. 一開(kāi)始請(qǐng)求過(guò)來(lái),沒(méi)有帶session信息,jvm_route就根據(jù)round robin的方法,發(fā)到一臺(tái)tomcat上面。
2. tomcat添加上session 信息,并返回給客戶(hù)。
3. 用戶(hù)再此請(qǐng)求,jvm_route看到session中有后端服務(wù)器的名稱(chēng),它就把請(qǐng)求轉(zhuǎn)到對(duì)應(yīng)的服務(wù)器上。
暫時(shí)jvm_route模塊還不支持默認(rèn)fair的模式。jvm_route的工作模式和fair是沖突的。對(duì)于某個(gè)特定用戶(hù),當(dāng)一直為他服務(wù)的 tomcat宕機(jī)后,默認(rèn)情況下它會(huì)重試max_fails的次數(shù),如果還是失敗,就重新啟用round robin的方式,而這種情況下就會(huì)導(dǎo)致用戶(hù)的session丟失。
總的說(shuō)來(lái),jvm_route是通過(guò)session_cookie這種方式來(lái)實(shí)現(xiàn)session粘性,將特定會(huì)話附屬到特定tomcat上,從而解決session不同步問(wèn)題,但無(wú)法解決宕機(jī)后會(huì)話轉(zhuǎn)移問(wèn)題。
假如沒(méi)有這個(gè)jvm_route,用戶(hù)再請(qǐng)求的時(shí)候,由于沒(méi)有session信息,nignx就會(huì)再次隨機(jī)的發(fā)送請(qǐng)求到后端的tomcat服務(wù)器,這種情況,對(duì)于普通的頁(yè)面訪問(wèn)是沒(méi)有問(wèn)題的。對(duì)于帶有登錄驗(yàn)證信息的請(qǐng)求,其結(jié)果就是永遠(yuǎn)登錄不了應(yīng)用服務(wù)器。
這個(gè)模塊通過(guò)session cookie的方式來(lái)獲取session粘性。如果在cookie和url中并沒(méi)有session,則這只是個(gè)簡(jiǎn)單的round-robin 負(fù)載均衡。
要解決以上類(lèi)似的問(wèn)題,從網(wǎng)上查了下,大致有如下幾種方式:
1)ip_hash(不推薦使用)
nginx中的ip_hash技術(shù)能夠?qū)⒛硞€(gè)ip的請(qǐng)求定向到同一臺(tái)后端,這樣一來(lái)這個(gè)ip下的某個(gè)客戶(hù)端和某個(gè)后端就能建立起穩(wěn)固的session,ip_hash是在upstream配置中定義的:
upstream backend {
server 192.168.12.10:8080 ;
server 192.168.12.11:9090 ;
ip_hash;
}
不推薦使用的原因如下:
1/ nginx不是最前端的服務(wù)器。
ip_hash要求nginx一定是最前端的服務(wù)器,否則nginx得不到正確ip,就不能根據(jù)ip作hash。譬如使用的是squid為最前端,那么nginx取ip時(shí)只能得到squid的服務(wù)器ip地址,用這個(gè)地址來(lái)作分流是肯定錯(cuò)亂的。
2/ nginx的后端還有其它方式的負(fù)載均衡。
假如nginx后端又有其它負(fù)載均衡,將請(qǐng)求又通過(guò)另外的方式分流了,那么某個(gè)客戶(hù)端的請(qǐng)求肯定不能定位到同一臺(tái)session應(yīng)用服務(wù)器上。
3/ 多個(gè)外網(wǎng)出口。
很多公司上網(wǎng)有多個(gè)出口,多個(gè)ip地址,用戶(hù)訪問(wèn)互聯(lián)網(wǎng)時(shí)候自動(dòng)切換ip。而且這種情況不在少數(shù)。使用 ip_hash 的話對(duì)這種情況的用戶(hù)無(wú)效,無(wú)法將某個(gè)用戶(hù)綁定在固定的tomcat上 。
2)nginx_upstream_jvm_route(nginx擴(kuò)展,推薦使用) ——我試了下1.8版本的,發(fā)現(xiàn)新的版本已經(jīng)不支持了?。?!擦。。不過(guò)1.4.2的版本據(jù)說(shuō)是支持的。
nginx_upstream_jvm_route 是一個(gè)nginx的擴(kuò)展模塊,用來(lái)實(shí)現(xiàn)基于 Cookie 的 Session Sticky 的功能。
簡(jiǎn)單來(lái)說(shuō),它是基于cookie中的JSESSIONID來(lái)決定將請(qǐng)求發(fā)送給后端的哪個(gè)server,nginx_upstream_jvm_route會(huì)在用戶(hù)第一次請(qǐng)求后端server時(shí),將響應(yīng)的server標(biāo)識(shí)綁定到cookie中的JSESSIONID中,從而當(dāng)用戶(hù)發(fā)起下一次請(qǐng)求時(shí),nginx會(huì)根據(jù)JSESSIONID來(lái)決定由哪個(gè)后端server來(lái)處理。
1/ nginx_upstream_jvm_route安裝
下載地址(svn):http://nginx-upstream-jvm-route.googlecode.com/svn/trunk/
假設(shè)nginx_upstream_jvm_route下載后的路徑為/usr/local/nginx_upstream_jvm_route,
(1)進(jìn)入nginx源碼路徑
patch -p0 < /usr/local/nginx_upstream_jvm_route/jvm_route.patch
(2)./configure --with-http_stub_status_module --with-http_ssl_module --prefix=/usr/local/nginx --with-
pcre=/usr/local/pcre-8.33 --add-module=/usr/local/nginx_upstream_jvm_route
(3)make & make install
2/ nginx配置
upstream tomcats_jvm_route
{
# ip_hash;
server 192.168.33.10:8090 srun_id=tomcat01;
server 192.168.33.11:8090 srun_id=tomcat02;
jvm_route $cookie_JSESSIONID|sessionid reverse;
}
3/ tomcat配置
修改192.168.33.10:8090tomcat的server.xml,
將
<Engine name="Catalina" defaultHost="localhost" >
修改為:
<Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat01">
同理,在192.168.33.11:8090server.xml中增加jvmRoute="tomcat02"。
4/ 測(cè)試
啟動(dòng)tomcat和nginx,訪問(wèn)nginx代理,使用Google瀏覽器,F(xiàn)12,查看cookie中的JSESSIONID,
形如:ABCD123456OIUH897SDFSDF.tomcat01 ,刷新也不會(huì)變化
3)基于cookie的Nginx Sticky模塊
總結(jié)
以上所述是小編給大家介紹的Nginx 連接tomcat時(shí)會(huì)話粘性問(wèn)題分析及解決方法,希望對(duì)大家有所幫助,如果大家有 任何疑問(wèn)歡迎給我留言,小編會(huì)及時(shí)回復(fù)大家的!
- Tomcat+Jsp環(huán)境下的中文問(wèn)題
- flex tomcat端口被占用的問(wèn)題分析及解決方法
- Eclipse啟動(dòng)Tomcat超時(shí)問(wèn)題的解決方法
- java中tomcat的80端口被占用問(wèn)題解決
- Tomcat服務(wù)無(wú)法啟動(dòng)的問(wèn)題的解決方法
- 解決tomcat的中文問(wèn)題
- Tomcat服務(wù)器圖片地址中文路徑問(wèn)題解決辦法
- Java中tomcat memecached session 共享同步問(wèn)題的解決辦法
- 解決在啟動(dòng)eclipse的tomcat進(jìn)行訪問(wèn)時(shí)出現(xiàn)404問(wèn)題的方法
相關(guān)文章
nginx反向代理用做內(nèi)網(wǎng)域名轉(zhuǎn)發(fā)
這篇文章主要為大家詳細(xì)介紹了nginx反向代理用做內(nèi)網(wǎng)域名轉(zhuǎn)發(fā),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-10-10
Centos7.x下Nginx安裝及SSL配置與常用命令詳解
這篇文章主要介紹了Centos7.x下Nginx安裝及SSL配置與常用命令詳解,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-02-02
nginx中封禁ip和允許內(nèi)網(wǎng)ip訪問(wèn)的實(shí)現(xiàn)示例
Nginx不僅僅只是一款反向代理和負(fù)載均衡服務(wù)器,本文主要介紹了nginx中封禁ip和允許內(nèi)網(wǎng)ip訪問(wèn)的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03
nginx 隱藏版本號(hào)與WEB服務(wù)器信息的解決方法
這篇文章主要介紹了nginx 隱藏版本號(hào)與WEB服務(wù)器信息的解決方法,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-11-11
如何利用nginx通過(guò)正則攔截指定url請(qǐng)求詳解
這篇文章主要介紹了如何利用nginx通過(guò)正則攔截指定url請(qǐng)求的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用nginx具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-05-05
Nginx配置SSL證書(shū)部署HTTPS網(wǎng)站的方法(頒發(fā)證書(shū))
這篇文章主要介紹了Nginx配置SSL證書(shū)部署HTTPS網(wǎng)站的方法(頒發(fā)證書(shū)),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-06-06

