言語
日本語
English

Caution

お使いのブラウザはJavaScriptが無効になっております。
当サイトでは検索などの処理にJavaScriptを使用しています。
より快適にご利用頂くため、JavaScriptを有効にしたうえで当サイトを閲覧することをお勧めいたします。

Linux & Mac & Bashコマンド辞典

  1. トップページ
  2. Linux & Mac & Bashコマンド辞典
  3. Nginx + PHP-FPM

Nginx + PHP-FPM

『Nginx + PHP-FPM』は、高性能な Web サーバーである Nginx と PHP FastCGI プロセスマネージャー(PHP-FPM)を組み合わせて PHP アプリケーションを動かす構成です。Nginx は静的ファイルの配信に特化し、PHP スクリプトの処理は fastcgi_pass ディレクティブを通じて PHP-FPM プロセスへ委譲します。これにより Apache + mod_php よりもメモリ効率が高く、高トラフィックなサイトでも安定した動作が期待できます。

構文

# -----------------------------------------------
#  PHP-FPM のインストール(Ubuntu / Debian 系)
# -----------------------------------------------

# php8.3-fpm パッケージをインストールします
#   → PHP-FPM 本体と CLI が同時にインストールされます
#   例: sudo apt install php8.3-fpm
sudo apt install php8.3-fpm

# -----------------------------------------------
#  PHP-FPM のインストール(RHEL / AlmaLinux 系)
# -----------------------------------------------

# php-fpm パッケージをインストールします
#   例: sudo dnf install php php-fpm
sudo dnf install php php-fpm

# -----------------------------------------------
#  PHP-FPM の起動と自動起動設定
# -----------------------------------------------

# PHP-FPM サービスを開始します
#   例: sudo systemctl start php8.3-fpm
sudo systemctl start php8.3-fpm

# システム起動時に自動起動するように設定します
sudo systemctl enable php8.3-fpm

# 動作状況を確認します
sudo systemctl status php8.3-fpm

# -----------------------------------------------
#  Nginx の fastcgi_pass 設定(Unix ソケット経由)
# -----------------------------------------------

# /etc/nginx/sites-available/ に仮想ホスト設定ファイルを作成します
# PHP ファイルへのリクエストを fastcgi_pass で PHP-FPM に転送します

server {
    listen 80;
    server_name nerv.example.com;
    root /var/www/nerv;
    index index.php index.html;

    # PHP ファイルのリクエストを PHP-FPM へ転送します
    location ~ \.php$ {
        # Unix ソケット経由で PHP-FPM に接続します
        #   → TCP ポートよりオーバーヘッドが少なく、同一サーバーでは推奨です
        fastcgi_pass unix:/run/php/php8.3-fpm.sock;

        # PHP-FPM に渡すデフォルトのインデックスファイルを指定します
        fastcgi_index index.php;

        # スクリプトの実際のファイルパスを PHP-FPM に渡します
        #   → $document_root と $fastcgi_script_name を組み合わせて設定します
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

        # fastcgi_params ファイルに定義された標準パラメーターを読み込みます
        #   → QUERY_STRING・REQUEST_METHOD などの環境変数が設定されます
        include fastcgi_params;
    }

    # .htaccess ファイルへの直接アクセスを禁止します
    location ~ /\.ht {
        deny all;
    }
}

# -----------------------------------------------
#  Nginx の fastcgi_pass 設定(TCP ポート経由)
# -----------------------------------------------

# PHP-FPM を別サーバーで動かす場合や、
# www.conf で listen = 127.0.0.1:9000 を設定した場合に使用します

server {
    listen 80;
    server_name nerv.example.com;
    root /var/www/nerv;
    index index.php index.html;

    location ~ \.php$ {
        # TCP ポート 9000 経由で PHP-FPM に接続します
        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/8.3/fpm/pool.d/www.conf)
# -----------------------------------------------

# プール名を指定します(デフォルトは www)
[www]

# PHP-FPM プロセスの実行ユーザーとグループを設定します
#   → Nginx の worker_processes と合わせておくと権限トラブルを防げます
user = www-data
group = www-data

# 接続方式を指定します(Unix ソケット or TCP ポート)
#   → Unix ソケット(推奨): listen = /run/php/php8.3-fpm.sock
#   → TCP ポート: listen = 127.0.0.1:9000
listen = /run/php/php8.3-fpm.sock

# プロセス管理方式を指定します
#   → dynamic: リクエスト数に応じてプロセス数を自動調整します(推奨)
#   → static: 常に pm.max_children 数のプロセスを起動します
#   → ondemand: アイドル時はプロセスを終了してメモリを節約します
pm = dynamic

# 同時に起動できるプロセスの最大数を設定します
#   → サーバーのメモリ量に合わせて調整します
#   → 目安: 利用可能メモリ(MB) / 1プロセスあたりのメモリ(MB)
pm.max_children = 10

# PHP-FPM 起動時に最初に立ち上げるプロセス数を指定します
pm.start_servers = 3

# アイドル状態で維持するプロセスの最小数を設定します
pm.min_spare_servers = 2

# アイドル状態で維持するプロセスの最大数を設定します
pm.max_spare_servers = 5

構文一覧

設定項目説明
fastcgi_passPHP-FPM への接続先を指定します。Unix ソケット(unix:/run/php/php8.3-fpm.sock)または TCP ポート(127.0.0.1:9000)を指定できます。同一サーバーでは Unix ソケットが推奨です。
fastcgi_indexURI がスラッシュで終わる場合に付加するデフォルトのファイル名を指定します。通常は index.php を設定します。
fastcgi_param SCRIPT_FILENAMEPHP-FPM が実行するスクリプトの絶対パスを渡します。$document_root$fastcgi_script_name と設定するのが標準的です。この設定が欠けると PHP-FPM がファイルを見つけられずエラーになります。
include fastcgi_params/etc/nginx/fastcgi_params に定義された標準的な FastCGI パラメーター(QUERY_STRINGREQUEST_METHODSERVER_NAME 等)を一括で読み込みます。
www.conflistenPHP-FPM の接続待ち受け方式を指定します。Unix ソケットパスまたは IP:ポート 形式で設定します。Nginx の fastcgi_pass と必ず一致させてください。
www.confpmプロセス管理方式を指定します。dynamic(負荷に応じて自動調整)・static(固定数)・ondemand(アイドル時プロセス終了)から選択します。一般的な用途では dynamic が推奨です。
www.confpm.max_children同時に起動できる PHP-FPM プロセスの上限数を設定します。サーバーのメモリ量を 1 プロセスあたりの消費メモリ(目安 30〜50 MB)で割った値を参考に設定します。
www.confpm.start_serversPHP-FPM サービス起動時に最初に立ち上げるプロセス数を指定します。pm.min_spare_servers 以上・pm.max_spare_servers 以下に設定します。
www.confpm.min_spare_serversアイドル状態で常に待機させるプロセスの最小数を指定します。アクセス急増時にすぐ応答できるよう一定数を確保します。
www.confpm.max_spare_serversアイドル状態で維持するプロセスの最大数を指定します。これを超えたアイドルプロセスは自動的に終了してメモリを解放します。
www.confuser / groupPHP-FPM プロセスの実行ユーザーとグループを指定します。Nginx の実行ユーザー(通常 www-data)と合わせておくことでファイルアクセス権限のトラブルを防げます。

使用例

/etc/nginx/sites-available/nerv-php.conf
# -----------------------------------------------
#  NERV システム用 PHP サイトの Nginx 仮想ホスト設定
# -----------------------------------------------

server {
    listen 80;

    # サーバー名を指定します(複数指定可能)
    server_name nerv.example.com www.nerv.example.com;

    # ドキュメントルートを設定します
    root /var/www/nerv;

    # インデックスファイルの優先順位を指定します
    index index.php index.html index.htm;

    # ルートロケーションの設定です
    #   → try_files でファイル→ディレクトリ→404 の順に探します
    location / {
        try_files $uri $uri/ =404;
    }

    # PHP ファイルへのリクエストを PHP-FPM に転送します
    location ~ \.php$ {
        # パスインジェクション対策: 実際にファイルが存在するか確認します
        try_files $uri =404;

        # FastCGI プロトコルのスプリットパスを有効にします
        fastcgi_split_path_info ^(.+\.php)(/.+)$;

        # Unix ソケット経由で PHP-FPM に接続します
        fastcgi_pass unix:/run/php/php8.3-fpm.sock;

        fastcgi_index index.php;

        # PHP-FPM が実行するスクリプトのフルパスを渡します
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

        # 標準 FastCGI パラメーターを読み込みます
        include fastcgi_params;

        # タイムアウトを 60 秒に設定します(重い処理への対策)
        fastcgi_read_timeout 60;
    }

    # .htaccess などの隠しファイルへのアクセスを禁止します
    location ~ /\.ht {
        deny all;
    }

    # アクセスログとエラーログのパスを設定します
    access_log /var/log/nginx/nerv_access.log;
    error_log /var/log/nginx/nerv_error.log;
}

実行するコマンドは次の通りです。

$ sudo apt update
$ sudo apt install nginx php8.3-fpm
$ sudo systemctl start nginx
$ sudo systemctl start php8.3-fpm
$ sudo systemctl enable nginx
$ sudo systemctl enable php8.3-fpm
$ sudo ln -s /etc/nginx/sites-available/nerv-php.conf /etc/nginx/sites-enabled/
$ sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
$ sudo systemctl reload nginx
$ sudo mkdir -p /var/www/nerv
$ sudo chown -R www-data:www-data /var/www/nerv
$ sudo nano /var/www/nerv/info.php
(info.php を作成後、ブラウザで http://nerv.example.com/info.php にアクセスして動作確認します)
/var/www/nerv/info.php
<?php
// -----------------------------------------------
//  PHP-FPM + Nginx の動作確認用ファイルです
//  碇シンジが NERV システムの PHP 環境を確認します
// -----------------------------------------------

// phpinfo() を呼び出すと PHP のバージョン・設定・
// 読み込まれている拡張モジュール等をブラウザに表示します
// 動作確認が済んだらセキュリティのため必ず削除してください
phpinfo();
?>

実行するコマンドは次の通りです。

(ブラウザで http://nerv.example.com/info.php にアクセスします)
(「PHP Version 8.3.x」と表示され、Server API が「FPM/FastCGI」であれば Nginx + PHP-FPM の連携成功です)

$ curl -s http://nerv.example.com/info.php | grep -i "server api"
<tr><td class="e">Server API </td><td class="v">FPM/FastCGI </td></tr>

(確認が済んだら info.php を削除します)
$ sudo rm /var/www/nerv/info.php
/etc/php/8.3/fpm/pool.d/www.conf
# -----------------------------------------------
#  PHP-FPM プール設定(NERV サーバー向けチューニング)
# -----------------------------------------------

[www]

# PHP-FPM プロセスの実行ユーザーを www-data に設定します
#   → Nginx の実行ユーザーと揃えておきます
user = www-data
group = www-data

# Unix ソケットで接続を待ち受けます
#   → Nginx の fastcgi_pass と一致させてください
listen = /run/php/php8.3-fpm.sock

# ソケットの所有者・グループを Nginx が読み書きできるように設定します
listen.owner = www-data
listen.group = www-data
listen.mode = 0660

# プロセス数を負荷に応じて自動調整します
pm = dynamic

# 同時起動できるプロセスの最大数です
#   → メモリ 1GB の場合の目安: 1024 / 40 ≒ 25
pm.max_children = 20

# 起動時に立ち上げるプロセス数です
pm.start_servers = 5

# 最低限維持するアイドルプロセス数です
pm.min_spare_servers = 3

# 維持するアイドルプロセスの上限数です
pm.max_spare_servers = 8

# スロークエリログ: 5 秒以上かかったリクエストを記録します
slowlog = /var/log/php8.3-fpm-slow.log
request_slowlog_timeout = 5s

実行するコマンドは次の通りです。

$ sudo php-fpm8.3 -t
[25-Mar-2026 09:00:00] NOTICE: configuration file /etc/php/8.3/fpm/php-fpm.conf test is successful
$ sudo systemctl restart php8.3-fpm
$ sudo systemctl status php8.3-fpm
● php8.3-fpm.service - The PHP 8.3 FastCGI Process Manager
     Loaded: loaded (/lib/systemd/system/php8.3-fpm.service; enabled)
     Active: active (running) since Wed 2026-03-25 09:00:05 JST
   Main PID: 12345 (php-fpm8.3)
     Status: "Processes active: 0, idle: 5, Requests: 0, slow: 0, Traffic: 0req/sec"

概要

『Nginx + PHP-FPM』は、Nginx が静的コンテンツの高速配信を担い、PHP の実行を PHP-FPM プロセスに分離することで、効率的かつスケーラブルな PHP サービングを実現するアーキテクチャです。PHP-FPM はプロセスプールを管理し、pm = dynamic 設定によってアクセス量に応じてプロセス数を自動調整します。Nginx との接続には Unix ソケット(同一サーバーの場合に推奨)と TCP ポートの 2 種類があり、ソケット方式はカーネル内部で通信が完結するため TCP より低レイテンシです。サービスの起動・停止・自動起動の管理には systemctl を使用します。本番環境では ufwiptables でファイアウォールを設定し、不要なポートを閉じておくことが重要です。動作確認後は info.php などのデバッグ用ファイルを必ず削除してください。

記事の間違いや著作権の侵害等ございましたらお手数ですがまでご連絡頂ければ幸いです。