読者です 読者をやめる 読者になる 読者になる

Passenger4.0.0RCでalways_restart.txtが効かない件について

zomです。 もうね、ぐったりするほどハマったので、他にもハマった人がいると思い投稿します。 【2014/04/05追記】 ※4.0.40では元に戻っていたのでタイトルなどバージョンについて細かく追記しました。

ちょっとsinatraでWebAPIでも作ろうと思い、お遊びPCでApache×Passenger4.0.0RC4×Ruby2.0.0で環境作ってみようと思いました。 で、Ruby2.0.0をインストールしPassengerもインストールし(ここらへんは後日別エントリで投稿します!たぶん!きっと!) 開発ができるようにはなりました。

しかし、プログラムをなにか変更をするたびにサーバ再起動を要します。 これでは、Apache何百回再起動することになるねん、ということで rackアプリケーションのルートディレクトリにtmp/restart.txtというのをtouchで作成してやればいいとのことです。 まー、そこらへんはpassenger restart.txtとかでググれば山ほど情報が出てくるので詳しくは書きません。

で、いちいちtouchするのもメンドいということで用意されているのが「always_restart.txt」というのがあります。 これはそのファイルがありさえすれば、毎回キャッシュを見ないみたいな挙動をしてくれます。

がっっっっっっっっ

肝心のこいつが効いてくれません!!!!Passenger4.0.0RC4だと!!!!

さて、先に解決方法をば。 rackアプリケーションのルートディレクトリ直下にalways_restart.txtを置くだけ。 効かなかった人、Passenger4.0.0RC5でもかな?これで行けると思います。 やってみてください。

さて、なんでディレクトリが変わっているのか?

Passenger3.0.x系のソースから抜粋。

if (options.restartDir.empty()) {
  restartDir = appRoot + "/tmp";
} else if (options.restartDir[0] == '/') {
  restartDir = options.restartDir;
} else {
  restartDir = appRoot + "/" + options.restartDir;
}

string alwaysRestartFile = restartDir + "/always_restart.txt";
string restartFile = restartDir + "/restart.txt";

Passenger4.0.0RCのソースから抜粋。

 if (options.restartDir.empty()) {
   restartFile = options.appRoot + "/tmp/restart.txt";
   alwaysRestartFile = options.appRoot + "/always_restart.txt";
 } else {
   restartFile = options.restartDir + "/restart.txt";
   alwaysRestartFile = options.restartDir + "/always_restart.txt";
 }

というわけでですね、3系では、特定のディレクトリの下にalwaysもrestartも置きますよ、という実装から 4.0.0RCではディレクトリを指定しなかった場合はルートディレクトリ直下にalways、ルートディレクトリ/tmpの下にrestart、という謎実装に変わってるのが原因でした。 これバグなのかな?issueに上げていいかどうかの判断がつかないけど、ドキュメントでカバーできる範囲だからそうでもないのかなー、というのが自分の意見です。 もし英語に堪能な人がいたら作者の方に、意図とか訊いてみてください>< すでにどこかに書いてあるのかもだけど…。

これで三日ほど何もできなかった…

【2014/04/05追記】 passenger4.0.40で挙動が変わってたっぽいのでソースを見てみたらtmpの下に戻ってました。

  if (options.restartDir.empty()) {
    restartFile = options.appRoot + "/tmp/restart.txt";
    alwaysRestartFile = options.appRoot + "/tmp/always_restart.txt";
  } else if (options.restartDir[0] == '/') {
    restartFile = options.restartDir + "/restart.txt";
    alwaysRestartFile = options.restartDir + "/always_restart.txt";
  } else {
    restartFile = options.appRoot + "/" + options.restartDir + "/restart.txt";
    alwaysRestartFile = options.appRoot + "/" + options.restartDir + "/always_restart.txt";
  }

4.0.0のRCがなくなったときもtmpの下じゃなくなってたはずなのに、結局元鞘ですかね?なんだったのか。