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模块命令:
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