2010 年代になってまだ Apache だの PHP だの使っているの?っていう突っ込みは却下です。 世の中には様々な事情を抱えた人がいるのです。生暖かく見守ってください。
さておき、Apache 2.2 の頃、FastCGI で PHP を動作させるといえば mod_fastcgi や mod_fcgid を利用して、以下のような httpd.conf を作成していたわけです。
Alias /php5-fpm /usr/sbin/php5-fpm FastCgiExternalServer /usr/sbin/php5-fpm -host 127.0.0.1:9000 DocumentRoot /var/www <Directory /var/www> Options FollowSymLinks AllowOverride None Order deny,allow Allow from all DirectoryIndex index.php AddHandler php-fastcgi .php Action php-fastcgi /php5-fpm </Directory> ...
Apache 2.4 では FastCGI を扱えるモジュールが標準で利用できるようになりました。 mod_proxy_fcgi で、名前からわかる通り mod_proxy のサブモジュールです。
Ubuntu 14.04 で利用できる Apache 2.4.7 では以下のように設定します。
c.f. Setup Apache 2.4 and Php FPM with mod proxy fcgi on Ubuntu 13.10
ProxyPassMatch ^/(.*\.php(/.*)?)$ fcgi://127.0.0.1:9000/var/www/mysite/$1
Wow! たったこれだけ?! シンプル、最高!
そう思っていた時期が私にもありました。実際に試すまでのごく短い間でしたけど。
実際には mod_proxy_fcgi は以下のような問題があります。
- (ファイルシステムと関係がないプロクシーなので) DirectoryIndex が効かない
- (同じ理由で) .htaccess によるディレクトリごとの制御ができない
PATH_INFO
がおかしい。そのため PHP のPHP_SELF
サーバー変数もおかしい
PHP :: Bug #65641 :: PHP-FPM incorrectly defines the SCRIPT_NAME variable when using Apache
特に最後のは致命的なケースもあるでしょう。
Apache でもこれらの問題を認識して、ファイルの Handler にプロクシーを利用できるように改良しています。 改良された 2.4.10 以降では、以下のような設定が書けます。
<Directory /var/www/html> DirectoryIndex index.php Require all granted <FilesMatch \.php$> SetHandler "proxy:fcgi://127.0.0.1:9000/" </FilesMatch> </Directory>
これで問題は全部解決します。 Ubuntu 14.04 の Apache 2.4.7 だけど、どうしてもこの機能が欲しいというそこのあなたのために、パッチを用意しました。
proxy handler support backport from 2.4.10 to 2.4.7 for Ubuntu 14.04
パッチをあてた deb は、以下のようにして作れます。
$ apt-get source apache2 $ sudo apt-get -y install build-essential fakeroot $ sudo apt-get -y build-dep apache2 $ cd apache2-2.4.7 $ patch -p1 < mod_proxy.patch $ dpkg-buildpackage -rfakeroot -uc -b -j4
今日はこんなところで。