ApacheとPHP-FPMの連携手順を徹底解説!設定から動作確認まで

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” が表示される場合は、DocumentRootVirtualHostの設定を確認してください。
  • “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アプリケーションであるWordPressLaravelをセットアップする方法を解説します。これにより、パフォーマンスの向上とスムーズな運用が可能になります。

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環境を構築してください。

コメント

コメントする