多台memcache服务器(ubuntu)实现session共享
来源:互联网 发布:简单企业网站源码 编辑:程序博客网 时间:2024/05/29 00:31
memcache介绍
memcache是一个内存级别的分布式的高速缓存系统,相对来说,要比磁盘存储高效的多。使用memcache存储有利于memcache有多种语言环境下的实现方案,这里以LAMP环境下的session共享为例。
默认情况下,php环境下session以文件形式保存至磁盘中,其配置在php.ini文件中:
session.save_handler = filessession.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
- 多台memcache服务器(ubuntu)实现session共享
- 负载均衡下的多台tomcat服务器,通过memcache实现session共享
- PHP + Memcache 实现多服务器session共享
- PHP + Memcache 实现多服务器session共享
- PHP + Memcache 实现多服务器session共享
- PHP + Memcache 实现多服务器session共享
- PHP实现多服务器session共享之memcache共享
- PHP实现多服务器session共享之memcache共享
- PHP实现多服务器session共享之memcache共享
- PHP实现多服务器session共享之memcache共享
- 多台服务器共享session
- PHP + Memcache 实现多服务器session共享 (补充)
- memcache实现session共享
- 多台web服务器之间共享session
- 多台服务器之间共享session
- 多台服务器之间共享session
- 多台web服务器之间共享session
- 多台web服务器之间共享session
- NFC
- Cookies,SSL,httpclient的多线程处理,HTTP方法
- 每个电子工程师都必须面对的15个问题
- HTTP协议的请求头和响应头讲解
- 嵌入式Linux文件系统介绍
- 多台memcache服务器(ubuntu)实现session共享
- ie 9 ie8 plupload 上传按钮问题 处理
- 微软的Oxford工程计划在应用中使用智能化
- C开发实战(弱指令生成器)
- 概率占据图算法(POM)介绍
- 设计模式读书笔记-----抽象工厂模式
- JQuery操作DOM元素
- loadView和viewDidLoad及initWithNibName/awakeFromNib/initWithCoder
- jdbc与mysql的连接错误解决——“Connect failed: Access denied for user 'root'@'localhost' (using password: YES)”