PHP+Nginxでセッション時間の変更をするお作法

2017年11月21日

PHP サーバー テクノロジー プログラミング

セッション時間の変更をするやり方を検索すると、色々なサイトでPHP記述とサーバー側のphp.iniでの2パターンの記述が書かれているんですが、実際にその通りやっても上手く行かないことが多かったので、簡単セットする方法などを紹介します。

[基本] セッション時間の設定

基本的には、 「maxlifetime」のセッション有効期間の時間設定と、 「gc_probability」(分子)、 「gc_divisor」(分母)、この3つの設定を行うことで、設定ができます。 この3つについて解説すると、

maxlifetime

デフォルトは1440という値になっており、1440秒(=24分)間有効なのですが、この状態が短いというサービス構築はたくさん存在するでしょう。 値の設定値は以下を参考にするといいでしょう。
1時間: 3600 (60s x 60m) 1日: 86400 (60s x 60m x 24h) 1週間: 604800 (60s x 60m x 24h x 7d) 1ヶ月(30日): 2592000 (60s x 60m x 24h x 30d) 1年(365日): 31536000 (60s x 60m x 24h x 365d)
セッションは、セキュリティ保護の為に用意されている機能なので、あまり長期間にセットするのは如何なものかと思うのだが、多くのシステムで、サーバーサイドでのデータ保存として使う事が多いため、ユーザー利便性を考えて期間を設定する事が多いようです。

gc_probabilityとgc_divisor

デフォルト値 gc_probability:1 gc_divisor:100
これは、100分の1(1/100)の確率で有効期限の過ぎたセッションデータを削除していくという事で、サーバーの負荷軽減の為のデフォルト値になっているようです。 公開サーバーを運用してきた経験からすると、この1/100という曖昧設定と、1日1回の不要セッションデータ削除バッチがシステムで走りますが、実際には大量にセッションが削除されずに残っていることが多いようです。 サーバー負荷を考慮するのであれば、sessionを使わないというのが一番いいかもしれませんが、便利に使いたいのであれば、1/1という値にして、確実にセッション処理をした方がいいかもしれません。 なかなか悩ましい設定ですね。他サイトでは、1/1に変更する場合が多いですが、1/1000という風にするパターンでより負荷軽減をするのはどうなんでしょう?

サーバーサイドのPHP設定

php.iniに記述されている下記の値を変えてrestartしてあげるとそのサーバーでのデフォルト設定が完了します。
session.gc_maxlifetime = 86400 session.gc_probability = 1 session.gc_divisor = 1
デフォルト値を探して書き換えるのがいいでしょう。

phpプログラムでの設定

個人的には、サーバーのデフォルト値をイジるよりは、アプリケーション側でセットして、設定トラブルを無くした方がいいです。 "session_start();"を実行する前に下記記述をするだけでセット完了です。 ini_set('session.gc_maxlifetime', 86400); ini_set('session.gc_probability', 1); ini_set('session.gc_divisor', 1); session_start(); 同じサーバーでサービス毎にセッション時間を変えられるし、サーバー入れ替えの時に、デフォルト設定を忘れると、事故になりかねるので、プログラムサイドで行ったほうが確実でしょう。

[注意] SESSIONフォルダのパーミッション

実は、上記設定をしても、うまく繁栄されない場合があります。 Nginxが関係しているかどうかは不明ですが、現在利用しているNginx + PHPの環境で以下の対応をすることで解決できました。
$ chown nginx:nginx /var/lib/php/sessions
セッション保存環境をセッション値から変えてもいいですね。
ini_set('session.save_path', "./session");
こうしておけば、サービス毎にセッションデータが保持でき、削除ルールなども自由に変更できるので、良い設定でしょう。 ただ、セキュリティを考慮して、このフォルダアクセスにきちんと制限をつけてあげましょうね。

このブログを検索

ごあいさつ

このWebサイトは、独自思考で我が道を行くユゲタの少し尖った思考のTechブログです。 毎日興味がどんどん切り替わるので、テーマはマルチになっています。 もしかしたらアイデアに困っている人の助けになるかもしれません。