少し前、CentOS 8が正式に終了(EOL)した際、私は数日徹夜して5台のクライアントサーバーをCentOS Stream 9に移行しました。当時の最大の課題はインストールそのものではなく、いかに古いPHPコードをスムーズに動かし、メモリ消費を抑えつつ増加するトラフィックに対応させるかということでした。
多くの人は単に dnf install php を実行し、デフォルト設定のまま放置しがちです。その結果、同時アクセス数が数十件に達しただけで、サーバーが502エラーを吐いたり、CPU使用率が100%に跳ね上がったりします。この記事では、PHPアプリケーションを劇的に進化させるために私が蓄積してきた実戦的な経験を共有します。
なぜデフォルト設定ではPHPが遅いのか?
CentOS Stream 9のデフォルト値は、互換性を優先するために極めて安全な設定になっています。しかし、この「安全性」が皮肉にもハードウェアのパフォーマンスを制限してしまっているのです。
主な3つのボトルネックは以下の通りです:
- PHP-FPM プール: デフォルトの
dynamicモードはプロセス数が少なすぎることが多く、急激なアクセス増が発生した際にリクエストが待機状態になります。 - OPcache の放置: OPcacheが有効でないと、PHPは実行のたびにコードを読み込み、解析し、コンパイルし直す必要があります。これはCPUリソースの膨大な無駄遣いです。
- 古いバージョン: 標準のリポジトリでは最新のPHP(8.3など)が提供されていないことがあります。そのため、処理速度を大幅に向上させるJIT(Just-In-Time)コンパイルなどの改善の恩恵を逃してしまいます。
Remiリポジトリの使用:プロフェッショナルの標準
OS標準のPHPパッケージは使用しないでください。私は更新が速く、安定性も高い Remi Repository を常に優先して使用しています。
ステップ1:PHP 8.x の適切なインストール
まず、EPELとRemiリポジトリをシステムに追加します:
# EPELとRemiリポジトリのインストール
sudo dnf install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-9.noarch.rpm
sudo dnf install -y https://rpms.remirepo.net/enterprise/remi-release-9.rpm
# PHPモジュールをリセットしてPHP 8.2(または8.3)を有効化
sudo dnf module reset php -y
sudo dnf module enable php:remi-8.2 -y
# 必須拡張機能のインストール
sudo dnf install -y php-fpm php-cli php-gd php-mysqlnd php-mbstring php-xml php-opcache php-zip php-curl
ステップ2:高負荷に耐えるための PHP-FPM の調整
編集が必要な設定ファイルは /etc/php-fpm.d/www.conf です。本番サーバーでデフォルト設定をそのまま使うのは絶対にやめましょう。
pm.max_children の計算には、通常次の計算式を使います:(合計RAM – システム使用RAM) / 50MB(PHPプロセスの平均サイズ)。例えば4GBのRAMを搭載したサーバーなら、60プロセス程度が安全な目安です。
設定ファイルを開きます:
sudo vi /etc/php-fpm.d/www.conf
レスポンス速度を最適化するために、以下のパラメータを調整してPHP-FPM の調整を行ってください:
pm = dynamic
pm.max_children = 60
pm.start_servers = 10
pm.min_spare_servers = 10
pm.max_spare_servers = 30
; メモリリークを解放するため、500リクエストごとにプロセスをリセット
pm.max_requests = 500
ヒント: サーバーで1つの大規模なWebサイトのみを運用している場合は、pm = static に変更してください。これにより、システムが新しいプロセスを生成する際の遅延を排除できます。
ステップ3:OPcache のパワーを解放する
OPcacheはバイトコードをRAMにキャッシュし、PHPのレスポンスをほぼ即座に返せるようにします。一般的なWordPressサイトには数千のファイルが含まれるため、デフォルト設定では不十分です。
実戦的なパラメータで /etc/php.d/10-opcache.ini を編集します:
opcache.enable=1
; 重いプラグインやフレームワークを使用する場合は256MBに増やす
opcache.memory_consumption=256
opcache.interned_strings_buffer=16
; WordPressの場合、全システムファイルをキャッシュするために最低10000が必要
opcache.max_accelerated_files=10000
; 本番環境では、頻繁なファイルチェックを減らすため60秒に設定
opcache.revalidate_freq=60
; サーバー再起動後の起動を速めるためファイルキャッシュを有効化
opcache.file_cache=/var/lib/php/opcache
ステップ4:検証と適用
再起動する前に、記述ミスがないか確認しましょう:
sudo php-fpm -t
test is successful と表示されたら、サービスを有効化して再起動します:
sudo systemctl enable php-fpm
sudo systemctl restart php-fpm
Unixドメインソケット:パフォーマンス向上のための最後の一押し
デフォルトではPHP-FPMはポート9000(TCP)経由で接続します。PHPと同じマシン上でWebサーバーを運用している場合は、Unixドメインソケットの使用に切り替えてください。これによりネットワークスタックのオーバーヘッドが回避され、スループットが約10〜15%向上します。
www.conf 内で listen パスを変更します:
listen = /run/php-fpm/www.sock
listen.owner = nginx
listen.group = nginx
listen.mode = 0660
Nginxの設定ファイルも、127.0.0.1:9000 ではなくこの .sock ファイルを参照するように更新することを忘れないでください。
おわりに
PHPの最適化に「万能な設定」はありません。計算処理の多いECサイトなどの場合は、さらに JIT (Just-In-Time) を有効にしてパフォーマンスを極限まで引き出します。
私のアドバイスは、まずは上記の設定から始めて、htop で状況を監視することです。メモリに余裕があるのにCPUが高負荷な場合は、pm.max_children を徐々に増やしてみてください。この記事が、あなたのサーバーの安定稼働と高速化に役立つことを願っています!

