ApacheとPHP-FPM(FastCGI Process Manager)を連携させることで、高速で効率的なPHPアプリケーションの実行環境を構築できます。
従来のApache + mod_php構成では、Apacheが直接PHPを処理しますが、PHP-FPMを使用することで、PHPの処理をApacheとは別プロセスとして実行し、パフォーマンスの向上や負荷分散が可能になります。これにより、リソースの消費を抑えながら、複数のリクエストに迅速に対応できる環境が実現します。
本記事では、ApacheとPHP-FPMの概要から、必要なパッケージのインストール、各種設定ファイルの記述方法、VirtualHostの設定例、動作確認、さらにはセキュリティ強化のポイントまで、具体的な手順を分かりやすく解説します。
最後に、WordPressやLaravelといった人気のPHPフレームワークをPHP-FPM環境で動作させる方法についても触れていきます。これからApache + PHP-FPMの導入を考えている方は、ぜひ参考にしてください。
ApacheとPHP-FPMの概要と必要性
Apacheは世界中で広く使用されているWebサーバーであり、PHPは動的なWebサイトやアプリケーションの構築に欠かせないスクリプト言語です。従来はApacheのmod_phpモジュールを用いてPHPを処理していましたが、大規模なトラフィックや高負荷の環境ではパフォーマンスの限界が指摘されてきました。
PHP-FPM(FastCGI Process Manager)は、PHPスクリプトの処理をApacheの外部プロセスとして実行する仕組みで、ApacheはPHP-FPMにリクエストを転送する役割を担います。これにより、以下のようなメリットが得られます。
Apache + PHP-FPMのメリット
- パフォーマンス向上:PHP-FPMはリクエストごとにプロセスを再起動せず、プールされたプロセスが再利用されるため、処理速度が向上します。
- スケーラビリティ:プロセス数を柔軟に制御できるため、高トラフィック時でもスムーズな処理が可能です。
- セキュリティ強化:mod_phpと異なり、PHPをApacheから分離することで、サーバー全体のセキュリティリスクが軽減されます。
- メモリ効率の向上:必要なときにプロセスを生成・破棄する仕組みのため、メモリ消費が抑えられます。
どのような環境で必要か
ApacheとPHP-FPMの連携は、以下のような環境に適しています。
- アクセス数の多いWebサイト:複数のリクエストを効率的に処理したい場合。
- CMSやフレームワークを使用したサイト:WordPressやLaravelなど、PHPを多用するアプリケーションの高速化が求められる場合。
- セキュリティ重視の環境:ApacheとPHPのプロセスを分離することで、サーバー全体の安定性と安全性が向上します。
次のセクションでは、実際にApacheとPHP-FPMをセットアップするために必要なパッケージのインストール方法を解説します。
必要なパッケージのインストール方法
ApacheとPHP-FPMを連携させるには、適切なパッケージをインストールする必要があります。ここでは、主要なLinuxディストリビューションでのインストール方法を紹介します。
1. CentOS / RHEL系のインストール方法
# Apacheのインストール
sudo yum install httpd -y
# PHPとPHP-FPMのインストール
sudo yum install php php-fpm php-cli php-mysqlnd php-json -y
# ApacheのFastCGIモジュールをインストール
sudo yum install mod_proxy_fcgi -y
インストール後、サービスを起動します。
sudo systemctl start httpd
sudo systemctl start php-fpm
sudo systemctl enable httpd
sudo systemctl enable php-fpm
2. Ubuntu / Debian系のインストール方法
# Apacheのインストール
sudo apt update
sudo apt install apache2 -y
# PHPとPHP-FPMのインストール
sudo apt install php php-fpm php-cli php-mysql php-json -y
# ApacheのFastCGIモジュールをインストール
sudo a2enmod proxy_fcgi setenvif
sudo a2enconf php*-fpm
サービスの起動と自動起動設定を行います。
sudo systemctl restart apache2
sudo systemctl start php-fpm
sudo systemctl enable apache2
sudo systemctl enable php-fpm
3. インストール後の確認
インストールが完了したら、以下のコマンドでPHP-FPMとApacheのバージョンを確認します。
php-fpm -v
httpd -v # CentOS/RHEL系
apache2 -v # Ubuntu/Debian系
これで必要なパッケージのインストールは完了です。次のセクションでは、Apacheのモジュール設定(mod_proxy_fcgi)について詳しく解説します。
Apacheのモジュール設定(mod_proxy_fcgi)
ApacheとPHP-FPMを連携させるためには、mod_proxy_fcgiモジュールを有効化し、ApacheがPHP-FPMへリクエストを転送できるように設定する必要があります。ここでは、CentOS/RHEL系とUbuntu/Debian系の両方での設定方法を解説します。
1. CentOS / RHEL系の設定方法
mod_proxy_fcgiモジュールは、Apacheをインストールすると自動的に含まれています。インストール後に以下のコマンドでモジュールが有効になっているか確認します。
httpd -M | grep proxy_fcgi
表示例:
proxy_module (shared)
proxy_fcgi_module (shared)
もしmod_proxy_fcgiが表示されない場合は、以下のコマンドでインストールします。
sudo yum install mod_proxy_fcgi -y
その後、設定ファイルを編集してモジュールを有効化します。
sudo vi /etc/httpd/conf.modules.d/00-proxy.conf
次の行がコメントアウトされていれば、コメントを解除します。
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so
設定を反映するためにApacheを再起動します。
sudo systemctl restart httpd
2. Ubuntu / Debian系の設定方法
Ubuntu/Debianでは、以下のコマンドでmod_proxy_fcgiを有効化します。
sudo a2enmod proxy_fcgi setenvif
次に、PHP-FPMとの連携設定を追加します。
sudo a2enconf php*-fpm
設定を反映させるためにApacheを再起動します。
sudo systemctl restart apache2
3. 設定ファイルの確認
以下のディレクトリで設定ファイルが存在することを確認してください。
- CentOS/RHEL系:
/etc/httpd/conf.modules.d/
- Ubuntu/Debian系:
/etc/apache2/mods-enabled/
PHP-FPMとの通信を行うモジュールが適切に読み込まれていれば、PHPファイルの処理が可能になります。
次は、PHP-FPMの設定と起動方法について詳しく解説します。
PHP-FPMの設定と起動方法
PHP-FPMの適切な設定は、パフォーマンスやセキュリティに大きく関わります。このセクションでは、php-fpm.confとpool設定ファイルの編集方法、サービスの起動と管理について解説します。
1. PHP-FPMの基本設定(php-fpm.conf)
PHP-FPMのメイン設定ファイルは、以下の場所にあります。
- CentOS/RHEL系:
/etc/php-fpm.conf
- Ubuntu/Debian系:
/etc/php/8.x/fpm/php-fpm.conf
(バージョンによりパスが異なります)
以下のポイントを確認・編集します。
; プロセスの管理方式
pm = dynamic
; 最大プロセス数
pm.max_children = 50
; プロセスの最小・最大スペア数
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 35
; リクエストの処理制限
request_terminate_timeout = 30
これにより、必要に応じてプロセスを増減させるダイナミック方式が採用され、リクエスト数の多い環境でもスムーズに処理されます。
2. プール設定(www.conf)
PHP-FPMでは「プール」という単位でリクエスト処理を管理します。デフォルトのプール設定ファイルは次の場所にあります。
- CentOS/RHEL系:
/etc/php-fpm.d/www.conf
- Ubuntu/Debian系:
/etc/php/8.x/fpm/pool.d/www.conf
以下の行を確認・変更します。
; ユーザーとグループの設定
user = apache ; CentOS/RHEL系
group = apache
user = www-data ; Ubuntu/Debian系
group = www-data
; リスニングソケットの設定
listen = /run/php/php8.x-fpm.sock
; アクセス許可
listen.owner = www-data
listen.group = www-data
listen.mode = 0660
listenの設定は、ApacheがPHP-FPMにリクエストを転送する際の接続先です。/run/php/php8.x-fpm.sock
などのソケットファイルを使用します。
3. PHP-FPMの起動と管理
設定が完了したら、PHP-FPMを起動して自動起動設定を行います。
- CentOS/RHEL系
sudo systemctl start php-fpm
sudo systemctl enable php-fpm
- Ubuntu/Debian系
sudo systemctl start php8.x-fpm
sudo systemctl enable php8.x-fpm
4. 動作確認
PHP-FPMが正しく起動しているか確認します。
sudo systemctl status php-fpm # CentOS/RHEL系
sudo systemctl status php8.x-fpm # Ubuntu/Debian系
次は、ApacheのVirtualHost設定を行い、実際にPHP-FPMと連携する方法を解説します。
ApacheのVirtualHost設定例
PHP-FPMとApacheが連携するためには、VirtualHost設定を行い、PHPリクエストをPHP-FPMに転送するように設定します。このセクションでは、CentOS/RHEL系およびUbuntu/Debian系でのVirtualHost設定例を紹介します。
1. VirtualHost設定ファイルの作成
VirtualHost設定ファイルは、次の場所に作成します。
- CentOS/RHEL系:
/etc/httpd/conf.d/example.com.conf
- Ubuntu/Debian系:
/etc/apache2/sites-available/example.com.conf
新規にファイルを作成し、以下の内容を記述します。
<VirtualHost *:80>
ServerAdmin admin@example.com
DocumentRoot /var/www/example.com/public_html
ServerName example.com
ServerAlias www.example.com
# ErrorLogとCustomLogの設定
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
# PHPファイルの処理をPHP-FPMに転送
<FilesMatch \.php$>
SetHandler "proxy:unix:/run/php/php8.1-fpm.sock|fcgi://localhost"
</FilesMatch>
# ルートディレクトリへのアクセス権限
<Directory /var/www/example.com/public_html>
AllowOverride All
Require all granted
</Directory>
</VirtualHost>
- SetHandlerの部分で、ApacheがPHPリクエストをUNIXソケットを経由してPHP-FPMに転送します。
/run/php/php8.1-fpm.sock
はPHP-FPMのプール設定で指定したソケットです。PHPのバージョンに合わせて変更してください。
2. VirtualHostの有効化
作成したVirtualHostを有効化します。
- CentOS/RHEL系(自動で読み込まれます)
sudo systemctl restart httpd
- Ubuntu/Debian系
sudo a2ensite example.com
sudo systemctl restart apache2
3. SELinuxの設定(CentOS/RHEL系のみ)
CentOS/RHEL系では、SELinuxが有効になっている場合、ApacheがPHP-FPMに接続できるように以下のコマンドを実行します。
sudo setsebool -P httpd_can_network_connect on
4. VirtualHostの動作確認
ブラウザでhttp://example.com
にアクセスし、PHPファイルが正常に実行されることを確認します。
次は、セキュリティ強化のポイントについて解説します。
セキュリティ強化のポイント
ApacheとPHP-FPMの連携環境では、適切なセキュリティ対策を行うことで、不正アクセスやサーバー侵害のリスクを軽減できます。このセクションでは、具体的なセキュリティ強化の方法について解説します。
1. PHP-FPMのユーザーと権限の見直し
PHP-FPMが実行されるユーザーを最小権限に設定することで、攻撃が発生した際の被害を最小限に抑えることができます。
プール設定ファイル(例: /etc/php-fpm.d/www.conf
または/etc/php/8.x/fpm/pool.d/www.conf
)で、適切なユーザーとグループを指定します。
user = www-data # Ubuntu/Debian系
group = www-data
user = apache # CentOS/RHEL系
group = apache
- 不要にrootユーザーや特権ユーザーで実行しないようにします。
- Webアプリケーションごとにユーザーを分けることで、1つのアプリケーションが侵害されても他に影響しにくくなります。
2. 不要なモジュールの無効化
Apacheでは、デフォルトで多くのモジュールが有効になっていますが、使用しないモジュールは無効化してセキュリティリスクを低減します。
CentOS/RHEL系
sudo vi /etc/httpd/conf.modules.d/00-base.conf
Ubuntu/Debian系
sudo a2dismod status
sudo systemctl restart apache2
- statusモジュールは、デフォルトでサーバーステータスを外部に公開する可能性があるため無効化します。
3. .htaccessによるアクセス制御
特定のディレクトリやファイルへのアクセスを制限するために.htaccess
ファイルを活用します。
<Directory /var/www/example.com/public_html>
Options -Indexes
AllowOverride All
Require all granted
</Directory>
# アップロードディレクトリからPHPを実行させない
<Directory /var/www/example.com/public_html/uploads>
php_flag engine off
</Directory>
Options -Indexes
は、ディレクトリ一覧表示を防止します。- アップロードディレクトリでのPHP実行を防止し、不正なスクリプトの実行を防ぎます。
4. ファイルのパーミッション設定
- 公開ディレクトリ内のファイルのパーミッションを適切に設定し、不正な書き込みを防ぎます。
sudo chown -R www-data:www-data /var/www/example.com/public_html
sudo find /var/www/example.com/public_html -type d -exec chmod 755 {} \;
sudo find /var/www/example.com/public_html -type f -exec chmod 644 {} \;
- ディレクトリは
755
、ファイルは644
に設定し、グループ以外の書き込みを防ぎます。
5. SELinux設定(CentOS/RHEL系のみ)
SELinuxが有効な環境では、ApacheがPHP-FPMへ接続するために以下を設定します。
sudo setsebool -P httpd_can_network_connect on
これにより、Apacheがネットワーク経由でPHP-FPMプロセスと通信できるようになります。
6. セキュリティヘッダーの追加
Apacheの設定ファイルにセキュリティヘッダーを追加し、ブラウザを通じた攻撃を防止します。
<IfModule mod_headers.c>
Header always set X-Content-Type-Options "nosniff"
Header always set X-XSS-Protection "1; mode=block"
Header always set X-Frame-Options "DENY"
</IfModule>
- X-Content-Type-Optionsは、ブラウザがMIMEタイプを推測するのを防ぎます。
- X-XSS-Protectionは、クロスサイトスクリプティング(XSS)攻撃を防止します。
- X-Frame-Optionsは、クリックジャッキング攻撃を防ぎます。
これらの対策を施すことで、安全なApache + PHP-FPM環境を構築できます。次は、動作確認とトラブルシューティングについて解説します。
動作確認とトラブルシューティング
ApacheとPHP-FPMの設定が完了したら、正しく動作しているか確認し、不具合があればトラブルシューティングを行います。
1. PHP情報の表示(phpinfo)
まず、PHPが正しく動作しているかを確認するためにphpinfo
を表示します。
1. phpinfoファイルの作成
sudo vi /var/www/example.com/public_html/info.php
以下の内容を記述します。
<?php
phpinfo();
?>
2. ブラウザで確認http://example.com/info.php
にアクセスし、PHPのバージョンや設定情報が表示されることを確認します。
- 表示されない場合は、Apacheのエラーログを確認します。
sudo tail -f /var/log/apache2/error.log # Ubuntu/Debian系
sudo tail -f /var/log/httpd/error_log # CentOS/RHEL系
2. ApacheとPHP-FPMの連携確認
ApacheがPHP-FPMを経由してPHPを処理しているか確認します。
1. Apacheのプロセス確認
ps aux | grep apache # Ubuntu/Debian系
ps aux | grep httpd # CentOS/RHEL系
2. PHP-FPMのプロセス確認
ps aux | grep php-fpm
- ApacheとPHP-FPMのプロセスが起動していることを確認してください。
3. ソケットの確認
ApacheとPHP-FPMはUNIXソケットで通信します。ソケットが存在するか確認します。
ls /run/php/
php8.1-fpm.sock
などのソケットファイルが存在することを確認します。存在しない場合は、PHP-FPMが正しく起動していません。
PHP-FPMの再起動
sudo systemctl restart php8.1-fpm # Ubuntu/Debian系
sudo systemctl restart php-fpm # CentOS/RHEL系
4. ログの確認
エラーが発生した場合は、ApacheとPHP-FPMのログを確認します。
Apacheエラーログ
sudo tail -f /var/log/apache2/error.log # Ubuntu/Debian系
sudo tail -f /var/log/httpd/error_log # CentOS/RHEL系
PHP-FPMエラーログ
sudo tail -f /var/log/php8.1-fpm.log # Ubuntu/Debian系
sudo tail -f /var/log/php-fpm/error.log # CentOS/RHEL系
- “No input file specified” が表示される場合は、
DocumentRoot
やVirtualHost
の設定を確認してください。 - “502 Bad Gateway” が表示される場合は、PHP-FPMが停止している可能性があります。
5. SELinuxの確認(CentOS/RHEL系)
SELinuxが有効な環境では、ApacheがPHP-FPMに接続するためのポリシーを追加する必要があります。
sudo setsebool -P httpd_can_network_connect on
これでも解決しない場合は、SELinuxのログを確認します。
sudo cat /var/log/audit/audit.log | grep denied
6. キャッシュのクリア
設定変更後に反映されない場合は、Apacheのキャッシュをクリアします。
sudo systemctl restart apache2 # Ubuntu/Debian系
sudo systemctl restart httpd # CentOS/RHEL系
これで動作確認が完了です。次は、WordPressやLaravelといった実際のアプリケーションをPHP-FPM環境で動作させる応用例を解説します。
応用例:WordPressやLaravelの導入
ApacheとPHP-FPMの環境を活用して、人気のPHPアプリケーションであるWordPressやLaravelをセットアップする方法を解説します。これにより、パフォーマンスの向上とスムーズな運用が可能になります。
1. WordPressのセットアップ
1.1 必要なパッケージのインストール
WordPressに必要なパッケージ(PHPモジュールやデータベース)をインストールします。
sudo apt install php-mysql mysql-server php-gd php-xml php-curl php-zip # Ubuntu/Debian系
sudo yum install php-mysqlnd mysql-server php-gd php-xml php-curl php-zip # CentOS/RHEL系
PHP-FPMがインストールされていることを前提とします。
1.2 データベースの作成
MySQL/MariaDBを起動し、WordPress用のデータベースを作成します。
sudo systemctl start mysql
sudo mysql
CREATE DATABASE wordpress;
CREATE USER 'wpuser'@'localhost' IDENTIFIED BY 'password';
GRANT ALL PRIVILEGES ON wordpress.* TO 'wpuser'@'localhost';
FLUSH PRIVILEGES;
EXIT;
1.3 WordPressのダウンロードと配置
cd /var/www
sudo wget https://wordpress.org/latest.tar.gz
sudo tar -xvzf latest.tar.gz
sudo mv wordpress example.com/public_html
sudo chown -R www-data:www-data /var/www/example.com/public_html
1.4 ApacheのVirtualHost設定
VirtualHostファイルを編集して、WordPressがPHP-FPM経由で動作するようにします。
<VirtualHost *:80>
ServerAdmin admin@example.com
DocumentRoot /var/www/example.com/public_html
ServerName example.com
<FilesMatch \.php$>
SetHandler "proxy:unix:/run/php/php8.1-fpm.sock|fcgi://localhost"
</FilesMatch>
<Directory /var/www/example.com/public_html>
AllowOverride All
Require all granted
</Directory>
</VirtualHost>
Apacheを再起動し、WordPressのインストール画面にアクセスします。
sudo systemctl restart apache2 # Ubuntu/Debian系
sudo systemctl restart httpd # CentOS/RHEL系
ブラウザでhttp://example.com
にアクセスし、セットアップを完了させます。
2. Laravelのセットアップ
2.1 必要なパッケージのインストール
LaravelにはComposerが必要です。
sudo apt install composer unzip # Ubuntu/Debian系
sudo yum install composer unzip # CentOS/RHEL系
2.2 Laravelプロジェクトの作成
cd /var/www
composer create-project laravel/laravel example.com
sudo chown -R www-data:www-data /var/www/example.com
2.3 ApacheのVirtualHost設定
<VirtualHost *:80>
ServerAdmin admin@example.com
DocumentRoot /var/www/example.com/public
ServerName example.com
<FilesMatch \.php$>
SetHandler "proxy:unix:/run/php/php8.1-fpm.sock|fcgi://localhost"
</FilesMatch>
<Directory /var/www/example.com/public>
AllowOverride All
Require all granted
</Directory>
</VirtualHost>
Laravelでは、public
ディレクトリがドキュメントルートになります。
2.4 アプリケーションキーの生成
cd /var/www/example.com
php artisan key:generate
これでLaravelのセットアップが完了します。ブラウザでhttp://example.com
にアクセスし、Laravelの初期画面が表示されることを確認します。
3. アプリケーションのパフォーマンス最適化
- キャッシュの有効化: Laravelでは
php artisan config:cache
を実行して設定をキャッシュします。 - opcacheの導入: PHPの
opcache
モジュールを有効化することで、PHPスクリプトの実行速度を向上させます。
sudo phpenmod opcache # Ubuntu/Debian系
sudo yum install php-opcache # CentOS/RHEL系
これで、PHP-FPM環境でのWordPressやLaravelのセットアップが完了します。次は、記事のまとめを行います。
まとめ
ApacheとPHP-FPMの連携により、PHPアプリケーションのパフォーマンスとセキュリティが大幅に向上します。本記事では、ApacheとPHP-FPMの基本的な概要から始まり、必要なパッケージのインストール、VirtualHostの設定、セキュリティ強化のポイントまでを詳しく解説しました。
また、WordPressやLaravelなどの具体的なアプリケーションをPHP-FPM環境でセットアップする方法も紹介し、実践的な活用例を示しました。
適切な設定と運用により、ApacheとPHP-FPMの組み合わせは、高トラフィック環境でも安定したパフォーマンスを提供します。これからPHPアプリケーションの運用を考えている方は、ぜひ本記事を参考に、安全で高速なWeb環境を構築してください。
コメント