在Nginx里指定ip_hash的方式解決Tomcat集群session的問題


據稱,Tomcat集群session同步方案有以下幾種方式:

1)使用tomcat自帶的cluster方式,多個tomcat間自動實時復制session信息,配置起來很簡單。但這個方案的效率比較低,在大並發下表現並不好。
2)利用nginx的基於訪問ip的hash路由策略,保證訪問的ip始終被路由到同一個tomcat上,這個配置更簡單。每個請求按訪問ip的hash結果分配,這樣每個訪客固定訪問一個后端服務器,可以解決session(並不是共享session解決)的問題! 並且如果應用是某一個局域網大量用戶同時登錄,這樣負載均衡就沒什么作用了。
3)利用nginx插件實現tomcat集群和session同步,nginx-upstream-jvm-route是一個Nginx的擴展模塊,用來實現基於Cookie的Session Sticky的功能。但是遺憾的是,這個模塊的補丁在nginx1.4版本之后就沒有再更新了,所以nginx1.4之后版本跟該模塊就不兼容了!!
4)利用memcached實現(MSM工具)。memcached存儲session,並把多個tomcat的session集中管理,前端在利用nginx負載均衡和動靜態資源分離,在兼顧系統水平擴展的同時又能保證較高的性能。即通過MSM工具把Tomcat的Session序列化后保存到Memcached里面,從而實現Session共享.
5)利用redis實現。使用redis不僅僅可以將緩存的session持久化,還因為它支持的單個對象比較大,而且數據類型豐富,不只是緩存 session,還可以做其他用途,可以一舉幾得。Redis這種方式目前還不支持Tomcat8環境(現在網上插件不支持tomcat8,非要支持tomcat8,則需修改插件jar包的源代碼)!
6)利用filter方法實現。這種方法比較推薦,因為它的服務器使用范圍比較多,不僅限於tomcat ,而且實現的原理比較簡單容易控制。
7)利用terracotta服務器共享session。這種方式配置比較復雜。

下面實現的就是最簡單的第二種方式:

nginx.conf里配置如下:

http {
    include       mime.types;
    default_type  application/octet-stream;

    access_log  logs/access.log;

    sendfile        on;

    keepalive_timeout  65;
    
    upstream tomcat{
        ip_hash;
        server localhost:8080;
        server localhost:8088;
    }

    server {
        listen       80;
        server_name  localhost;
        client_max_body_size 1024m;
        
        location / {
            proxy_pass http://tomcat;
            proxy_set_header Host $host:$server_port;
        }
        

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
    
...
}

上面upstream里ip_hash;一句就是實現訪客固定訪問一個后端服務器的方式,確實簡單易行。

參考網頁:

1.https://www.cnblogs.com/kevingrace/p/6398672.html

2.https://www.cnblogs.com/xiandedanteng/p/12055609.html

--END-- 2019-12-27 09:20


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM