memcache介紹
memcache是一個內存級別的分佈式的高速緩存系統,相對來說,要比磁盤存儲高效的多。使用memcache存儲有利於memcache有多種語言環境下的實現方案,這裏以LAMP環境下的session共享爲例。
默認情況下,php環境下session以文件形式保存至磁盤中,其配置在php.ini文件中:
session.save_handler = files
session.save_path = "N;/path"
如果在負載均衡環境中使用默認的session存儲及管理方式,session將不能共享,爲了避免用戶非正常的登錄及退出,必須設置用戶回話和指定服務器的關聯粘性,及一個用戶的所有會話在一臺服務器上完成。配置memcache就將解決這一問題,memcached中存儲PHP session具有能夠將它們發佈到運行Memcached的多個雲服務器,從而具有保持會話冗餘的優勢,即使某臺服務器掛掉,其他服務器也會直接接管會話,用戶體驗也會更好。
環境準備
這裏以三臺安裝有LAMP服務環境的服務器爲例:
服務器 1
Name: lamp01
Public IP: 1.1.1.1
Private IP: 10.1.1.1
服務器 2
Name: lamp02
Public IP: 2.2.2.2
Private IP: 10.2.2.2
Name: lamp03
Public IP: 3.3.3.3
Private IP: 10.3.3.3
lamp環境的安裝這裏不做具體介紹,可以閱讀這篇文章
memcache的具體配置
第一步,安裝php-memcache模塊
查看可用的php模塊命令:
apt-cache search php5-
php下有兩個memcache的包,分別是php5-memcache和php5-memcached,可以認爲php5-memecache爲memcachd的輕量化版本,安裝指令如下:
apt-get install php5-memcache memcached
執行命令後,memcached服務就安裝好了,服務默認監聽localhost(127.0.0.1),如果我們想要配置多臺session的共享,必須接受私網下其他ip的請求,修改監聽ip爲私網ip,打開服務器1(lamp01)配置文件 /etc/memcached.conf
找到如下配置:
-l 127.0.0.1
修改爲
-l 10.1.1.1
服務器2,3作同樣修改,修改後記得重啓memcached服務,配置生效。
第二步,修改memcache爲php session的存儲及管理方案
在服務器1上打開配置文件 /etc/php5/apache2/php.ini
,做以下修改
session.save_handler = memcache
session.save_path='tcp://10.1.1.1:11211,tcp://10.2.2.2:11211,tcp://10.3.3.3:11211'
11211 爲memcached服務監聽的默認端口。
服務器2,3如上做相同配置。
第三步,配置memcache的session冗餘
在服務器1上打開memcache配置文件:
vi /etc/php5/mods-available/memcache.ini
增加如下指令配置:
memcache.allow_failover=1
memcache.session_redundancy=4
memcache.session_redundancy
指令的值等於實際memcache服務器數量加1,這是php的一個bug,詳看bug in PHP
在服務器2,3做相同配置,並重啓apache服務。
第四步,測試
sudo vi /var/www/html/session.php
session.php文件內容如下:
<?php
header('Content-Type: text/plain');
session_start();
if(!isset($_SESSION['visit']))
{
echo "This is the first time you're visiting this server\n";
$_SESSION['visit'] = 0;
}
else
echo "Your number of visits: ".$_SESSION['visit'] . "\n";
$_SESSION['visit']++;
echo "Server IP: ".$_SERVER['SERVER_ADDR'] . "\n";
echo "Client IP: ".$_SERVER['REMOTE_ADDR'] . "\n";
print_r($_COOKIE);
?>
使用curl請求模擬http請求:
curl -v -s http://1.1.1.1/session.php 2>&1 | grep 'Set-Cookie:'
輸出以下內容:
< Set-Cookie: PHPSESSID=8lebte2dnqegtp1q3v9pau08k4; path=/
執行命令:
curl --cookie "PHPSESSID=8lebte2dnqegtp1q3v9pau08k4" http://1.1.1.1/session.php http://2.2.2.2/session.php http://3.3.3.3/session.php
輸出:
Your number of visits: 1
Server IP: 1.1.1.1
Client IP: 117.193.121.130
Array
(
[PHPSESSID] => 8lebte2dnqegtp1q3v9pau08k4
)
Your number of visits: 2
Server IP: 2.2.2.2
Client IP: 117.193.121.130
Array
(
[PHPSESSID] => 8lebte2dnqegtp1q3v9pau08k4
)
Your number of visits: 3
Server IP: 3.3.3.3
Client IP: 117.193.121.130
Array
(
[PHPSESSID] => 8lebte2dnqegtp1q3v9pau08k4
)
關閉memcache服務:
sudo service memcached stop
curl --cookie "PHPSESSID=8lebte2dnqegtp1q3v9pau08k4" http://1.1.1.1/session.php
輸出:
Your number of visits: 4
Server IP: 1.1.1.1
Client IP: 117.193.121.130
Array
(
[PHPSESSID] => 8lebte2dnqegtp1q3v9pau08k4
)
會發現,即使關閉memcached服務,session仍存儲在服務器環境。
以上便是lamp環境下實現memcached session共享的主要步驟,當然爲了實現上面的結果,還要配置防火牆策略,保證各個服務器相關鏈接的暢通。
原文:How To Share PHP Sessions on Multiple Memcached Servers on Ubuntu 14.04