[AWS]複数サーバーにてmemcachedでセッションを共有する方法

memcached_multi_server_top

この記事には広告を含む場合があります。

記事内で紹介する商品を購入することで、当サイトに売り上げの一部が還元されることがあります。

PHP のセッションを複数のサーバーで共有して使用する

サーバーを2台、3台と複数台で構成するとき、セッション情報の共有方法を考える必要があります。

いくつかある方法の中で memcached によるセッションの共有を選択される方が多いかと思います。そこで Amazon AWS の EC2 インスタンス + ELB 環境にて、memcached の手順をまとめていきます。

 

memcached の設定方法の流れ

AWS 環境のセッションを共有するする際に行う手順は、
・memcached を設定する
・セキュリティグループを設定する
の2つになります。

memcached の基本的な設定方法は

の記事を確認して下さい。

memcached の基礎設定が終わった段階で次の作業に移ります。

なお本記事のサーバー構成は下記の前提で行っています。

サーバー名 プライベートIPアドレス
サーバー1 dev1.example.com 172.31.11.101
サーバー2 dev2.example.com 172.31.11.102

※実際にテストを行っていますが、セキュリティ上の都合によりサーバー名とプライベートIPアドレスは調整しております。

 

memcached を設定する

PHP にて複数のサーバーでセッションを設定するときは、php.ini の「session.save_path」に対象のサーバーを複数設定します。設定が終わったら、PHP と Webサーバー(Apache や Nginx)の再起動を忘れずに行って下さい。

[Session]
; Handler used to store/retrieve data.
; http://php.net/session.save-handler
;session.save_handler = files //コメントアウト
;session.save_path = "/var/lib/php/session" //コメントアウト
session.save_handler = memcached
session.save_path = "172.31.11.101:11211,172.31.11.102:11211"
設定する IP アドレスは必ずプライベートIPアドレスを指定にしましょう。

 

セキュリティグループを設定する

セキュリティグループのカスタム TCP で11211ポートへのアクセスを許容します。セッションを共有する全てのサーバーのローカルIPアドレスを設定しましょう。
memcached_multi_server1

 

セッションが共有できなかった場合

久しぶりに複数のサーバーでセッションを共有してみたところ、上手く動作しなかったのでその際の対処法も念のため載せておきます。

僕が確認した際のセッションが共有できなかった原因は、memcached のセキュリティ設定でした。

root@dev1:# systemctl status memcached                                                                                                                    
● memcached.service - memcached daemon
   Loaded: loaded (/lib/systemd/system/memcached.service; enabled; vendor preset: enabled)
   Active: active (running) since Wed 2019-04-10 21:02:13 JST; 14min ago
     Docs: man:memcached(1)
 Main PID: 797 (memcached)
    Tasks: 10 (limit: 1120)
   CGroup: /system.slice/memcached.service
           └─797 /usr/bin/memcached -m 64 -p 11211 -u memcache -l 127.0.0.1 -P /var/run/memcached/memcached.pid

Apr 10 21:02:13 dev1.example.com systemd[1]: Started memcached daemon.
root@dev2:# systemctl status memcached                                                                                                                    
● memcached.service - memcached daemon
   Loaded: loaded (/lib/systemd/system/memcached.service; enabled; vendor preset: enabled)
   Active: active (running) since Wed 2019-04-10 21:02:15 JST; 15min ago
     Docs: man:memcached(1)
 Main PID: 800 (memcached)
    Tasks: 10 (limit: 1120)
   CGroup: /system.slice/memcached.service
           └─800 /usr/bin/memcached -m 64 -p 11211 -u memcache -l 127.0.0.1 -P /var/run/memcached/memcached.pid

Apr 10 21:02:15 dev2.example.com systemd[1]: Started memcached daemon.

上記のサーバー2台の設定を見てもらうと分かるように「127.0.0.1」からアクセスのみ許可されていることが分かります。

 

root@dev1:# telnet 172.31.11.102 11211
Trying 172.31.11.102...
telnet: Unable to connect to remote host: Connection refused

root@dev2:# telnet 172.31.11.101 11211
Trying 172.31.11.101...
telnet: Unable to connect to remote host: Connection refused

telnet コマンドを叩いてみるとポートの疎通確認が行えないことが分かります。

 

対処方法は「/etc/memcached.conf」の設定ファイルにある

# Specify which IP address to listen on. The default is to listen on all IP addresses
# This parameter is one of the only security measures that memcached has, so make sure
# it's listening on a firewalled interface.
-l 127.0.0.1

上記の箇所「-l 127.0.0.1」を「#」でコメントアウトして、memcached を再起動しました。

root@dev1:# systemctl restart memcached
root@dev1:# telnet 172.31.11.102 11211
Trying 172.31.11.102...
Connected to 172.31.11.102.
Escape character is '^]'.

root@dev2:# systemctl restart memcached
root@dev2:# telnet 172.31.11.101 11211
Trying 172.31.11.101...
Connected to 172.31.11.101.
Escape character is '^]'.

11211ポートでサーバー間の疎通確認ができるようになりました。

ちなみにセキュリティが弱くなるので下記の書き方を試してみましたが、いずれも正常には動作しませんでした。セキュリティグループの設定があるので問題はないですが、他の対処法が見つかれば追記します。

〇パターン1

-l 127.0.0.1 172.31.11.101 172.31.11.102

1つ目にIPアドレスだけ有効になる。上記の場合だと「127.0.0.1」のみ有効。

〇パターン2

-l 127.0.0.1,172.31.11.101,172.31.11.102

エラーで発生して、memcached が起動せず。

〇パターン3

-l 127.0.0.1
-l 172.31.11.101
-l 172.31.11.102

エラーで発生して、memcached が起動せず。

 

さいごに

AWS にて PHP のセッション情報の共有方法を記載しましたが、他の環境でも主なやり方は同じになりますのでご自身の環境に合わせて設定してみてください。

なおセッションの共有の仕方は他にも Redis や NoSQL など複数の対応方法があるのでまた機会があれば紹介したいと思います。

 

 

Linuxの知識については下記の本も参考になるので、スキルアップにお役立てください。

created by Rinker
三宅 英明 (著)、大角 祐介 (著)
ページ数: 440ページ
出版社:SBクリエイティブ
発売日:2015/06/06

出典:amazon