この記事には広告を含む場合があります。
記事内で紹介する商品を購入することで、当サイトに売り上げの一部が還元されることがあります。
目次
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)の再起動を忘れずに行って下さい。
1 2 3 4 5 6 7 |
[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" |
セキュリティグループを設定する
セキュリティグループのカスタム TCP で11211ポートへのアクセスを許容します。セッションを共有する全てのサーバーのローカルIPアドレスを設定しましょう。
セッションが共有できなかった場合
久しぶりに複数のサーバーでセッションを共有してみたところ、上手く動作しなかったのでその際の対処法も念のため載せておきます。
僕が確認した際のセッションが共有できなかった原因は、memcached のセキュリティ設定でした。
1 2 3 4 5 6 7 8 9 10 11 |
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. |
1 2 3 4 5 6 7 8 9 10 11 |
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」からアクセスのみ許可されていることが分かります。
1 2 3 4 5 6 7 |
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」の設定ファイルにある
1 2 3 4 |
# 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 |
1 2 3 4 5 6 7 8 9 10 11 |
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
1つ目にIPアドレスだけ有効になる。上記の場合だと「127.0.0.1」のみ有効。
〇パターン2
エラーで発生して、memcached が起動せず。
〇パターン3
-l 172.31.11.101
-l 172.31.11.102
エラーで発生して、memcached が起動せず。
さいごに
AWS にて PHP のセッション情報の共有方法を記載しましたが、他の環境でも主なやり方は同じになりますのでご自身の環境に合わせて設定してみてください。
なおセッションの共有の仕方は他にも Redis や NoSQL など複数の対応方法があるのでまた機会があれば紹介したいと思います。