php-fpm とは?基礎知識
php-fpm(FastCGI Process Manager)は、PHP 5.4.0から公式サポートされたPHP標準のアプリケーションサーバーである。
php-fpm の役割
php-fpmは、WebサーバーからのPHPスクリプト実行リクエストを効率的に処理するためのプロセスマネージャーである。特にnginxと組み合わせて使用されることが多い。
主な機能:
- FastCGIプロトコルの実装
- PHPプロセスのプール管理
- 動的・静的なプロセス数の調整
- リソース管理とパフォーマンス最適化
php-fpm が解決する課題
従来のCGI方式では、リクエストごとにプロセスを生成・破棄していたため、パフォーマンスの問題があった。php-fpmは以下の課題を解決する:
課題 | 従来のCGI | php-fpm(FastCGI) |
|---|---|---|
プロセス生成 | リクエストごとに生成 | 事前に生成・再利用 |
メモリ効率 | 毎回初期化が必要 | メモリ上に常駐 |
レスポンス速度 | 遅い | 高速 |
サーバー負荷 | 高い | 低い |
CGI と FastCGI の違い
CGI(Common Gateway Interface)は、Webサーバーが外部プログラム(PHPなど)を実行するための仕組みである。
CGI の仕組み
CGIは、Webサーバーが静的コンテンツだけでなく、動的コンテンツを生成できるようにする技術である。
CGIの処理フロー:
- クライアントからリクエストを受信
- Webサーバーが新しいプロセスを生成
- PHPスクリプトを実行
- 実行結果をクライアントに返送
- プロセスを破棄
この「プロセスの生成と破棄」がリクエストごとに繰り返されるため、大量のリクエストがある場合、パフォーマンスが著しく低下する。
FastCGI の仕組み
FastCGIは、CGIの問題を解決するために開発されたプロトコルである。
FastCGIの処理フロー:
- 初回リクエスト時にプロセスを起動
- プロセスをメモリ上に保持
- 次回以降のリクエストは保持されたプロセスで処理
- プロセスの再利用により高速化
パフォーマンス比較:
【CGI】
リクエスト1 → プロセス生成 → 実行 → 破棄(約100ms)
リクエスト2 → プロセス生成 → 実行 → 破棄(約100ms)
リクエスト3 → プロセス生成 → 実行 → 破棄(約100ms)
【FastCGI】
初回 → プロセス生成 → 実行 → 保持(約100ms)
リクエスト2 → 実行(約10ms)
リクエスト3 → 実行(約10ms)
FastCGIは初回リクエスト時に起動したプロセスをメモリ上に保持し、次回以降のリクエストに対してはその保持したプロセスを実行する。これにより、プログラムの実行速度向上とサーバー負荷の軽減が期待できる。
nginx で php-fpm が必要な理由
nginxは、設計思想上、PHP実行機能を内蔵していない。これがApacheとの大きな違いである。
Apache と nginx の処理方式の違い
Apache の場合:
- PHPをモジュールとして組み込める
- Apacheプロセス内でPHPスクリプトを実行
- リクエストごとにスレッド/プロセスを割り当て
nginx の場合:
- PHPモジュールが存在しない
- 別プロセスでPHPを実行する必要がある
- php-fpmを使ってFastCGIプロトコル経由で連携
nginx の設計思想
nginxは、以下の設計思想に基づいて開発されている:
- 単一機能の原則: Webサーバーとしての機能に特化
- イベント駆動: 非同期I/Oによる高速処理
- プロセス分離: アプリケーション実行は別プロセスで
この設計により、nginxは軽量かつ高性能なWebサーバーとして動作する。php-fpmは、この設計思想に沿った形でPHP実行機能を提供する。
php-fpm と nginx の連携設定5選
php-fpmとnginxの連携方法には、主にTCPソケットとUNIXドメインソケットの2種類がある。
1. TCPソケット接続(基本設定)
最も一般的な設定方法。IPアドレスとポート番号を指定して接続する。
nginx設定ファイル(/etc/nginx/conf.d/default.conf):
server {
listen 80;
server_name localhost;
root /var/www/html;
index index.php index.html;
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
php-fpm設定ファイル(/etc/php-fpm.d/www.conf):
[www]
user = nginx
group = nginx
listen = 127.0.0.1:9000
listen.allowed_clients = 127.0.0.1
pm = dynamic
pm.max_children = 50
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 35
メリット:
- 設定が分かりやすい
- リモートホストからの接続が可能
- デバッグが容易
デメリット:
- UNIXドメインソケットより遅い(わずか)
- TCPオーバーヘッドが発生
2. UNIXドメインソケット接続(高速設定)
ソケットファイルを使用した接続方法。ローカルホストでの通信に最適化されている。
nginx設定ファイル:
location ~ \.php$ {
fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
php-fpm設定ファイル:
[www]
user = nginx
group = nginx
listen = /var/run/php-fpm/php-fpm.sock
listen.owner = nginx
listen.group = nginx
listen.mode = 0660
pm = dynamic
pm.max_children = 50
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 35
メリット:
- TCPソケットより高速(TCPオーバーヘッドがない)
- セキュリティが高い(ファイルパーミッションで制御)
- 同一ホスト内での通信に最適
デメリット:
- リモートホストからの接続不可
- パーミッション設定に注意が必要
3. プロセス管理設定(pm設定)
php-fpmのプロセス管理方式を最適化する。
[www]
; 動的プロセス管理(推奨)
pm = dynamic
pm.max_children = 50 ; 最大子プロセス数
pm.start_servers = 5 ; 起動時の子プロセス数
pm.min_spare_servers = 5 ; アイドル状態の最小プロセス数
pm.max_spare_servers = 35 ; アイドル状態の最大プロセス数
pm.max_requests = 500 ; 子プロセスが処理するリクエスト数の上限
; 静的プロセス管理(トラフィック予測可能な場合)
; pm = static
; pm.max_children = 50
; オンデマンドプロセス管理(低トラフィックの場合)
; pm = ondemand
; pm.max_children = 50
; pm.process_idle_timeout = 10s
プロセス管理方式の比較:
方式 | 特徴 | 適したケース |
|---|---|---|
dynamic | 負荷に応じて動的にプロセス数を調整 | 一般的な用途(推奨) |
static | 固定数のプロセスを常時起動 | トラフィックが予測可能・安定 |
ondemand | リクエストがあるときだけ起動 | 低トラフィック・メモリ節約 |
4. パフォーマンスチューニング設定
リソース制限とタイムアウト設定を最適化する。
[www]
; リソース制限
request_terminate_timeout = 30s ; リクエストタイムアウト
request_slowlog_timeout = 5s ; スローログ記録の閾値
slowlog = /var/log/php-fpm/slow.log ; スローログファイル
; メモリ制限(php.ini)
memory_limit = 256M
upload_max_filesize = 50M
post_max_size = 50M
max_execution_time = 30
max_input_time = 60
; バッファ設定(nginx)
fastcgi_buffer_size 32k
fastcgi_buffers 8 16k
fastcgi_busy_buffers_size 32k
5. Docker環境での設定
Docker ComposeでのLAMP/LEMP環境構築例。
docker-compose.yml:
version: '3.8'
services:
nginx:
image: nginx:1.25-alpine
ports:
- "80:80"
volumes:
- ./nginx/conf.d:/etc/nginx/conf.d
- ./public:/var/www/html
depends_on:
- php-fpm
php-fpm:
image: php:8.3-fpm-alpine
volumes:
- ./public:/var/www/html
environment:
- PHP_FPM_PM=dynamic
- PHP_FPM_PM_MAX_CHILDREN=50
mysql:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: rootpassword
MYSQL_DATABASE: myapp
volumes:
- mysql-data:/var/lib/mysql
volumes:
mysql-data:
nginx設定ファイル(nginx/conf.d/default.conf):
server {
listen 80;
server_name localhost;
root /var/www/html;
index index.php index.html;
location ~ \.php$ {
fastcgi_pass php-fpm:9000; # サービス名で指定
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
PHP の種類:モジュール版とCGI版
PHPには、モジュール版とCGI版という2種類の実行方式がある。
モジュール版(Apache mod_php)
Webサーバー(主にApache)のプロセス内でPHPを実行する方式。
特徴:
- Apacheのモジュールとして動作
- サーバー起動時に読み込まれる
- サーバープロセスの一部として実行
- nginx では使用不可
メリット:
- 設定が簡単
- Apacheとの統合が容易
デメリット:
- Apacheプロセスが肥大化
- メモリ効率が悪い
CGI版(php-fpm)
Webサーバーと別プロセスでPHPを実行する方式。
特徴:
- 独立したプロセスとして動作
- FastCGIプロトコルで通信
- nginx で使用される
- プロセス分離によるセキュリティ向上
メリット:
- プロセス分離による安定性
- 柔軟なリソース管理
- nginxとの相性が良い
デメリット:
- 設定がやや複雑
- FastCGI通信のオーバーヘッド(微小)
よくあるエラーと解決方法
php-fpmとnginx連携でよく発生するエラーと解決方法を紹介する。
エラー1: 502 Bad Gateway
症状: nginxが502エラーを返す
原因:
- php-fpmが起動していない
- ソケットファイルのパスが間違っている
- パーミッション設定が不正
解決方法:
# php-fpmの状態確認
systemctl status php-fpm
# php-fpmの起動
systemctl start php-fpm
# ソケットファイルの確認
ls -la /var/run/php-fpm/
# エラーログ確認
tail -f /var/log/nginx/error.log
tail -f /var/log/php-fpm/error.log
エラー2: File not found
症状: PHPファイルが見つからないエラー
原因:
SCRIPT_FILENAMEのパスが間違っている- nginxとphp-fpmのルートディレクトリが一致していない
解決方法:
location ~ \.php$ {
# 正しい設定
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
# 間違った設定例
# fastcgi_param SCRIPT_FILENAME /var/www$fastcgi_script_name;
}
エラー3: Permission denied
症状: パーミッションエラーでアクセスできない
原因:
- ソケットファイルのパーミッションが不正
- ユーザー/グループ設定が一致していない
解決方法:
# php-fpm設定ファイル
[www]
listen = /var/run/php-fpm/php-fpm.sock
listen.owner = nginx
listen.group = nginx
listen.mode = 0660
user = nginx
group = nginx
エラー4: Connection timeout
症状: タイムアウトエラーが発生
原因:
- プロセス数が不足
- リクエスト処理時間が長い
解決方法:
# php-fpm設定
pm.max_children = 100 ; プロセス数を増やす
request_terminate_timeout = 60s ; タイムアウトを延長
# nginx設定
fastcgi_read_timeout 60s;
fastcgi_send_timeout 60s;
まとめ
本記事では、php-fpmの基礎からnginx連携方法まで解説した。
重要なポイント:
- php-fpmの役割: FastCGI Process Managerとして、PHPスクリプトを効率的に実行
- CGI vs FastCGI: プロセスの再利用により、FastCGIは約10倍高速
- nginxでの必要性: nginxにはPHPモジュールがないため、php-fpmが必須
- 連携方法: TCPソケット(汎用性)とUNIXドメインソケット(高速)の2種類
- プロセス管理: dynamic/static/ondemand から環境に応じて選択
次のステップ:
- 本番環境でのパフォーマンスチューニング
- New Relic や Datadog でのモニタリング設定
- セキュリティ設定の強化(chroot、アクセス制限)
- PHP 8.x のJITコンパイラとの組み合わせ
php-fpmとnginxの組み合わせは、現代のPHPアプリケーション開発において標準的な構成である。本記事の設定例を参考に、自身の環境に最適な設定を見つけてほしい。