要点
デフォルト値が異なる.
- Apache PassengerEnabled はデフォルト
on
- Nginx passenger_enabled はデフォルト
off
使い方も違ってくる. 必須の設定は
- 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
- Rails は
PassengerEnabled on
がなくても/
アクセスでレスポンス OK - Laravel は
PassengerEnabled off
がなければ/laravel/
アクセスでレスポンス NG
- Rails は
- Nginx
- Rails は
passenger_enabled on
がなければ/
アクセスでレスポンス NG - Laravel は
passenger_enabled off
がなくても/laravel/
アクセスでレスポンス OK
- Rails は
お気持ち
業務で直面した状況では, Apache 環境で複数の Rails アプリ(Redmine) が /
やサブディレクトリアクセス可能なのに, 新規追加した Laravel アプリのサブディレクトリアクセスだけが失敗.
検索してみると Apache 環境で Passenger が想定外に効いて問題になる例は散見される 1 2.
現場では深く考えず Laravel へのアクセスでは Passenger を無効にしてやり過ごしたが, 実は PassengerEnabled on
を明示してない Rails アプリも Passenger で稼働したり, 追検証で不用意に Nginx 環境を使って想定外の動作...と混乱.
最終的にドキュメントで問題が整理できたので今回の投稿ネタにした.
Apache/Nginx の Passenger 環境を渡り歩くレアケースの足しに.