CentOS Stream 9 で Apache + PHP-FPM が必要な背景と理由
ウェブサーバーを構築する際、私たちは常に難しい問題に直面します。それは、高いパフォーマンスと安定性をどのように両立させるかということです。Apache HTTP Server は、その長い開発の歴史と実証された信頼性により、依然として多くの人々にとって第一の選択肢であり続けています。しかし、現代の PHP アプリケーションでは、Apache の mod_php モジュールを直接使用することが、パフォーマンスとセキュリティの両面で最適な方法とは限りません。
ここで PHP-FPM (FastCGI Process Manager) がその役割を発揮します。PHP-FPM は独立したプロセスとして機能し、個別の PHP “ワーカー” を管理します。
Apache が PHP ファイルの処理リクエストを受信すると、そのリクエストを PHP-FPM に転送します。このメカニズムは、ウェブサーバーと PHP のプロセスを完全に分離するだけでなく、セキュリティを強化し (各ウェブサイトを独自の PHP-FPM ユーザーで実行可能)、特に “重い” PHP アプリケーションやアクセス量が多い場合 (例えば、1分間に数千回のアクセスがある Eコマースサイトなど) に、パフォーマンスを大幅に向上させます。
CentOS Stream 9 については、個人的には Red Hat からの興味深い一歩だと評価しています。私は以前、いくつかの CentOS 7 サーバーを AlmaLinux 9 に移行する際に “苦労” した経験があるため、バージョン間の違いをよく理解しています。
新しいシステムに CentOS Stream 9 を選択することは、私の意見では、RHEL エコシステムとの安定性と互換性を維持しながら、新しい機能に早くアクセスできるメリットがあります。これは、本番展開の前に開発およびテスト環境にとって理想的な選択です。これにより、CentOS 8 が突然そのライフサイクルを終えたときのように、受動的な状況を避けて、将来の変更に積極的に慣れることができます。
必要なコンポーネントのインストール
始める前に、システムの更新を行い、すべてのソフトウェアパッケージが最新であることを確認し、衝突エラーを回避してください。
sudo dnf update -y
Apache HTTP Server のインストール
CentOS Stream 9 では、Apache HTTP Server は httpd と呼ばれます。インストールは非常に簡単です。
sudo dnf install httpd -y
sudo systemctl enable --now httpd
sudo systemctl status httpd
インストール後、サービスの状態を確認します。active (running) と表示されていれば、すべて準備完了です。ウェブサーバーが動作できるように、ファイアウォールでポート 80 (HTTP) と 443 (HTTPS) を開くことを忘れないでください。
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
sudo firewall-cmd --reload
PHP-FPM のインストール
CentOS Stream 9 はデフォルトのパッケージリポジトリで PHP を提供していますが、通常、最新バージョンではなかったり、必要な拡張機能がすべて揃っていなかったりします。最新の PHP-FPM および拡張機能を入手するには、EPEL と Remi リポジトリをよく使用します。
sudo dnf install epel-release -y
sudo dnf install https://rpms.remirepo.net/enterprise/remi-release-9.rpm -y
Remi リポジトリを追加した後、利用可能な PHP バージョンの一覧を表示できます。現在、PHP 8.2 と 8.3 が人気のあるバージョンです。
sudo dnf module list php
PHP 8.2 (例えば) をインストールするには、対応するモジュールを有効にし、PHP-FPM と重要な拡張機能をインストールする必要があります。私は通常、次のモジュールをインストールします: php-cli, php-mysqlnd, php-gd, php-xml, php-mbstring, php-fpm, php-opcache, php-json。
sudo dnf module enable php:remi-8.2 -y
sudo dnf install php-fpm php-cli php-mysqlnd php-gd php-xml php-mbstring php-opcache php-json -y
最後に、PHP-FPM を有効にして状態を確認します。
sudo systemctl enable --now php-fpm
sudo systemctl status php-fpm
PHP-FPM と連携するための Apache の詳細設定
これは、Apache と PHP-FPM を “接続” する上で極めて重要なステップです。
Apache Virtual Host の設定
ウェブサイトをホストするために Virtual Host を作成する必要があります。/etc/httpd/conf.d/ ディレクトリに各 Virtual Host の個別の設定ファイルを作成することをお勧めします。例えば、example.com というドメインのウェブサイトの場合:
sudo vi /etc/httpd/conf.d/example.com.conf
example.com.conf ファイルの内容は以下のようになります。
<VirtualHost *:80>
ServerName example.com
ServerAlias www.example.com
DocumentRoot /var/www/example.com/public_html
<Directory /var/www/example.com/public_html>
Options -Indexes +FollowSymLinks
AllowOverride All
Require all granted
</Directory>
# PHP リクエストを PHP-FPM に渡すために ProxyPassMatch を有効にする
# PHP-FPM は通常、ポート 9000 または Unix ソケットでリッスンします。
# CentOS Stream 9 はデフォルトで Unix ソケット: /run/php-fpm/www.sock を使用します
<FilesMatch \.php$>
SetHandler "proxy:unix:/run/php-fpm/www.sock|fcgi://localhost/"
</FilesMatch>
ErrorLog /var/log/httpd/example.com_error.log
CustomLog /var/log/httpd/example.com_access.log combined
</VirtualHost>
分かりやすくするために、SetHandler "proxy:unix:/run/php-fpm/www.sock|fcgi://localhost/" の行を説明しましょう。
proxy:unix:/run/php-fpm/www.sock: Apache はmod_proxy_fcgiモジュールを使用して、パス/run/php-fpm/www.sockにある Unix ソケット経由で PHP-FPM に接続します。この方法は、従来の TCP ポートを使用するよりも効率的で安全です。fcgi://localhost/: これは、PHP-FPM がリクエストのドキュメントルートを正しく特定するのに役立つ非常に重要なコンポーネントです。PHP-FPM はリクエストを受信すると、この部分に基づいてSCRIPT_FILENAME環境変数を正確に設定します。
次に、DocumentRoot ディレクトリを作成し、正確なパーミッションを設定します。
sudo mkdir -p /var/www/example.com/public_html
sudo chown -R apache:apache /var/www/example.com
sudo chmod -R 755 /var/www/example.com
Apache 設定の構文をチェックし、サービスを再起動して変更を適用します。
sudo apachectl configtest
sudo systemctl restart httpd
PHP-FPM プールの設定
PHP-FPM には www というデフォルトのプールがあります。簡単な設定であれば、このプールを完全に利用できます。その設定ファイルは /etc/php-fpm.d/www.conf にあります。
www.conf ファイル内の listen 行の値を確認してください。
grep "listen =" /etc/php-fpm.d/www.conf
結果が listen = /run/php-fpm/www.sock の場合、上記の Apache 設定は正しいです。TCP ポート (例: listen = 127.0.0.1:9000) が表示される場合は、Apache 設定の SetHandler 行を "proxy:fcgi://127.0.0.1:9000" に調整して合わせる必要があります。
さらに、パフォーマンスを最適化し、運用中のエラー発生を回避するために、以下のパラメータを微調整することをお勧めします。
userとgroup: 両方をapacheに設定します。これにより、PHP-FPM は Apache と同じユーザーで実行され、特に Apache が作成したファイルとやり取りする際のファイルアクセスに関する問題を完全に解決します。- プロセス管理パラメータ (
pm.*): pm = dynamic: これはデフォルトモードであり、ほとんどのユースケースに適しています。pm.max_children: これは、実行を許可される PHP-FPM 子プロセスの最大数です。サーバーの RAM 容量に基づいて慎重に検討する必要があります。簡単な経験則として、PHP に割り当てられた総 RAM を、単一の PHP プロセスが消費する平均 RAM 容量で割ります (例えば、PHP に 2GB の RAM を割り当て、各 PHP プロセスが約 40MB を消費する場合、pm.max_childrenを約 50 に設定できます)。pm.start_servers,pm.min_spare_servers,pm.max_spare_servers: これらのパラメータは、FPM が負荷に応じてプロセスの数を自動的に調整し、サーバーが過負荷にならないようにしつつ、迅速な応答を保証するのに役立ちます。
/etc/php-fpm.d/www.conf ファイルでの調整例 (必要な行のみを修正)。
listen = /run/php-fpm/www.sock
listen.owner = apache
listen.group = apache
listen.mode = 0660
user = apache
group = apache
pm = dynamic
pm.max_children = 50
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 35
変更が完了したら、PHP-FPM を再起動して新しい設定を有効にします。
sudo systemctl restart php-fpm
SELinux の設定
CentOS Stream 9 はデフォルトで SELinux を有効にしています。これは強力なセキュリティレイヤーですが、初心者にとっては障害となることがあります。Apache と PHP-FPM が Unix ソケット経由で相互に通信できるようにするには、SELinux がこの接続を許可していることを確認する必要があります。
PHP-FPM への接続を試みたときに Apache のログで「Permission denied」エラーが発生した場合は、SELinux のログを確認してください。通常、この相互作用を許可するためのカスタムポリシーを作成する必要があります。
sudo ausearch -c 'httpd' --raw | sudo audit2allow -M my-httpd
sudo semodule -i my-httpd.pp
迅速なトラブルシューティングが必要な場合 (テスト環境のみ!)、一時的に SELinux を Permissive モードに切り替えることができます。
sudo setenforce 0
修正後に Enforcing モードに戻すには: sudo setenforce 1。SELinux を無効にすることは本番環境では推奨されません。
テストと監視
インストールと設定が完了したら、すべてがスムーズに動作していることを確認することが非常に重要です。
PHP の動作確認
Virtual Host の DocumentRoot ディレクトリに簡単な PHP ファイルを作成します。
sudo vi /var/www/example.com/public_html/info.php
info.php ファイルの内容:
<?php
phpinfo();
?>
ブラウザを開き、http://example.com/info.php にアクセスします。PHP 情報ページが表示され、特に「Server API」セクションに「FPM/FastCGI」と表示されていれば、おめでとうございます!Apache と PHP-FPM が正常に連携しています。
ログの確認
問題が発生した場合、ログファイルはあなたの最も親しい友人です。以下のログファイルを確認することを忘れないでください。
- Apache のログ:
/var/log/httpd/error_logおよび/var/log/httpd/example.com_error.log(特定の Virtual Host の場合)。 - PHP-FPM のログ:
/var/log/php-fpm/www-error.log(または使用しているプールに対応するログファイル)。
ウェブサイトにアクセスしながら tail -f コマンドを使用してリアルタイムでログを表示すると、エラーをすぐに検出するのに役立ちます。
sudo tail -f /var/log/httpd/example.com_error.log
sudo tail -f /var/log/php-fpm/www-error.log
基本的な監視
安定したパフォーマンスを維持するには、CPU、RAM、I/O などのシステムリソースを綿密に監視する必要があります。特にウェブサイトに高い負荷がかかる場合です。Zabbix A-Z インストールガイド、htop、glances、sar などのツールは、役立つ全体像を提供します。注意すべき点の 1 つは、実行中の php-fpm プロセスの数であり、これはサーバーリソースと実際のトラフィックに合わせて pm.* パラメータを調整するのに役立ちます。
htop
PHP-FPM プロセスが継続的に強制終了され、再起動される場合、またはウェブサイトに 50x エラーが表示される場合は、pm.max_children の値を調整するか、各 PHP プロセスのメモリ使用量を見直す必要があることを明確に示しています。
CentOS Stream 9 で Apache と PHP-FPM を設定することは、最初は複雑に思えるかもしれませんが、各設定ステップに細心の注意を払うことで、PHP ウェブアプリケーションの優れた安定性とパフォーマンスを実現できます。プロジェクトの成功を祈ります!

