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
- 伺服器 3
Name: lamp03
Public IP: 3.3.3.3
Private IP: 10.3.3.3
- lamp環境的安裝這裡不做具體介紹,可以閱讀 這篇文章
memcache的具體配置
第一步,安裝php-memcache子產品
檢視可用的php子產品指令:
php下有兩個memcache的包,分别是php5-memcache和php5-memcached,可以認為php5-memecache為memcachd的輕量化版本,安裝指令如下:apt-cache search php5-
執行指令後,memcached服務就安裝好了,服務預設監聽localhost(127.0.0.1),如果我們想要配置多台session的共享,必須接受私網下其他ip的請求,修改監聽ip為私網ip,打開伺服器1(lamp01)配置檔案apt-get install php5-memcache memcached
找到如下配置:/etc/memcached.conf
修改為-l 127.0.0.1
伺服器2,3作同樣修改,修改後記得重新開機memcached服務,配置生效。-l 10.1.1.1
第二步,修改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服務。
第四步,測試
session.php檔案内容如下:sudo vi /var/www/html/session.php
使用curl請求模拟http請求:<?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'] = ; } 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 -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
關閉memcache服務: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 )
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