interprism's blog

インタープリズム株式会社の開発者ブログです。

Apache-PassengerEnabled と Nginx-passenger_enabled 設定の挙動の違い

要点

デフォルト値が異なる.

使い方も違ってくる. 必須の設定は

  • Apache の Passenger 不要なコンテクストで PassengerEnabled off
  • Nginx の Passenger 必要なコンテクストで passenger_enabled on

対象のコンテクストに漏れなく on|off を設定すれば問題ないが, 上記のケースで漏れると動作不良の可能性がある.

検証

garage/apache-passenger-off-for-subdir at main · nisyuh/garage · GitHub garage/nginx-passenger-off-for-subdir at main · nisyuh/garage · GitHub

Apache 環境Nginx 環境 をそれぞれ Docker で用意. Rails/Laravel を開発用のウェルカムページを表示するようにインストールし, URIパスのルートアクセス /Rails, サブディレクトリアクセス /laravel/ で Laravel がレスポンスするようにした. Rails のコンテクストは Passenger が必要, Laravel のコンテクストは Passenger が不要となる.

設定を調整する (1 2 3 4) と以下の挙動が確認できる.

  • Apache
    • RailsPassengerEnabled onなくても / アクセスでレスポンス OK
    • Laravel は PassengerEnabled offなければ /laravel/ アクセスでレスポンス NG
  • Nginx
    • Railspassenger_enabled onなければ / アクセスでレスポンス NG
    • Laravel は passenger_enabled offなくても /laravel/ アクセスでレスポンス OK

お気持ち

業務で直面した状況では, Apache 環境で複数の Rails アプリ(Redmine) が / やサブディレクトリアクセス可能なのに, 新規追加した Laravel アプリのサブディレクトリアクセスだけが失敗. 検索してみると Apache 環境で Passenger が想定外に効いて問題になる例は散見される 1 2.

現場では深く考えず Laravel へのアクセスでは Passenger を無効にしてやり過ごしたが, 実は PassengerEnabled on を明示してない Rails アプリも Passenger で稼働したり, 追検証で不用意に Nginx 環境を使って想定外の動作...と混乱. 最終的にドキュメントで問題が整理できたので今回の投稿ネタにした.

Apache/Nginx の Passenger 環境を渡り歩くレアケースの足しに.

社員番号b082

PAGE TOP