🧊

nginxでPHPのセッション変数が効かない時は

  • Apacheではなくnginxをウェブサーバーに使っている
  • セッションに関する設定をした覚えがない

そんなあなた!

効かなくて当然です!ちゃんと設定してください!
そのライブラリが悪いんじゃありません!

20150131: 2年半ぶりですが、コメントをもらったので書き直しました!

事の発端

<?php
session_start();

$_SESSION["_test"]++;

echo $_SESSION["_test"]; // 何回リロードしても1

なんでやー!

現状を確認する

まず、そのページを動かしてるPHPのセッションに関する設定を確認します。

phpinfo();

安定のこのコマンドで、session.save_pathの指定をチェック。
パスの指定があれば、その場所を覚えておきます。

だいたい、/var/lib/php/session になってるのかな?
No valueの場合は、/tmp になります。

コード側で意図して変更してない限り、
php --ini ってしてphp.ini見つけて、中身見ても一緒なはず。

権限の確認

まずPHP

/tmpの場合は問題ないと思いますが、ファイルのパーミッションを確認します。
/var/lib/php/session だったとして。

cd /var/lib/php/
ls -la

すると、

drwxrwx--- 2 root apache 36864 10月 13 15:00 2012 session

この例だと、所有者はroot、グループはapacheです。

Nginxは

/etc/nginx/nginx.conf とか見ると、user って行があるはずで、そこのnginxのユーザーが書いてあるはずです。
だいたいは nginx そのままかな?

どちらも確認したので

もうおわかりかもですが、セッションのファイルを作ろうと思っても、
ユーザー: nginxは 所有者であるrootではないし、所有グループであるapacheにも属してないので、
権限がなくてファイル作れない -> セッションが効かないってわけです。

権限を追加

なので、この権限問題をなんとかすれば良いことがわかったので・・。

chown nginx /var/lib/php/session

ってして、nginx(のユーザー)に対しても、
ちゃんとセッションいじれるようにしてあげればOKですね。

もしくは、

chgrp nginx /var/lib/php/session

所有者ではなくて所有グループを変えてもOK。

試してないですが、nginxをapacheのグループに属するようにしてもOKな気がします。

コメントもらったコマンド

chown -R nginx.nginx /var/lib/php/session/
  • ユーザーだけでなく、所有グループもnginxに変更
  • その上、sessionディレクトリ以下の既存のセッションファイルの所有権も全部まとめて変更

前者に関しては、ユーザーかグループかどちらか変えればいい話なので、
片方でも良いし、両方変えても良いし、特になんとも。

後者の例は、無駄なのでは・・と思います。
このコマンドを実行するまで、その中にあるファイルにも権限はなかったはずで、
いまさらそれらにアクセスしようとする理由がない・・。
なんか理由があるんかしら?おまじない的な?