本篇文章給大家分享的內容是關於Nginx和php安裝及配置八之nginx session的共用,有著一定的參考價值,有需要的朋友可以參考一下
查了一些資料,看了一些別人寫的文檔,總結如下,實現nginx session的共用
PHP伺服器有多台,用nginx做負載平衡,這樣同一個IP訪問同一個頁面會被分配到不同的伺服器上,如果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存在資料庫(MySQL等)中
php可以配置將session儲存在資料庫中,這種方法是把存放session的表和其他資料庫表放在一起,如果mysql也做了叢集了話,每個mysql節點都要有這張表,並且這張session表的資料表要即時同步。
說明:用資料庫來同步session,會加大資料庫的IO,增加資料庫的負擔。而且資料庫讀寫速度較慢,不利於session的適時同步。
3、session存在memcache或者Redis中
memcache可以做分布式,php設定檔中設定儲存方式為memcache,這樣php自己會建立一個session叢集,將session資料存放區在memcache中。
說明:以這種方式來同步session,不會加大資料庫的負擔,並且安全性比用cookie大大的提高,把session放到記憶體裡面,比從檔案中讀取要快很多。但是memcache把記憶體分成很多種規格的儲存塊,有塊就有大小,這種方式也就決定了,memcache不能完全利用記憶體,會產生記憶體片段,如果儲存塊不足,還會產生記憶體溢出。
4、nginx中的ip_hash技術能夠將某個ip的請求定向到同一台後端,這樣一來這個ip下的某個用戶端和某個後端就能建立起穩固的session,ip_hash是在upstream配置中定義的:
[html] view plain copy
1. upstream nginx.example.com 2. { 3. server 192.168.74.235:80; 4. server 192.168.74.236:80; 5. ip_hash; 6. } 7. server 8. { 9. listen 80; 10. location / 11. { 12. proxy_pass 13. http://nginx.example.com; 14. } 15. }
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分流,剩下的走其它後端去。
相關推薦:
Nginx和php安裝及配置七之nginx負載平衡的5種策略
Nginx和php安裝及配置六之Nginx反向 Proxy和負載平衡部署指南
Nginx和php安裝及配置五之LINUX用PHPIZE安裝PHP GD擴充