多臺memcache服務器(ubuntu)實現session共享

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

    發表評論
    所有評論
    還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
    相關文章