1. 程式人生 > >nginx 負載均衡session複製解決方案

nginx 負載均衡session複製解決方案

nginx 負載均衡,必定要用到分散式叢集方案,只要涉及分散式,session共享必定是一個大問題,不僅僅是nginx的問題。我們用nginx做負載均衡,同一個請求不一定會被分配到哪個伺服器中,那麼我們下一個請求可能又被分到了其他的伺服器,這種情境下,就會造成session丟失問題,要出大問題了。這種情況在登陸問題中比較常見,例如:我們第一個請求(由A伺服器響應)可以進入到登陸介面,此時A生成的驗證碼存在於A 的 session中,那麼我們輸完登陸資訊和驗證碼之後提交,此次請求被分到B伺服器來處理,這樣B肯定獲取不到A中session的資訊,拿不到對應的驗證碼,當然出現的錯誤就是驗證碼不正確了。那麼怎樣解決分散式中session複製(共享)問題呢?從網上差了些資料,整理如下:

1.不使用session,換用cookie

session是存放在伺服器端的,cookie是存放在客戶端的,我們可以把使用者訪問頁面產生的session放到cookie裡面,就是以cookie為中轉站。你訪問web伺服器A,產生了session然後把它放到cookie裡面,當你的請求被分配到B伺服器時,伺服器B先判斷伺服器有沒有這個session,如果沒有,再去看看客戶端的cookie裡面有沒有這個session,如果也沒有,說明session真的不存,如果cookie裡面有,就把cookie裡面的sessoin同步到伺服器B,這樣就可以實現session的同步了。

說明:這種方法實現起來簡單,方便,也不會加大資料庫的負擔,但是如果客戶端把cookie禁掉了的話,那麼session就無從同步了,這樣會給網站帶來損失;cookie的安全性不高,雖然它已經加了密,但是還是可以偽造的。

2.session存在memcache或者redis中

memcache可以做分散式,php配置檔案中設定儲存方式為memcache,這樣php自己會建立一個session叢集,將session資料儲存在memcache中。

說明:以這種方式來同步session,不會加大資料庫的負擔,並且安全性比用cookie大大的提高,把session放到記憶體裡面,比從檔案中讀取要快很多。但是memcache把記憶體分成很多種規格的儲存塊,有塊就有大小,這種方式也就決定了,memcache不能完全利用記憶體,會產生記憶體碎片,如果儲存塊不足,還會產生記憶體溢位。

redis通常用於專案的快取,我們可以將session快取到redis中,達到session複製的目的。目前此種方案是 nginx + redis + tomcat 實現的,如下:
(1)將所需jar包加入到tomcat的lib目錄下(tomcat-redis-session-manager相應的jar包,主要有三個)。
(2)配置tomcat目錄下的conf/context.xml,加入以下內容:

<Valve className="com.radiadesign.catalina.session.RedisSessionHandlerValve" />

        <Manager className="com.radiadesign.catalina.session.RedisSessionManager"

                host="192.168.0.222"   #redis地址

                port="6379"                #redis埠

                database="0"

                maxInactiveInterval="60"/> #session失效時間

3. 將session存在資料庫中

用資料庫來同步session,會加大資料庫的IO,增加資料庫的負擔。而且資料庫讀寫速度較慢,不利於session的適時同步,不推薦。

4.nginx ip_hash 策略

Nginx負載均衡的策略:
nginx 的 upstream目前支援 4 種方式的分配
1)、輪詢(預設)
每個請求按時間順序逐一分配到不同的後端伺服器,如果後端伺服器down掉,能自動剔除。
2)、weight
指定輪詢機率,weight和訪問比率成正比,用於後端伺服器效能不均的情況。
3)、ip_hash
每個請求按訪問ip的hash結果分配,這樣每個訪客固定訪問一個後端伺服器,可以解決session的問題。
4)、fair(第三方)
按後端伺服器的響應時間來分配請求,響應時間短的優先分配。
5)、url_hash(第三方)

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

    upstream nginx.example.com  
        {   
             ip_hash;  
                 server 192.168.1.111:80;   
                 server 192.168.1.114:80;  
        }  
        server  
        {  
                 listen 80;  
                 location /  
                 {  
                         proxy_pass  
                        http://nginx.example.com;  
                 }  
     }  

ip_hash是容易理解的,但是因為僅僅能用ip這個因子來分配後端,因此ip_hash是有缺陷的,不能在一些情況下使用:

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

(2) nginx的後端還有其它方式的負載均衡。
假如nginx後端又有其它負載均衡,將請求又通過另外的方式分流了,那麼某個客戶端的請求肯定不能定位到同一臺session應用伺服器上。這麼算起來,nginx後端只能直接指向應用伺服器,或者再搭一個squid,然後指向應用伺服器。最好的辦法是用 location作一次分流,將需要session的部分請求通過ip_hash分流,剩下的走其它後端去。

5.upstream_hash

為了解決ip_hash的一些問題,可以使用upstream_hash這個第三方模組,這個模組多數情況下是用作url_hash的,但是並不妨礙將它用來做session共享:
假如前端是squid,他會將ip加入x_forwarded_for這個http_header裡,用upstream_hash可以用這個頭做因子,將請求定向到指定的後端:
可見這篇文件:http://www.sudone.com/nginx/nginx_url_hash.html
在文件中是使用 $ request_uri 做因子,稍微改一下 :
hash $http_x_forwarded_for”;
這樣就改成了利用x_forwarded_for這個頭作因子,在nginx新版本中可支援讀取cookie值,所以也可以改成:
hash $cookie_jsessionid;
假如在php中配置的session為無cookie方式,配合nginx自己的一個userid_module模組就可以用nginx自發一個cookie,可參見userid模組的英文文件:
http://wiki.nginx.org/NginxHttpUserIdModule
另可用姚偉斌編寫的模組upstream_jvm_route:http://code.google.com/p/nginx-upstream-jvm-route/

相關推薦

nginx 負載均衡session複製解決方案

nginx 負載均衡,必定要用到分散式叢集方案,只要涉及分散式,session共享必定是一個大問題,不僅僅是nginx的問題。我們用nginx做負載均衡,同一個請求不一定會被分配到哪個伺服器中,那麼我們下一個請求可能又被分到了其他的伺服器,這種情境下,就會造成s

nginx負載均衡單點解決方案

Nginx有很強代理功能,但是一臺nginx就形成了單點,現在使用keepalived來解決這個問題,keepalived的故障轉移時間很短.Nginx+keepalived雙機實現nginx反向代理服務的高可用,一臺nginx掛掉之後不影響應用也不影響內網訪問外網。

Linux下Nginx+Resin負載均衡,session問題解決例項

                     Linux下Nginx+Resin負載均衡,session問題解決例項   轉載:http://blog.chinaunix.ne

web負載均衡的多種解決方案

web load balancing,簡單地說就是給我們的伺服器叢集分配”工作任務“。 1.反向代理 反向代理服務的核心工作主要是轉發HTTP請求,因為它工作在HTTP層(應用層),也就是網路結構中的第七層,因此也被稱為”七層負載均衡“,可以做反向代理的軟體很多,比較常見

Nginx負載均衡session會話保持方法

負載均衡時,為了保證同一使用者session會被分配到同一臺伺服器上,可以使用以下方法: 1.使用cookie 將使用者的session存入cookie裡,當用戶分配到不同的伺服器時,先判斷伺服器是否存在該使用者的session,如果沒有就先把cookie裡面的ses

Nginx負載均衡的4種方案配置

1、輪詢 輪詢即Round Robin,根據Nginx配置檔案中的順序,依次把客戶端的Web請求分發到不同的後端伺服器。 配置的例子如下: http{ upstream sampleapp { server <<dns entry or IP Add

域名到站點的負載均衡技術一覽(主要是探討一臺Nginx抵禦大併發的解決方案)(轉)https://www.cnblogs.com/EasonJim/p/7823410.html

一、問題域 Nginx、LVS、Keepalived、F5、DNS輪詢,往往討論的是接入層的這樣幾個問題: 1)可用性:任何一臺機器掛了,服務受不受影響 2)擴充套件性:能否通過增加機器,擴充系統的效能 3)反向代理+負載均衡:請求是否均勻分攤到後端的操作單元執行 二、上面那些名詞都是什麼概念 1

nginx 負載均衡叢集解決方案 healthcheck_nginx_upstreams (一)

 該文章來源於網際網路,目前找不到原作者,放在這裡的目的是記錄 的安裝過程和相關配置,在起初安裝成功後不能夠正常執行healthcheck_nginx_upstreams,後通過閱讀原始碼和除錯,能夠正常執行。 不過資訊如下: *26 no live upstreams while connec

nginx負載均衡輪循session問題解決

1.不使用session,換作cookie把session改成cookie,就能避開session的一些弊端。2.資料庫記錄session資訊使用資料庫記錄session資訊,session的使用頻率比較高,如果存在資料庫中,頻繁的讀取會對資料庫產生較大的壓力,網站效能瓶頸一

Nginx負載均衡4種方案

nginx配置 another 服務器 nginx負載均衡 address 第一個 session 添加 後端 1、輪詢 輪詢即Round Robin,根據Nginx配置文件中的順序,依次把客戶端的Web請求分發到不同的後端服務器。 配置的例子如下:http{ up

(三)配置nginx負載tomcat,redis解決session共享

Nginx ("engine x") 是一個高效能的HTTP和反向代理伺服器,也是一個IMAP/POP3/SMTP伺服器。Nginx是由Igor Sysoev為俄羅斯訪問量第二的Rambler.ru站點開發的。 何為反向代理呢?即以代理伺服器來接受internet上的連線請求,然後將請

Nginx負載均衡,同時實現session共享

前言: 在專案實踐中,有時我們需要多臺伺服器進行負載,以擴充套件伺服器的寬頻、增加吞吐量和提高網路資料的處理能力,從而提高使用者的體驗感,保證專案的質量。當一個專案部署在多臺伺服器上,我們習慣於使用nginx做負載均衡,這樣同一個IP訪問專案的時候會被自動分配到不同的伺服器上; 但是,如

nginx:負載均衡session共享問題

一、場景 當nginx做了負載均衡之後,同一個ip的url請求伺服器的時候,負載均衡會根據每臺伺服器的權重等一些設定將請求轉發到不同的伺服器上去進行處理,這樣的話針對一些帶有狀態請求的情況來說就是個很大的問題,因為是帶有狀態的請求就好比登陸狀態一樣,A使用者登陸

Nginx+Tomcat+Redis (負載均衡+session共享)完整案例

今天整合了一些資源,做了一個Nginx+Tomcat+Redis的案例,使部署的web專案能夠承載較大的訪問壓力,Nginx實現負載均衡,並使用Redis實現session共享; 如下拓撲圖: 各版本如圖所示 =======================================

nginx反向代理、負載均衡 + session共享

前幾天我因為工作的需要,自己學習了下找了下各種文件,自己給自己挖了一堆坑,然後又自己慢慢的填!下面我就先介紹下我自己的安裝方式。 一:準備環境: 1.伺服器:centos6.6 2.nginx版本nginx-1.8.0                          

Dubbo-redis3解決負載均衡Session共享

  由於redis3.0在2015年才出穩定版本,所以可能一些文件比較欠缺,如果有什麼疑問可以看一下這個網址。tomcatRedisClusterEnableSessionManager  首先要準

nginx 負載均衡session貼上

1)ip_hash(不推薦使用)  nginx中的ip_hash技術能夠將某個ip的請求定向到同一臺後端,這樣一來這個ip下的某個客戶端和某個後端就能建立起穩固的session,ip_hash是在upstream配置中定義的:  upstream backend { 

Nginx學習: 負載均衡session會話保持方法

負載均衡時,為了保證同一使用者session會被分配到同一臺伺服器上,可以使用以下方法: 1.使用cookie 將使用者的session存入cookie裡,當用戶分配到不同的伺服器時,先判斷伺服器是否存在該使用者的session,如果沒有就先把cookie裡面的ses

nginx負載均衡基於iphash的session黏貼

nginx負載均衡中RR和ip_hash策略分析一、nginx的upstream目前支援負載均衡方式的分配   1、RR(預設)  每個請求按時間順序逐一分配到不同的後端伺服器,假如後端伺服器down掉,能自動剔除。  例如:  upstream tomcats {  se

nginx負載均衡配置

war eal ade remote dock lis upstream doc 配置 http {   upstream docker {       server 192.168.88.106:10001;       server 192.168.88.1