Home | 簡體中文 | 繁體中文 | 雜文 | 知乎專欄 | Github | OSChina 博客 | 雲社區 | 雲棲社區 | Facebook | Linkedin | 視頻教程 | 打賞(Donations) | About
知乎專欄多維度架構 微信號 netkiller-ebook | QQ群:128659835 請註明“讀者”

32.9. Session/Cookie

為什麼我要在這裡提Session和Cookie,這也大型站點必須要處理問題。

32.9.1. Session

在集群環境中與單伺服器是不一樣的,集群組成可分為調度伺服器和節點,節點數量不定,單個節點安裝有web伺服器,用戶每次訪問網站調度伺服器隨機分配一個節點給該用戶, 舉一個例子:用戶在網站上看新聞,點擊第一個連接被分配到node 1上去,當他看完這條新聞並單擊下一條時,可能被分配到其它節點上,這裡剛纔建立的session在node 1上, 它就會因失去session而必須重新登錄。

所以我們要同步所有節點上的Session, 另外如果能用Cookie代替Session的地方儘量使用Cookie。

32.9.2. Session 共享

解決方案:

  1. 不用Session,使用Cookie取而代之

  2. 共享Session,放到資料庫中,放到Memcache中

PHP Session很有解決方案:

查看PHP手冊 Session Extensions 章節,重寫Session邏輯。

共享Session用Memcache,在php.ini中配置即可

session.save_handler = memcache
session.save_path = tcp://127.0.0.1:10001
			

32.9.3. Cookie

Cookie 我這裡提到cookie是可以實現“單點登錄”功能。

一個網站可能不指一組集群系統,如news.example.org, bbs.example.org, blog.example.org 要實現在一處登錄即可在其它站點上同時也處于登錄狀態,就要用到Cookie來實現。

32.9.3.1. Cookie 安全

Cookie存儲在用戶端,Cookie數據極易偽造。下面提供幾個方案。

  • 在Cookie數據上加干擾詞

  • 在反向代理上做手腳

  • 負載均衡設備都提供Cookie保護功能

32.9.3.2. cookie-free domains

32.9.3.3. P3P

header('P3P: CP="CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"');

				
<?php
header('P3P: CP="CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"');
setcookie("test", $_GET['id'], time()+3600, "/", ".a.com");
?>