現在作成しているWebアプリケーションで定期的(数分位?)にセッション情報(sessionsに保存してたはずの情報がnilになっている)が消える問題に遭遇。
自分のWebアプリケーションは実環境ではnginx+passenger+sinatraっていう構成で動かしている。ただし、ローカル(thin+sinatra)では現象が発生してはいない。
nginxのログを見ているとセッションの情報が消えるタイミングで丁度passengerのプロセスが切り替わっている(PassengerPoolIdleTimeを経過したから?)ように見えた。これらの状況からマルチプロセスな環境で起きる問題っぽいと推測。
でもSinatraのセッション情報はデフォルトだとRack::Session::Cookieが使われるのでマルチプロセスであってもセッション情報は共有できるんじゃないのか...
と思ってSinatraのドキュメントを見返してたら以下の文章を見つけた。
セキュリティ向上のため、クッキー内のセッションデータはセッション秘密鍵(session secret)で署名されます。Sinatraによりランダムな秘密鍵が個別に生成されます。しかし、この秘密鍵はアプリケーションの立ち上げごとに変わってしまうので、すべてのアプリケーションのインスタンスで共有できる秘密鍵をセットしたくなるかもしれません。
...
けど明示的にsession secret指定してるから大丈夫なはずなんだけど、、、ってコード見返したら見事に指定の仕方間違えてた。
これを指定してから問題再現しなくなったので恐らくこれが問題だったのかと...
Sinatra - セッションの使用
http://www.sinatrarb.com/intro-ja.html#%E3%82%BB%E3%83%83%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AE%E4%BD%BF%E7%94%A8
Phusion Passenger users guide, Nginx version - PassengerPoolIdleTime
https://www.phusionpassenger.com/documentation/Users%20guide%20Nginx.html#PassengerPoolIdleTime