Ubuntu 14.04の複数のMemcachedサーバーでPHPセッションを共有する方法

前書き

Memcachedは、アクセスを高速化するために、ディスクではなくメモリに情報を保存する分散オブジェクトキャッシングシステムです。 PHPのMemcacheモジュールを使用すると、ファイルシステムに保存されるセッションを処理できます。 MemcachedにPHPセッションを保存することには、セッションの冗長性を維持するために、Memcachedを実行している複数のクラウドサーバーにそれらを配布できるという利点があります。

このMemcachedセットアップがなければ、アプリケーションが複数のサーバーで負荷分散されている場合、ロードバランサーでセッションスティッキ性を構成する必要があります。 これにより、ユーザーエクスペリエンスが維持され、突然ログオフされるのを防ぎます。 セッションを処理するようにMemcachedを構成すると、Memcachedプール内のすべてのクラウドサーバーが同じセッションデータのセットを持つようになり、セッションを保持するために1つのサーバーに固定する必要がなくなります。

前提条件

このチュートリアルは、https://www.digitalocean.com/community/tutorials/how-to-install-linux-apache-mysql-php-lamp-stack-on-ubuntu-14-04 [LAMPの設定に精通していることを前提としています。 Ubuntuのサーバー]。 +このセットアップでは、* Ubuntu 14.04 *イメージで3つのドロップレットを使用します。

*ドロップレット1 *

  • 名前:lamp01

  • パブリックIP:1.1.1.1

  • プライベートIP:10.1.1.1

*ドロップレット2 *

  • 名前:lamp02

  • パブリックIP:2.2.2.2

  • プライベートIP:10.2.2.2

*ドロップレット3 *

  • 名前:lamp03

  • パブリックIP:3.3.3.3

  • プライベートIP:10.3.3.3

ドロップレットを作成するときにhttps://www.digitalocean.com/community/tutorials/how-to-set-up-and-use-digitalocean-private-networking[Private Networking]チェックボックスがチェックされていることを確認します。 また、後で必要になるため、プライベートIPアドレスを書き留めておきます。

3つのサーバーすべてにLAMPをインストールします。

まず、リポジトリを更新してApacheをインストールします。

apt-get update
apt-get install apache2

PHPとApacheのmod_php拡張機能をインストールします。

apt-get install php5 libapache2-mod-php5 php5-mcrypt

詳細については、https://www.digitalocean.com/community/tutorials/how-to-install-linux-apache-mysql-php-lamp-stack-on-ubuntu-14-04 [この記事]を参照してください。

ステップ1-Memcacheパッケージのインストール

  • lamp01 *に、MemcachedデーモンとPHPのMemcacheモジュールをインストールします。

apt-get install php5-memcache memcached

PHPには、php5-memcacheとphp5-memcachedの2つのパッケージがあります(末尾の「d」に注意してください)。 最初のパッケージ(memcache)は、依存関係のない軽量なため使用します。 memcacheとmemcachedの比較を読んでください。

Memcachedサービスは、localhost(127.0.0.1)でのみリッスンします。 これは、プライベートネットワークからの接続を受け入れるように変更する必要があります。

nano /etc/memcached.conf

次の行を見つけます。

-l 127.0.0.1

このサーバーのプライベートIPアドレスでリッスンするように変更します。

-l

`+ memcached +`サービスを再起動します。

service memcached restart

他の2台のサーバーでこれらの手順を繰り返し、「+ 127.0.0.1+」を適切なプライベートIPアドレスに置き換えます。

  • lamp02 *

-l
  • lamp03 *

-l

2番目の2つのサーバーで `+ memcached +`サービスを再起動します。

ステップ2-MemcachedをPHPセッションハンドラーとして設定する

  • lamp01 *で、編集のために `+ php.ini`ファイルを開きます。

nano /etc/php5/apache2/php.ini

このファイルは、PHP-FPMインストールの `+ / etc / php5 / fpm / php.ini +`にあります。

以下の構成ディレクティブを見つけます。

session.save_handler =
session.save_path =

次のようにMemcacheを使用するように変更します。 `+ session.save_path +`で3つのプライベートIPアドレスすべてを使用します。

session.save_handler = memcache
session.save_path = 'tcp://:11211,tcp://:11211,tcp://:11211'

先頭のセミコロンを削除して、 `+ session.save_path +`のコメントを解除する必要がある場合があります。 Memcachedはこのポートでリッスンするため、各IPアドレスの後にポート番号* 11211 *を忘れずに入力してください。

他の2つのサーバーにまったく同じ設定を追加します。

  • lamp02 *で:

session.save_handler = memcache
session.save_path = 'tcp://:11211,tcp://:11211,tcp://:11211'
  • lamp03 *で:

session.save_handler = memcache
session.save_path = 'tcp://:11211,tcp://:11211,tcp://:11211'

この構成は、セッション共有が適切に機能するために、すべてのドロップレットで正確に同じである必要があります。

ステップ3-セッションの冗長性のためにMemcacheを構成する

  • lamp01 *で、 `+ memcache.ini +`ファイルを編集します。

nano /etc/php5/mods-available/memcache.ini

このファイルの最後に次の構成ディレクティブを追加します。

memcache.allow_failover=1
memcache.session_redundancy=4

セッション情報をすべてのサーバーに複製するには、 `+ memcache.session_redundancy `ディレクティブがmemcachedサーバーの数 1に等しくなければなりません。 これはhttps://bugs.php.net/bug.php?id=58585[PHPのバグ]によるものです。

これらのディレクティブはセッションのフェイルオーバーと冗長性を有効にするため、PHPはセッション情報を `+ session.save_path +`で指定されたすべてのサーバーに書き込みます。 RAID-1セットアップに似ています。

使用されているものに応じて、WebサーバーまたはPHP FPMデーモンを再起動します。

service apache2 reload
  • lamp02 および lamp03 *でこれらの手順を正確に繰り返します。

ステップ4-セッションの冗長性をテストする

このセットアップをテストするには、すべてのドロップレットで次の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を使用して最初のドロップレットでこのファイルにアクセスし、Cookie情報を抽出します。

curl -v -s http:///session.php 2>&1 | grep 'Set-Cookie:'

これにより、次のような出力が返されます。

< Set-Cookie: PHPSESSID=8lebte2dnqegtp1q3v9pau08k4; path=/

+ PHPSESSID + Cookieをコピーし、このCookieを使用して他のドロップレットにリクエストを送信します。 1440秒間リクエストが行われない場合、このセッションはPHPによって削除されるため、この時間内にテストを完了してください。 これについて詳しくは、PHPのhttp://php.net/manual/en/session.configuration.php#ini.session.gc-maxlifetime[session.gc-maxlifetime]をご覧ください。

curl --cookie "" http:///session.php http:///session.php http:///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
)

フェイルオーバーをテストするには、 `+ memcached +`サービスを停止し、このファイルにアクセスします。

service memcached stop

Dropletは、他の2つのサーバーに保存されているセッション情報を透過的に使用します。

curl --cookie "" http:///session.php

出力:

Your number of visits: 4
Server IP: 1.1.1.1
Client IP: 117.193.121.130
Array
(
   [PHPSESSID] => 8lebte2dnqegtp1q3v9pau08k4
)

セッションスティッキネスを設定する手間をかけずに、リクエストを均等に分散するようにロードバランサを設定できるようになりました。

テストが完了したら、 `+ memcached +`を再度開始します。

service memcached start

ステップ5-IPTablesでMemcachedを保護する

Memcachedがプライベートネットワークを使用している場合でも、同じデータセンター内の他のDigitalOceanユーザーは、プライベートIPを知っていればDropletに接続できます。 したがって、https://www.digitalocean.com/community/tutorials/how-to-set-up-a-firewall-using-iptables-on-ubuntu-14-04 [IPTablesルールの設定]のみを許可しますMemcachedプール内のクラウドサーバーが相互に通信します。

セッションの冗長性のテスト後にこの手順を実行しているため、誤ったルールが適用された場合に発生する可能性のある問題のトラブルシューティングが容易になります。

  • lamp02 および lamp03 のプライベートIPアドレスを使用して、 lamp01 *にファイアウォールルールを作成します。

iptables -A INPUT -s  -i eth1 -p tcp -m state --state NEW -m tcp --dport 11211 -j ACCEPT
iptables -A INPUT -s  -i eth1 -p tcp -m state --state NEW -m tcp --dport 11211 -j ACCEPT

典型的なLAMPサーバーでは、以下がルールの完全なセットになります。

iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 443 -j ACCEPT
iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
iptables -A INPUT -s  -i eth1 -p tcp -m state --state NEW -m tcp --dport 11211 -j ACCEPT
iptables -A INPUT -s  -i eth1 -p tcp -m state --state NEW -m tcp --dport 11211 -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT
iptables -P INPUT DROP
  • lamp02 lamp01 および lamp03 *のプライベートIPアドレスを使用してファイアウォールルールを入力します。

iptables -A INPUT -s  -i eth1 -p tcp -m state --state NEW -m tcp --dport 11211 -j ACCEPT
iptables -A INPUT -s  -i eth1 -p tcp -m state --state NEW -m tcp --dport 11211 -j ACCEPT
  • lamp01 および lamp02 のプライベートIPアドレスを使用して、 lamp03 *で同じことを行います。

iptables -A INPUT -s  -i eth1 -p tcp -m state --state NEW -m tcp --dport 11211 -j ACCEPT
iptables -A INPUT -s  -i eth1 -p tcp -m state --state NEW -m tcp --dport 11211 -j ACCEPT

*ステップ4 *のテストを繰り返して、ファイアウォールがトラフィックをブロックしていないことを確認します。

Related