PHP アプリのデプロイ(Nginx + PHP-FPM)
『PHPアプリのデプロイ(Nginx + PHP-FPM)』は、PHP アプリケーションを Ubuntu サーバー上で本番稼働させるための一連の手順です。PHP-FPM をインストールして設定し、Nginx のバーチャルホストを構成し、適切なファイルパーミッションを設定してサービスを起動します。各ステップを正しい順序で実行することで、安全かつ安定した PHP 実行環境を構築できます。
構文
# -----------------------------------------------
# PHPアプリのデプロイ全体フロー(Ubuntu / Nginx + PHP-FPM)
# -----------------------------------------------
# ステップ1: PHP-FPM のインストール
# -----------------------------------------------
# apt install php{バージョン}-fpm
# → PHP-FPM(FastCGI Process Manager)をインストールします
# → Nginx は PHP を直接実行できないため、
# PHP-FPM 経由で処理を委譲します
# 例: sudo apt install php8.3-fpm
# -----------------------------------------------
# ステップ2: Nginx バーチャルホストの設定
# -----------------------------------------------
# /etc/nginx/sites-available/{サイト名}
# → バーチャルホスト設定ファイルを作成します
# 例: sudo nano /etc/nginx/sites-available/example-app
# ln -s /etc/nginx/sites-available/{サイト名} /etc/nginx/sites-enabled/
# → シンボリックリンクで設定を有効化します
# 例: sudo ln -s /etc/nginx/sites-available/example-app \
# /etc/nginx/sites-enabled/example-app
# nginx -t
# → 設定ファイルの構文チェックを行います
# → デプロイ前に必ず実行してください
# -----------------------------------------------
# ステップ3: ファイルパーミッションの設定
# -----------------------------------------------
# chown -R {ユーザー}:{グループ} {アプリディレクトリ}
# → アプリケーションファイルのオーナーを設定します
# → PHP-FPM が実行するユーザーに所有権を与えます
# 例: sudo chown -R www-data:www-data /var/www/example-app
# chmod -R 755 {ディレクトリ}
# → ディレクトリへのアクセス権を設定します
# → オーナー: 読み書き実行 / グループ・その他: 読み実行
# chmod -R 644 {ファイル}
# → ファイルへのアクセス権を設定します
# → オーナー: 読み書き / グループ・その他: 読み取りのみ
# -----------------------------------------------
# ステップ4: サービスの起動・有効化
# -----------------------------------------------
# systemctl start php{バージョン}-fpm
# → PHP-FPM を起動します
# 例: sudo systemctl start php8.3-fpm
# systemctl enable php{バージョン}-fpm
# → サーバー再起動時も PHP-FPM が自動起動するよう登録します
# systemctl reload nginx
# → Nginx を再起動せずに設定を再読み込みします
# → 接続を維持したまま設定を反映できます
構文一覧
| 手順 | 説明 |
|---|---|
| PHP-FPM のインストール | sudo apt install php8.3-fpm で PHP-FPM をインストールします。Nginx から PHP を実行するために必要です。拡張モジュール(php8.3-mbstring など)も同時にインストールしておくと便利です。 |
| PHP-FPM の起動確認 | systemctl status php8.3-fpm でプロセスが正常に動作しているかを確認します。active (running) と表示されれば稼働中です。 |
| バーチャルホスト設定ファイルの作成 | /etc/nginx/sites-available/ 以下に設定ファイルを作成します。fastcgi_pass unix:/run/php/php8.3-fpm.sock; でPHP-FPM のソケットを指定します。 |
| 設定の有効化 | ln -s /etc/nginx/sites-available/{サイト名} /etc/nginx/sites-enabled/ でシンボリックリンクを作成し設定を有効化します。 |
| Nginx 設定の構文チェック | sudo nginx -t で設定ファイルの構文を検証します。syntax is ok と表示されれば問題ありません。反映前に必ず実行してください。 |
| オーナーの設定 | sudo chown -R www-data:www-data {ディレクトリ} でファイルの所有者を Nginx・PHP-FPM の実行ユーザー(www-data)に設定します。 |
| ディレクトリのパーミッション設定 | sudo chmod -R 755 {ディレクトリ} でディレクトリを「オーナー: 読み書き実行 / その他: 読み実行」に設定します。 |
| ファイルのパーミッション設定 | sudo chmod -R 644 {ファイル} でファイルを「オーナー: 読み書き / その他: 読み取りのみ」に設定します。PHP ファイルの書き換えを他ユーザーから守ります。 |
| Nginx の設定再読み込み | sudo systemctl reload nginx で既存の接続を切断せずに設定を反映します。restart より安全で、本番環境での設定更新に適しています。 |
| 自動起動の有効化 | sudo systemctl enable php8.3-fpm nginx でサーバー再起動後も両サービスが自動起動するよう登録します。 |
使用例
PHPアプリのデプロイ手順(Ubuntu / Nginx + PHP-FPM)
# ===============================================================
# example-app のデプロイ手順
# 環境: Ubuntu 22.04 / Nginx / PHP 8.3-FPM
# ===============================================================
# -----------------------------------------------
# 1. パッケージの更新と PHP-FPM のインストール
# -----------------------------------------------
# パッケージリストを最新化します
sudo apt update
# PHP 8.3 FPM と必要な拡張モジュールをインストールします
# mbstring: 日本語などマルチバイト文字列の処理
# xml: XML パース処理(一部フレームワークで必要)
# curl: 外部 API への HTTP リクエスト
# mysql: MySQL / MariaDB データベースへの接続
sudo apt install php8.3-fpm php8.3-mbstring php8.3-xml php8.3-curl php8.3-mysql
# Nginx がまだインストールされていなければインストールします
sudo apt install nginx
# -----------------------------------------------
# 2. アプリケーションファイルの配置
# -----------------------------------------------
# アプリケーションのルートディレクトリを作成します
sudo mkdir -p /var/www/example-app/public
# アプリケーションのファイルをサーバーへ転送します
# (ローカルからの rsync でのアップロード例)
# rsync -avz ./src/ user@your-server:/var/www/example-app/
# -----------------------------------------------
# 3. ファイルパーミッションの設定
# -----------------------------------------------
# アプリ全体のオーナーを www-data(Nginx / PHP-FPM の実行ユーザー)に変更します
sudo chown -R www-data:www-data /var/www/example-app
# ディレクトリは 755(オーナー: rwx / グループ・その他: r-x)に設定します
# トラバーサル(ディレクトリの通過)に実行権が必要です
sudo find /var/www/example-app -type d -exec chmod 755 {} \;
# PHP ファイルなど通常ファイルは 644(オーナー: rw- / その他: r--)に設定します
# 他ユーザーからの書き換えを防ぎます
sudo find /var/www/example-app -type f -exec chmod 644 {} \;
# アップロードディレクトリは PHP-FPM が書き込めるよう 775 にします
# (uploads ディレクトリが存在する場合)
sudo chmod -R 775 /var/www/example-app/public/uploads
# -----------------------------------------------
# 4. Nginx バーチャルホストの設定
# -----------------------------------------------
# バーチャルホスト設定ファイルを作成します
sudo tee /etc/nginx/sites-available/example-app <<'EOF'
server {
listen 80;
server_name example-app.example.com;
# ドキュメントルートを public ディレクトリに設定します
root /var/www/example-app/public;
index index.php index.html;
# 通常のリクエストを処理します
# ファイルが存在しない場合は index.php へフォールバックします
location / {
try_files $uri $uri/ /index.php?$query_string;
}
# PHP ファイルを PHP-FPM に転送する設定です
location ~ \.php$ {
# ディレクトリトラバーサル攻撃を防ぐため
# 実在するファイルのみ処理します
try_files $uri =404;
# FastCGI の基本パラメータを読み込みます
include fastcgi_params;
# PHP-FPM のソケットファイルを指定します
fastcgi_pass unix:/run/php/php8.3-fpm.sock;
# エントリーポイントのスクリプト名をセットします
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
# .htaccess など隠しファイルへのアクセスを拒否します
location ~ /\. {
deny all;
}
}
EOF
# sites-available から sites-enabled へシンボリックリンクを作成して有効化します
sudo ln -s /etc/nginx/sites-available/example-app \
/etc/nginx/sites-enabled/example-app
# -----------------------------------------------
# 5. 設定の確認とサービスの起動
# -----------------------------------------------
# Nginx の設定ファイルに構文エラーがないか確認します
# エラーがあれば reload 前に修正してください
sudo nginx -t
# PHP-FPM を起動してサーバー再起動時も自動起動するよう登録します
sudo systemctl start php8.3-fpm
sudo systemctl enable php8.3-fpm
# Nginx の設定を再読み込みします(接続を維持したまま反映できます)
sudo systemctl reload nginx
# Nginx もサーバー再起動時に自動起動するよう登録します
sudo systemctl enable nginx
実行するコマンドは次の通りです。
$ 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 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; vendor preset: enabled)
Active: active (running) since Wed 2026-03-25 10:00:00 JST; 3s ago
Main PID: 12345 (php-fpm8.3)
Status: "Processes active: 0, idle: 2, Requests: 0, slow: 0, Traffic: 0req/sec"
$ sudo systemctl status nginx
● nginx.service - A high performance web server and a reverse proxy server
Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
Active: active (running) since Wed 2026-03-25 10:00:05 JST; 2s ago
$ ls -la /var/www/example-app/public/
total 20
drwxr-xr-x 2 www-data www-data 4096 Mar 25 10:00 .
drwxr-xr-x 3 www-data www-data 4096 Mar 25 10:00 ..
-rw-r--r-- 1 www-data www-data 312 Mar 25 10:00 index.php
-rw-r--r-- 1 www-data www-data 128 Mar 25 10:00 app.php
-rw-r--r-- 1 www-data www-data 128 Mar 25 10:00 api.php
概要
『PHPアプリのデプロイ(Nginx + PHP-FPM)』は、Nginx が PHP を直接実行できないという仕組みに基づいています。Nginx はリクエストを受け取ると fastcgi_pass ディレクティブで指定した UNIX ソケット経由で PHP-FPM にリクエストを転送し、PHP-FPM が PHP スクリプトを実行して結果を返します。Nginx のバーチャルホスト設定では try_files $uri $uri/ /index.php?$query_string; を使って URL ルーティングを実現するのが一般的です。ファイルパーミッションは PHP-FPM の実行ユーザーである www-data を基準に設定し、通常ファイルは 644・ディレクトリは 755・書き込みが必要なアップロードディレクトリのみ 775 とすることでセキュリティを維持できます。本番環境ではファイアウォールの設定も重要で、ufw で HTTP(80番ポート)・HTTPS(443番ポート)のみ許可するよう設定してください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。