Ubuntu 14.04 の Apache mod_proxy_fcgi で php 動かすのは厳しい話

2010 年代になってまだ Apache だの PHP だの使っているの?っていう突っ込みは却下です。 世の中には様々な事情を抱えた人がいるのです。生暖かく見守ってください。

さておき、Apache 2.2 の頃、FastCGIPHP を動作させるといえば 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 は以下のような問題があります。

  1. (ファイルシステムと関係がないプロクシーなので) DirectoryIndex が効かない
  2. (同じ理由で) .htaccess によるディレクトリごとの制御ができない
  3. PATH_INFO がおかしい。そのため PHPPHP_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

今日はこんなところで。

ymmt2005