Nginx与Serssion一致性问题
2019獨角獸企業重金招聘Python工程師標準>>>
http協議是無狀態的,即你連續訪問某個網站100次和訪問1次對服務器來說是沒有區別的,因為它記不住你。那么在一些場合,確實需要服務器記住當前用戶怎么辦?比如用戶登錄郵箱后,接下來要收郵件、寫郵件,總不能每次操作都讓用戶輸入用戶名和密碼,為了解決這個問題,session的方案就被提了出來,事實上它并不是什么新技術,而且不能脫離http協議以及任何現有的web技術
session的常見實現形式是繪畫cookie(session cookie),即未設置過期時間的cookie,這個cookie的默認生命周期為瀏覽器會話期間,只要關閉瀏覽器窗口,cookie就消失了。實現機制是當用戶發起一個請求的時候,服務器會檢查該請求中是否包含sessionid,如果未包含,則系統會創造一個名為JESSIONID的輸出cookie返回給瀏覽器(只放入內存,并不存在硬盤中),并將其以HashTable的形式寫到服務器的內存里面;當已經包含sessionid時,服務端會檢查找到與該session相匹配的信息,如果存在則直接使用該sessionid,若不存在則重新生成新的session。這里需要注意的是session始終是由服務端創建的,并非瀏覽器自己生成的。但是瀏覽器的cookie被禁止后session就需要用get方法的URL重寫的機制或使用POST方法提交隱藏表單的形式來實現。
session共享
首先我們應該明白,為什么要實現共享,如果你的網站是存放在一個機器上,那么是不存在這個問題的,因為會話數據就在這臺機器上,但是如果你使用負載均衡吧請求分發到不同的機器呢?這個時候會話id在客戶端是沒有問題的,但是如果用戶的兩次請求到了兩臺不同的機器上,而它的session數據可能存在其中一臺機器,這個時候就會出現取不到session的情況,那么如何實現session的共享就成了一個問題
-
session一致性解決方案
- IP綁定
- nginx的ip_hash實現,同一個ip的調度
- session黏性
- Tengine支持,同一個session的調度
- session復制集群
- Tomcat 本身帶有復制session的功能(實現比較復雜,有興趣自己查閱相關資料,使用比較少)
- 共享session
- 需要轉么管理session的軟件,msm(memcached-session-manager)
- memcached緩存服務,可以和tomcat整合,幫助tomcat共享管理session
- 需要轉么管理session的軟件,msm(memcached-session-manager)
- IP綁定
-
nginx IP綁定配置
- 會話保持(session黏性)
- ngx_http_upstream_session_sticky_module
- 該模塊屬于負載均衡模塊,通過cookie實現客戶端與后端服務器的會話保持,在一定條件下可以保證同一個客戶端訪問的都是同一個后端服務器。
- mode 設置cookie的模式
- insert:在回復本模塊通過set-Cookie頭直接插入相應名稱的cookie。
- prefix:不會生成新的cookie,但會在響應的coolie值前面加上特定的前綴,當瀏覽器帶著這個有特定標識的cookie再次請求時,模塊傳給后端服務前先刪除加入的前綴,后端服務拿到的還是原來的cookie值,這些動作對后端透明。如:“Coolie:Name=SRV~VALUE”。
- rewrite:使用服務端標識覆蓋后端設置的用于session sticky的cookie。如果后端服務在響應頭中沒有設置該cookie,則認為該請求不需要進行session sticky,使用這種模式。后端服務可以控制哪些請求西藥session sticky,哪些請求不需要
- tengine 具有session sticky功能
轉載于:https://my.oschina.net/rosetta/blog/745210
總結
以上是生活随笔為你收集整理的Nginx与Serssion一致性问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 选择行业还是技术?
- 下一篇: Spring4.3+Webscket 实