一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

云服務器|WEB服務器|FTP服務器|郵件服務器|虛擬主機|服務器安全|DNS服務器|服務器知識|Nginx|IIS|Tomcat|

服務器之家 - 服務器技術 - Nginx - Nginx 連接tomcat時會話粘性問題分析及解決方法

Nginx 連接tomcat時會話粘性問題分析及解決方法

2019-11-04 14:25Nginx教程網 Nginx

這篇文章主要介紹了Nginx 連接tomcat時會話粘性問題分析及解決方法的相關資料,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下

在多臺后臺服務器的環境下,我們為了確保一個客戶只和一臺服務器通信,我們勢必使用長連接。使用什么方式來實現這種連接呢,常見的有使用nginx自帶的ip_hash來做,我想這絕對不是一個好的辦法,如果前端是CDN,或者說一個局域網的客戶同時訪問服務器,導致出現服務器分配不均衡,以及不能保證每次訪問都粘滯在同一臺服務器。如果基于cookie會是一種什么情形,想想看, 每臺電腦都會有不同的cookie,在保持長連接的同時還保證了服務器的壓力均衡。

問題分析:

1. 一開始請求過來,沒有帶session信息,jvm_route就根據round robin的方法,發到一臺tomcat上面。

2. tomcat添加上session 信息,并返回給客戶。

3. 用戶再此請求,jvm_route看到session中有后端服務器的名稱,它就把請求轉到對應的服務器上。

暫時jvm_route模塊還不支持默認fair的模式。jvm_route的工作模式和fair是沖突的。對于某個特定用戶,當一直為他服務的 tomcat宕機后,默認情況下它會重試max_fails的次數,如果還是失敗,就重新啟用round robin的方式,而這種情況下就會導致用戶的session丟失。

總的說來,jvm_route是通過session_cookie這種方式來實現session粘性,將特定會話附屬到特定tomcat上,從而解決session不同步問題,但無法解決宕機后會話轉移問題。
假如沒有這個jvm_route,用戶再請求的時候,由于沒有session信息,nignx就會再次隨機的發送請求到后端的tomcat服務器,這種情況,對于普通的頁面訪問是沒有問題的。對于帶有登錄驗證信息的請求,其結果就是永遠登錄不了應用服務器。

這個模塊通過session cookie的方式來獲取session粘性。如果在cookie和url中并沒有session,則這只是個簡單的round-robin 負載均衡。

要解決以上類似的問題,從網上查了下,大致有如下幾種方式:

1)ip_hash(不推薦使用)

 nginx中的ip_hash技術能夠將某個ip的請求定向到同一臺后端,這樣一來這個ip下的某個客戶端和某個后端就能建立起穩固的session,ip_hash是在upstream配置中定義的: 

?
1
2
3
4
5
upstream backend { 
 server 192.168.12.10:8080 ; 
 server 192.168.12.11:9090 ; 
 ip_hash; 
 }

不推薦使用的原因如下:

  1/ nginx不是最前端的服務器。

   ip_hash要求nginx一定是最前端的服務器,否則nginx得不到正確ip,就不能根據ip作hash。譬如使用的是squid為最前端,那么nginx取ip時只能得到squid的服務器ip地址,用這個地址來作分流是肯定錯亂的。

       2/ nginx的后端還有其它方式的負載均衡。

   假如nginx后端又有其它負載均衡,將請求又通過另外的方式分流了,那么某個客戶端的請求肯定不能定位到同一臺session應用服務器上。

   3/ 多個外網出口。

    很多公司上網有多個出口,多個ip地址,用戶訪問互聯網時候自動切換ip。而且這種情況不在少數。使用 ip_hash 的話對這種情況的用戶無效,無法將某個用戶綁定在固定的tomcat上 。

2)nginx_upstream_jvm_route(nginx擴展,推薦使用) ——我試了下1.8版本的,發現新的版本已經不支持了?。。〔?。。不過1.4.2的版本據說是支持的。

nginx_upstream_jvm_route 是一個nginx的擴展模塊,用來實現基于 Cookie 的 Session Sticky 的功能。

簡單來說,它是基于cookie中的JSESSIONID來決定將請求發送給后端的哪個server,nginx_upstream_jvm_route會在用戶第一次請求后端server時,將響應的server標識綁定到cookie中的JSESSIONID中,從而當用戶發起下一次請求時,nginx會根據JSESSIONID來決定由哪個后端server來處理。

1/ nginx_upstream_jvm_route安裝

下載地址(svn):http://nginx-upstream-jvm-route.googlecode.com/svn/trunk/

假設nginx_upstream_jvm_route下載后的路徑為/usr/local/nginx_upstream_jvm_route,

(1)進入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配置

?
1
2
3
4
5
6
7
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/ 測試

啟動tomcat和nginx,訪問nginx代理,使用Google瀏覽器,F12,查看cookie中的JSESSIONID,
形如:ABCD123456OIUH897SDFSDF.tomcat01 ,刷新也不會變化

3)基于cookie的Nginx Sticky模塊

總結

以上所述是小編給大家介紹的Nginx 連接tomcat時會話粘性問題分析及解決方法,希望對大家有所幫助,如果大家有 任何疑問歡迎給我留言,小編會及時回復大家的!

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 暖暖日本在线观看免费 | 四虎成人免费视频 | 国产一卡2卡3卡四卡高清 | 91制片厂果冻星空传媒3xg | 国产免费一区不卡在线 | 大陆国产精品视频 | 国产福利在线观看永久视频 | 色中文字幕| 精品蜜臀AV在线天堂 | 四虎影院久久久 | 男人狂躁女人下面的视频免费 | 欧美激情精品久久久久久不卡 | 草莓视频在线免费观看 | 亚洲乱码一二三四五六区 | 青草青草久热精品视频在线网站 | 99热影院| 亚洲一卡2卡三卡4卡5卡组 | 日本免费一区二区三区四区五六区 | 国产一二区视频 | 日本一道高清不卡免费 | 久久精品亚洲国产AV涩情 | 俺不色| 欧美一级特黄刺激大片视频 | 午夜dj免费视频观看社区 | 免费福利资源站在线视频 | 日本视频免费在线播放 | 成人久久伊人精品伊人 | 天美网站传媒入口网址 | 午夜国产精品影院在线观看 | 午夜影院网站 | 亚洲 日本 中文字幕 制服 | 国产成人盗拍精品免费视频 | 国产一区二区精品久 | 夫妻性生活影院 | 9191精品国产观看 | 18岁的老处女 | 9420高清视频在线观看网百度 | 精品无码国产污污污免费网站2 | 动漫a级片 | 国模丰满美女冰漪34d | 99精彩视频在线观看 |