5.

NginxでPHPを動かす設定|PHP-FPMとfastcgi_pass・白画面の対処

編集
この記事の要点
  • Nginx は PHP を直接実行できないため、PHP-FPM(FastCGI Process Manager)と組み合わせる
  • 構成は ブラウザ → Nginx → FastCGI(TCP/Unix ソケット) → PHP-FPM の流れ
  • nginx.conflocation ~ \.php$ ブロックで fastcgi_pass を PHP-FPM のアドレスに向ける
  • FPM の www.confuser / group / listennginx 側と揃える
  • 反映には nginx と php-fpm の両方を再起動systemctl enable php-fpm で自動起動も忘れずに

前提

  • OS: CentOS 7 系(他ディストリでもパッケージ名を読み替えれば同様)
  • PHP: 7.1 以降(実運用では PHP 8.x 推奨)
  • Nginx はインストール済みで nginx -v が通る状態

全体構成

Nginx は Apache の mod_php のように PHP インタプリタを内蔵していません。代わりに FastCGI プロトコルで外部の PHP プロセス(PHP-FPM)にリクエストを丸投げし、結果を受け取って返します。

[Browser]
   |
   | HTTP
   v
[Nginx]  ----- FastCGI(TCP 9000) ----->  [PHP-FPM]  ---> *.php を実行
   |
   |  Nginx は静的ファイルだけ自分で返す(CSS/JS/画像など)

1. PHP-FPM のインストール

EPEL + Remi リポジトリを有効化して、必要なバージョンの PHP-FPM を入れます。バージョン番号 (php71) は環境に合わせて読み替えてください。

# Remi リポジトリの追加(未追加の場合)
yum -y install epel-release
yum -y install http://rpms.remirepo.net/enterprise/remi-release-7.rpm

# PHP-FPM 本体(必要に応じて mbstring / mysqlnd / xml 等も追加)
yum -y install --enablerepo=epel,remi,remi-php71 \
    php-fpm php-mbstring php-mysqlnd php-xml php-gd

インストール後は php -v でバージョンを確認しておきましょう。

2. Nginx の設定

/etc/nginx/nginx.conf(または /etc/nginx/conf.d/site.conf)を編集します。

vi /etc/nginx/nginx.conf

以下のような server ブロックを追加・編集します。ハイライト部分が PHP を動かすために最低限必要な設定です。

server {
    listen       80;
    server_name  test.com;

    root   /var/www/test/public;
    index  index.php index.html index.htm;

    # 通常リクエストは存在ファイル → ディレクトリ → index.php の順に解決
    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    # .php へのアクセスを PHP-FPM へ FastCGI で渡す
    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;
    }

    # .ht* など隠しファイルは公開しない
    location ~ /\.ht {
        deny all;
    }
}

設定反映:

# 設定の文法チェック
nginx -t

# 反映
systemctl restart nginx

3. PHP-FPM の設定

FPM 側でも Nginx と合わせるための調整が必要です。

vi /etc/php-fpm.d/www.conf

以下の項目を nginx で動くように変更します。

; プロセスの実行ユーザ・グループ(apache → nginx)
user  = nginx
group = nginx

; 待ち受け先(Nginx の fastcgi_pass と一致させる)
listen = 127.0.0.1:9000

; ソケットを使う場合は以下に置き換え
; listen = /run/php-fpm/www.sock
; listen.owner = nginx
; listen.group = nginx
; listen.mode  = 0660

FPM の起動と自動起動:

systemctl start  php-fpm
systemctl enable php-fpm
systemctl status php-fpm

4. 動作確認

ドキュメントルートに info.php を作成して PHP が動くことを確認します。

<?php
phpinfo();

ブラウザで http://test.com/info.php を開き、phpinfo の表が表示されれば成功です。確認後は必ず削除してください(環境情報が漏れます)。

TCP ソケット vs Unix ソケット

方式fastcgi_pass / listen特徴
TCP127.0.0.1:9000分離マシンや Docker でも使いやすい / オーバーヘッドはやや高い
Unix ドメインソケットunix:/run/php-fpm/www.sock同一ホスト内で最速 / パーミッション管理が必要

よくあるエラーと対処

症状原因 / 対処
PHP ファイルがダウンロードされるlocation ~ \.php$ が無い / Nginx を再起動していない
502 Bad GatewayPHP-FPM 停止 or ポート不一致。systemctl status php-fpmss -lntp | grep 9000 で確認
404 Not Found(.php だけ)fastcgi_param SCRIPT_FILENAME のパス不一致。root と一致させる
白画面 / 500FPM 側の権限不足。/var/log/php-fpm/error.log と nginx の error.log を必ず両方見る
Permission denied on socketUnix ソケット時の所有者ずれ。listen.owner / listen.group を nginx に合わせる
パッケージが入らないphp-fpm のインストールエラー を参照

関連

編集
Post Share
子ページ

子ページはありません

同階層のページ
  1. インストール (CentOS編)
  2. 起動・停止コマンドとステータスの確認 (CentOS編)
  3. VPSへの導入例
  4. ドキュメントルートの変更方法
  5. phpを動かす際に必要な設定
  6. サブドメインの設定方法

最近更新/作成されたページ