AWSでPHP7+ElastiCache(Redis)を利用したセッション保持

この記事は公開されてから半年以上経過しています。情報が古い可能性がありますので、ご注意ください。

目的

AWS環境でPHPアプリケーション用のsessionを ElastiCacheを利用する

目次

手順の概要

  1. PhpRedisのインストール
  2. php.iniの編集
  3. 保持されたsessionの確認

実行環境

  • ElastiCache (Redis)
  • AmazonLinux (2016.09を利用)
  • PHP7 (7.0.16を利用)
  • PHP-FPM (7.0.16を利用)
  • PhpRedis (3.1.1.RC1を利用)
    3.1.1無印を利用した事でセッション復元に問題が起きておりましたが、2017/05/29 現在 3.1.2 が出ているようです。

概要図

手順

PhpRedisのインストール

下記に記載に従って、gitにて取得後のディレクトリでコマンドを実行
https://github.com/phpredis/phpredis#installation

# phpize
# ./configure [--enable-redis-igbinary]
# make && make install

php.iniの編集

下記に記載に従って、PHP Session handler設定を追記・変更
https://github.com/phpredis/phpredis#php-session-handler

session.save_handler = redis
session.save_path = tcp://XXX-redis.XXXX.apne1.cache.amazonaws.com:6379"

作成された ElastiCacheのエンドポイントを記載します、SecurityGroupを空けておく事を忘れずに。
(Multi-AZ with Auto-Failoverにて冗長化したいので、cache.m3.medium 以上のサイズを選択する必要があります)

保持されたsessionの確認

sessionを利用しているアプリケーションを動作させ、正常に動作していれば、下記のように redis-cli から sessionが生成されている事を確認できます。

redis-cli を起動

# redis-cli -h XXX-redis.XXXX.apne1.cache.amazonaws.com -p 6379

リアルタイムにsession状態の確認

redis XXX-redis.XXXX.apne1.cache.amazonaws.com:6379> monitor
OK
1484832049.345127 [0 172.31.31.67:43480] "get" "PHPREDIS_SESSION:2q8c1aqhpib3qfi9ihb0iuod01"
1484832049.379609 [0 172.31.31.67:43480] "setex" "PHPREDIS_SESSION:2q8c1aqhpib3qfi9ihb0iuod" "14400" "Config|a:3:{s:9:\"user..."
...

セッション保持数の確認

redis XXX-redis.XXXX.apne1.cache.amazonaws.com:6379> DBSIZE
(integer) 386
redis XXX-redis.XXXX.apne1.cache.amazonaws.com:6379> keys *
1) "PHPREDIS_SESSION:n66gtcfh8p8qla1of0iqho8iv2"
2) "PHPREDIS_SESSION:oos6ol0jtuhslc2rnsp3239uc2"
3) "PHPREDIS_SESSION:cfpu493kbae61bied6ta7nj2i1"
...

セッション内容の確認

redis XXX-redis.XXXX.apne1.cache.amazonaws.com:6379> GET "PHPREDIS_SESSION:v6j53fu5mq2elsa6kc6lboc3a6"
"Config|a:3:{s:9:\"userAgent\";s:32:\"e445973fcce25f23d8d6029b9598...

セッション有効期限の確認

redis XXX-redis.XXXX.apne1.cache.amazonaws.com:6379>  TTL "PHPREDIS_SESSION:ovr4n1atvr388t41pfd2mtsqa0"
(integer) 522
redis XXX-redis.XXXX.apne1.cache.amazonaws.com:6379>  TTL "PHPREDIS_SESSION:ovr4n1atvr388t41pfd2mtsqa0"
(integer) 520
...

コマンドを打つ度、TTL値がどんどん減っていく事を確認できます。

当初こちらの構成を組んだ際にSessionの自動削除がされるか不安でしたが、file / DBに持たせた時と同様
下記設定により自動的に削除されていく事を確認できました。

php.ini

session.gc_maxlifetime = 1440

まとめ

Amazon ElastiCacheを利用する事で、高負荷時のファイルI/OやDB負荷を少しでも減らす対策を簡単に行う事が出来ました。

投稿者プロフィール

takashi
開発会社での ASP型WEBサービス企画 / 開発 / サーバ運用 を経て
2010年よりスカイアーチネットワークスに在籍しております

機械化/効率化/システム構築を軸に人に喜んで頂ける物作りが大好きです。
個人ブログではRaspberryPiを利用したシステムやロボット作成も
実施しております。

スカイアーチネットワークスで一緒に働きましょう!

コメントを残す

メールアドレスが公開されることはありません。

Time limit is exhausted. Please reload CAPTCHA.

ABOUTこの記事をかいた人

開発会社での ASP型WEBサービス企画 / 開発 / サーバ運用 を経て 2010年よりスカイアーチネットワークスに在籍しております 機械化/効率化/システム構築を軸に人に喜んで頂ける物作りが大好きです。 個人ブログではRaspberryPiを利用したシステムやロボット作成も 実施しております。 スカイアーチネットワークスで一緒に働きましょう!