多台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

  • 服务器 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

    0 0
    原创粉丝点击