目的
AWS環境でPHPアプリケーション用のsessionを ElastiCacheを利用する
目次
手順の概要
- PhpRedisのインストール
- php.iniの編集
- 保持された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
1 2 3 |
# phpize # ./configure [--enable-redis-igbinary] # make && make install |
php.iniの編集
下記に記載に従って、PHP Session handler設定を追記・変更
https://github.com/phpredis/phpredis#php-session-handler
1 2 |
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 を起動
1 |
# redis-cli -h XXX-redis.XXXX.apne1.cache.amazonaws.com -p 6379 |
リアルタイムにsession状態の確認
1 2 3 4 5 |
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..." ... |
セッション保持数の確認
1 2 3 4 5 6 7 |
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" ... |
セッション内容の確認
1 2 |
redis XXX-redis.XXXX.apne1.cache.amazonaws.com:6379> GET "PHPREDIS_SESSION:v6j53fu5mq2elsa6kc6lboc3a6" "Config|a:3:{s:9:\"userAgent\";s:32:\"e445973fcce25f23d8d6029b9598... |
セッション有効期限の確認
1 2 3 4 5 |
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
1 |
session.gc_maxlifetime = 1440 |
まとめ
Amazon ElastiCacheを利用する事で、高負荷時のファイルI/OやDB負荷を少しでも減らす対策を簡単に行う事が出来ました。