このセクションでは、PHP を Linux および Unix 系のシステム上の Apache HTTP Server 2.x にインストールする際の手引きと注意事項について説明します。
新規のインストールで mod_php
を使ってはいけません。
このページの手順は、過去の経緯を知るための参考として、また PHP を Apache httpd
のプロセスに直接組み込むことがどうしても必要な、まれなケースのために残されています。
最近のデプロイ環境であれば、どんな場合でも
PHP-FPM (FastCGI Process Manager)
を Apache httpd の mod_proxy_fcgi
モジュールと組み合わせて使いましょう。PHP-FPM を使うと、
リソース管理やプロセスの分離がより優れたものになり、
Apache httpd を再起動せずに PHP だけを再起動できるようになります。
また、Apache httpd の event MPM (Apache httpd 2.4
以降のデフォルト) とも互換性があります。
主要な Linux ディストリビューションは、この構成をデフォルトとして提供しています。
mod_php による方式では、PHP が Apache httpd
のすべてのワーカープロセスに直接組み込まれます。
PHP をスレッドセーフ (--enable-zts) でコンパイルしていない限り、
mod_php は prefork MPM を必要とし、
同時実行性が大きく制限されます。それでも mod_php
を使う場合は、パフォーマンスとセキュリティの面でどんな影響があるのかを
完全に理解しておく必要があります。
» Apache ドキュメンテーション は、Apache httpd 2.x サーバーに関する最も信頼できる情報源です。 Apache httpd のインストールオプションについてのより詳しい情報も、 そこで得られます。
最新バージョンの Apache httpd を » Apache ダウンロードサイト からダウンロードし、上述のいずれかのバージョンの PHP を用意してください。 この手引きでは Apache httpd 2.x で PHP を動作させるための 基本的な部分しかカバーしていません。さらに詳しい情報については、» Apache ドキュメンテーション を参照ください。 情報が古く不正確になってしまうため、以下では詳細なバージョン番号は 記述されていません。'NN' という文字列をご使用の Apache httpd のバージョンに適宜置き換えてください。
ここで説明する手順は Apache httpd 2.4 を対象としています。 Apache httpd がサポートしているリリースブランチは 2.4 だけです。 それより前のバージョン (2.2 以前) はサポートが終了しているため、 使ってはいけません。
注意:
PHP 8.4.0 以降、apache2handler SAPI は Apache 2.4 以降を必要とします。 EOL を迎えた Apache 2.0 および 2.2 のサポートは削除されました。
Apache httpd を上のサイトから取得して展開します。
tar -xzf httpd-2.x.NN.tar.gz
同じく、PHP のソースを取得して展開します。
tar -xzf php-NN.tar.gz
Apache httpd をビルドしてインストールします。Apache httpd のビルドに関する詳細は
Apache httpd のドキュメントを参照ください。
PHP をスレッドセーフ (--enable-zts) でコンパイルしていない限り、
mod_php は prefork MPM
を必要とすることに注意してください。かわりに PHP-FPM を使うつもりなら (推奨)、
デフォルトの event MPM をそのまま使い、
PHP-FPM のインストール手順
まで読み飛ばしてかまいません。
cd httpd-2_x_NN ./configure --enable-so --with-mpm=prefork make make install
以上で Apache httpd 2.x.NN が、モジュールの動的ロードと prefork MPM が有効になった状態で、/usr/local/apache2 にインストールされます。 インストールが正常か調べるには、以下のようにして Apache httpd サーバーを立ち上げます。
/usr/local/apache2/bin/apachectl start
/usr/local/apache2/bin/apachectl stop
PHP の configure を行います。ここでは、様々なオプションを指定し、 特定の拡張モジュールを有効にするといったカスタマイズを行います。 指定可能なオプションの一覧は、./configure --help を実行すると得られます。 以下に、Apache httpd と MySQL のサポートを有効にする、簡単な設定例を示します。
上で説明したように Apache httpd をソースからビルドした場合は、 apxs のパスも下の例のとおりになっているでしょう。しかし、 もし別の方法で Apache httpd をインストールした場合は apxs のパスを適切に変更しなければなりません。 ディストリビューションによっては、apxs の名前が apxs2 と変更されていることもあるので注意しましょう。
cd ../php-NN ./configure --with-apxs2=/usr/local/apache2/bin/apxs --with-pdo-mysql make make install
configure オプションを変更して再インストールする場合は、 configure, make, make install の手順を繰り返さなければなりません。 共有モジュールとしてコンパイルされた PHP を有効にするには Apache を再起動するだけです。Apache httpd の再コンパイルは不要です。
特に断りがない限り、make install は、» PEAR, phpize のような様々な 関連ツール、CLI 版 PHP などもインストールすることに注意してください。
php.ini ファイルを設定する
cp php.ini-development /usr/local/lib/php.ini
PHP の実行時設定を変更するには、.ini ファイルを編集します。
php.ini ファイルを他の場所に置きたい場合は、手順 5 で、
オプション --with-config-file-path=/some/path を使用します。
php.ini-development ではなく、php.ini-production を使用する場合は、PHP の 動作が変化しますので、ファイル中に記載されている変更点の一覧を確認する ようにしてください。
httpd.conf を編集し、PHP の共有モジュールをロードするよう設定します。
LoadModule 命令の右側に記述するパスは、システムの PHP 共有モジュール
を指している必要があります。上記の make install により既にこの設定は
追加されている場合もありますが、確認が必要です。
LoadModule php_module modules/libphp.so
Apache httpd が特定の拡張子のファイルを PHP としてパースするよう設定します。
たとえば、Apache httpd が拡張子 .php のファイルを PHP としてパースするようにします。
単に AddType ディレクティブを使うだけで済ませるのではなく、
悪意を持ってアップロード (あるいは作成) された exploit.php.jpg
のようなファイルが PHP として実行されてしまわないようにしたいものです。
この例では、PHP としてパースさせたい任意の拡張子を追加していくだけです。
ためしに .php を追加してみましょう。
<FilesMatch \.php$>
SetHandler application/x-httpd-php
</FilesMatch>
あるいは、拡張子 .php, .php2,
.php3, .php4, .php5,
.php6, .phtml
のファイルだけを PHP として実行したい場合は、以下のようにします。
<FilesMatch "\.(php[2-6]?|phtml)$">
SetHandler application/x-httpd-php
</FilesMatch>
拡張子 .phps のファイルを php ソースフィルタに処理させて
構文ハイライトつきのソースコードとして表示させるには、このようにします。
<FilesMatch "\.phps$">
SetHandler application/x-httpd-php-source
</FilesMatch>
他にハンドラが見つからないときのデフォルトのハンドラとして PHP ファイルを使いたい場合
(ルーティングエンジンを使うときなど)は、FallbackResource ディレクティブが使えます。
SetHandler ディレクティブはファイルが存在するかどうかにかかわらず適用され、
FallbackResource はハンドラがまだ設定されていない場合にのみ適用されます。
そのため、ファイルが存在する場合にのみハンドラが適用されるようにするには、
If ディレクティブを使う必要があるかもしれません。
こうすることで、.php で終わるものの、実際にはファイルが存在しないパスを
FallbackResource で処理できるようになります。これは、エラー処理やルーティングに便利でしょう。
<FilesMatch "\.php$">
<If "-f %{REQUEST_FILENAME}">
SetHandler application/x-httpd-php
</If>
</FilesMatch>
FallbackResource /index.php
mod_rewrite を使うと、.phps ファイルに名前を変えたりコピーしたりしなくても
任意の .php ファイルを構文ハイライトつきのソースコードとして表示させることができます。
RewriteEngine On RewriteRule (.*\.php)s$ $1 [H=application/x-httpd-php-source]
php ソースフィルタは、実運用環境では無効にしておかなければなりません。 有効にしてしまうと、ソースコードに埋め込まれた機密情報や重要情報が漏れてしまう危険があります。
Apache httpd を、通常の手順通り、起動させます。
/usr/local/apache2/bin/apachectl start
または、以下の手順でも起動できます。
service httpd restart
上記の手順で、Apache httpd ウェブサーバー上で
SAPI モジュールとして PHP を動作させることができます。Apache httpd と PHP の双方とも、もっと多くの configure オプションを指定することが出来ます。
詳しい情報を得るには、ソースツリーディレクトリで ./configure --help を実行してください。
注意: MPM の互換性
PHP を Zend Thread Safety (
--enable-zts) でコンパイルしていない限り、mod_phpはpreforkMPM を必要とします。 その理由については、マルチスレッド MPM の Apache httpd を使う場合についての FAQ の項目を参照してください。ディストリビューションが提供する
mod_phpパッケージのほとんどは ZTS でビルドされていないため、通常はpreforkが必要になります。 マルチスレッド MPM が必要な場合 (負荷がかかる状況ではパフォーマンスが向上するため推奨されます) は、 かわりに PHP-FPM とmod_proxy_fcgiを使いましょう。
注意:
Apache MultiViews FAQ では、PHP でマルチビューを使う方法について解説しています。