📖

Laravel + Nginx + PHP-FPM 環境構築 作業手順まとめ

に公開

概要

  • Docker Compose を利用して、Nginx 経由で PHP 実行環境の動作確認を行うまでの手順をまとめます。
  • Laravel のフレームワーク起動は行わず、Nginx 経由で PHP 実行環境の動作確認を目的としています。

作業手順

1.各フォルダを作成

mkdir backend-php nginx

2.コンテナ内で必要なツールとPHP拡張をインストール

# コンテナ内に入る
(1) docker compose exec backend-php bash

# コンテナ内で以下のコマンドを実行
(2) apt-get update && apt-get install -y libzip-dev zip unzip git
(3) docker-php-ext-install zip

# zip が表示されるか確認
(4) php -m | grep zip

# Laravel プロジェクトを作成
(5) composer create-project --prefer-dist laravel/laravel .

(6) exit

3.必要なファイルを各フォルダに作成・配置

a. docker-compose.yml
b. Dockerfile.dev(開発用)、Dockerfile.prod(本番用)
c. nginx/default.conf
d. backend-php/.envの作成とDB接続情報追加

a. docker-compose.yml

  backend-php:  # Laravel アプリケーションの PHP 実行環境(サービス名)
    build:
      context: ./backend-php
      dockerfile: Dockerfile.dev
    volumes:  
      - ./backend-php:/var/www/html
    command: php-fpm
    depends_on:  
      - db

ポイント

  • build:バックエンド用の Docker イメージを構築します。
  • context:ビルド対象となるディレクトリで、./backend-php を指定します。
  • dockerfile:使用する Dockerfile を Dockerfile.dev(開発用)に指定します。
  • volumes:ローカルの ./backend-php ディレクトリをコンテナ内の /var/www/html にマウントします。(ソースコードの共有)
    これにより、ローカルでのファイル変更がリアルタイムにコンテナ内へ反映され、開発がスムーズに行えます。
  • command:コンテナ起動時に php-fpm プロセスを実行します。
    Laravel のリクエスト処理は Nginx から FastCGI を通じてこの PHP-FPM が担います。
  • depends_on:backend-php が起動する前に db(データベース)サービスが起動するよう制御します。
  nginx:  # Nginx Webサーバ(リバースプロキシ)を定義
    image: nginx:alpine
    ports:
      - "3002:80"
    volumes:
      - ./backend-php:/var/www/html
      - ./nginx/default.conf:/etc/nginx/conf.d/default.conf
    depends_on:
      - backend-php

ポイント

  • image:軽量な公式 Nginx イメージ nginx:alpine を使用します。
  • ports:ホストのポート 3002 をコンテナ内のポート 80 にマッピングします。
    例)ブラウザから http://localhost:3002 でアクセスできます。
  • volumes:./backend-php:/var/www/html:Nginx が Laravel のソースコードへアクセスできるようにします。
  • ./nginx/default.conf:/etc/nginx/conf.d/default.conf:Nginx のカスタム設定ファイルを適用します。

b. Dockerfile

<Dockerfile.dev(開発用)>

# ベースイメージ
FROM php:8.2-fpm

# 開発用の必要なパッケージをインストール
RUN apt-get update && apt-get install -y \
    git \
    unzip \
    zip \
    vim \
    libpq-dev \
    && docker-php-ext-install pdo pdo_pgsql

# Composer インストール(公式イメージからバイナリコピー)
COPY --from=composer:2 /usr/bin/composer /usr/bin/composer

# 作業ディレクトリ設定
WORKDIR /var/www/html

# PHP-FPM のデフォルトポート公開
EXPOSE 9000

ポイント

  • FROM:ベースイメージに php:8.2-fpm を使用します。
    Debian ベースでツールが豊富なため、開発向きの環境が構築しやすいです。
  • RUN:必要な開発用パッケージをインストールします。
    • git:バージョン管理ツール。ソース管理やライブラリのクローンに使用。
    • unzip, zip:アーカイブ操作ツール。Composer で zip アーカイブを扱う際に必要。
    • vim:軽量テキストエディタ。コンテナ内で簡単なファイル編集が可能。
    • libpq-dev:PostgreSQL データベースに接続するための開発ライブラリ。
    • docker-php-ext-install pdo pdo_pgsql:PDO と PostgreSQL の PHP 拡張モジュールをインストールし、DB接続を可能にします。
  • COPY:Composer の公式イメージからバイナリを直接コピーし、Composerをインストールします。
    これにより、別途ダウンロード手順は不要になります。
  • WORKDIR:コンテナ内の作業ディレクトリを /var/www/html に設定します。
    Laravel のソースコードはこのディレクトリに配置されます。
  • EXPOSE:PHP-FPM が待ち受けるポート 9000 を公開します。
    Nginx からのリクエストはこのポートを通じて受け付けます。

<Dockerfile.prod(本番用)>

FROM php:8.2-fpm-alpine

RUN apk add --no-cache \
    git \
    unzip \
    postgresql-dev \
    && docker-php-ext-install pdo pdo_pgsql

COPY --from=composer:2 /usr/bin/composer /usr/bin/composer

WORKDIR /var/www/html

EXPOSE 9000

ポイント

  • FROM:ベースイメージに php:8.2-fpm-alpine を使用します。
    Alpine Linux ベースのため、軽量でセキュリティに優れたイメージです。
    不要なツールが省かれており、本番環境向けに最適です。

開発用と本番用の違いまとめ

項目 開発用 (Dockerfile.dev) 本番用 (Dockerfile.prod)
ベースイメージ php:8.2-fpm(Debianベース) php:8.2-fpm-alpine(軽量・高速)
目的 開発作業向け(利便性重視) 本番環境向け(軽量・セキュリティ重視)
イメージサイズ 大きめ(ツール豊富) 小さめ(不要なツールを排除)
パッケージ管理 apt-get(Debian系) apk(Alpine Linux)
インストールツール git, unzip, zip, vim, libpq-dev git, unzip, postgresql-dev
エディタ vim インストール済み 不要なため未インストール
DB ライブラリ libpq-dev(PostgreSQL) postgresql-dev(PostgreSQL)
PHP 拡張 pdo, pdo_pgsql 同左(pdo, pdo_pgsql
Composer 公式イメージからバイナリコピー 同左
WORKDIR /var/www/html 同左
EXPOSE 9000 同左

補足
本記事では本番環境の軽量化を意識して、Dockerfile.prod に php:8.2-fpm-alpine を使用しています。
ただし、Alpine ベースは Debian ベース(php:8.2-fpm等)と OS の構造が大きく異なるため、開発と本番で動作差が出る可能性があるのであまり良くありません。
本番でも安定した動作を優先する場合は、開発と同様に Debian ベース(php:8.2-fpm)を使用することをおすすめします。

c. nginx/default.conf

server {
    listen 80;

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

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location ~ \.php$ {
        fastcgi_pass backend-php:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME /var/www/html$fastcgi_script_name;
        include fastcgi_params;
    }
}

ポイント

  • listen 80:Nginx が HTTP の標準ポート 80 でリクエストを受け付けます。
    ブラウザから http://localhost:3002(Docker のポートマッピングによる)でアクセス可能。
  • root /var/www/html/public:Laravel の public ディレクトリを Web 公開ルートに設定します。
    セキュリティ上、アプリケーションの他のディレクトリは直接アクセスできないようにします。
  • index index.php index.html:デフォルトで読み込むファイルの優先順位を設定します。
    例:index.php があれば最優先で読み込む。
location / {try_files $uri $uri/ /index.php?$query_string;}
  • 静的ファイル(画像、CSS、JS など)が存在すれば直接返却。
  • 存在しない場合は/index.phpにリクエストを渡し、Laravelのルーティングに処理を任せます。
  • これにより、すべてのリクエストが Laravel に集約され、ルーティング制御が可能になります。
location ~ \.php$ {
    fastcgi_pass backend-php:9000;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME /var/www/html$fastcgi_script_name;
    include fastcgi_params;
  }
  • .php ファイルへのリクエストは PHP-FPM に渡されます。
  • fastcgi_pass backend-php:9000;
    • Docker Compose のサービス名 backend-php で定義したコンテナのポート 9000(PHP-FPM)にリクエストを転送。
  • fastcgi_param SCRIPT_FILENAME
    • 実行する PHP ファイルのフルパスを Nginx から PHP-FPM に渡します。
  • include fastcgi_params
    • 標準的な FastCGI パラメータを読み込みます。

4.コンテナを起動

docker compose build → docker compose up -d

まとめ

  • Docker Compose を使って、Nginx 経由で PHP の実行環境を構築しました。
  • 今回は Laravel のフレームワーク起動は行わず、PHP 環境と Nginx の連携確認を目的としています。
  • localhost:3002 にアクセスすると、Nginx 経由で backend-php の PHP 実行環境が動作していることを確認できます!
  • この環境をベースに、今後の作業
    • Laravel のルーティングやコントローラの作成
    • データベースコンテナ(PostgreSQL など)の追加と .env の調整

Discussion