FreeBSDで、Apache2.4.10+mpm-event+mod_proxy_fcgi+php56 php-fpmで四苦八苦したメモ。

ある日ふと思い立って、PHP5.6を使い始める。

PHP 5.6を入れるついでに、Apacheも2.4に上げよう。

Apache 2.4ならMPMもeventだな。

mod_php5は使えない事もないけど面倒だな… 

よし、PHP-fpmにしよう。

と、色々調べると情報はいくつかあるのですが、一番多いのは、

<FilesMatch ".*\.php$">
ProxyPass fcgi://127.0.0.1:9000
</FilesMatch>

tという記述ばかりで、これだと色々と不具合があるんですよね。

先ず、正規表現が不味くてPATH_INFOを使うようなパターンが駄目。

PATH_INFOを使うような場合は、".*\.php(/.*)$"とするべし。

で、これでPATH_INFOが渡ったと思ったら、今度はSCRIPT_FILEがおかしかったり。なにやら色々バグなのか仕様なのか切り分けが大変そう。

もっと単純にお手軽に、なぜ、ハンドラとして出来ないノか…

そう思ってたら、ありました。

mod_proxy_handler

ソースとしては短いので試して見たら、

AddHandler "proxy:fcgi://127.0.01:9000/" .php

とすることで、いままでのPHPと同じ動作するようになりました。(AddHandlerは危険だから、FileMatchとSetHandlerを使え という意見もありますがそれは無視)

で、ここで終わりだったらいいんですが、更にオチがあり。

mod_proxyの英語版のマニュアルページを見ると(日本語訳ページはどうも2.2のmod_proxyの単純コピー臭い)

なんと、Apache2.4.10のmod_proxyには、このハンドラ定義が出来るようになってた訳です。mod_proxy_handlerさん短い付き合いでした…

mod_proxy_handler や mod_proxy の ハンドル化を通すと ProxyPass や ProxyPassMatch 等を通す時と異なり、PATH_INFOやSCRIPT_FILE等も正しく渡るようになります。

mod_proxy_fcgi+php-fpmの最大の欠点は、.htaccessにphp_value等を設定してた場合に、それが渡らない、mod_php5が無いならエラーになってしまう。という点ですかね。コレばっかりは仕方ない。