Server

「docker」+「nginx」+「laravel」環境の構築手順

以前にDockerとApache環境でのLaravelの構築手順を書きました。

先日にnginxの静的ページの構築をまとめましたが、今回はPHP環境も入れてLaravelが起動出来る所まで記載します。
なお今回はデータベースについては省き、単純に起動するところまでとします。
(DBは特に変わったところは無いので)

0. 環境

  • macOS Mac Sonoma 14.6.1
  • Docker 27.2.0
  • Docker Compose v2.29.2-desktop.2
  • Laravel 11
  • PhpStorm 2024.2.3
  • nginx 1.27.1

1. ディレクトリ構成

ファイル構成は以下となります。
「nginx」と「php」とそれぞれの設定ファイルを作成します。

/
├── .docker/
│   ├── logs/ # ログファイルを見えるようにする
│   │   └── example.com # ドメインごとにログファイルを設定
│   ├── nginx/
│   │   ├── conf.d/ # サーバ名とルートディレクトリを設定
│   │   │   └── example.com.conf
│   │   ├── Dockerfile
│   │   └── nginx.conf
│   ├── php/
│   │   ├── conf.d/ # サーバ名とルートディレクトリを設定
│   │   │   └── example.com.conf
│   │   ├── Dockerfile
│   │   └── php.ini
│   │   └── docker-php-ext-xdebug.ini
└── docker-compose.yml

2. nginx側のDockerfile の記述

まずはnginx側の「Dockerfile」を作成し、以下のように記述します。

FROM nginx:1.27.2-alpine

# Japanese
ENV TZ=Asia/Tokyo

# Install packages
RUN set -eux \
    apk update -qq && apk upgrade -qq && apk add --no-cache 

# ADD nginx config
ADD ./.docker/nginx/nginx.conf /etc/nginx/nginx.conf
ADD ./.docker/nginx/conf.d/default.conf /etc/nginx/conf.d/example.conf

3. nginx.conf の記述

次に「nginx.conf」を作成し、以下のように記述します。
以前に設定した内容からは大きく変わっていません

pid        /var/run/nginx.pid;
worker_processes  auto;

events {
    worker_connections  400875;
}

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    keepalive_timeout  65;
    sendfile        on;

    # UTF-8を使用する
    charset UTF-8;

    # サーバ名を非表示にする
    server_tokens off;

    # アップロード可能なファイルサイズの上限を設定
    client_body_buffer_size 10M;
    client_max_body_size 10M;

    # バッファサイズの設定
    proxy_buffer_size 64k;
    proxy_buffers 100 64k;
    proxy_busy_buffers_size 128k;

    # gzip圧縮の設定
    gzip                on;
    gzip_http_version   1.0;
    gzip_types          text/plain text/css text/javascript application/javascript application/x-javascript application/x-httpd-php application/json application/font-sfnt application/font-woff image/x-icon;

    # ログファイルの設定
    # ログファイルのフォーマットをjson形式に設定
    log_format json escape=json '{'
                                '"time":"$time_iso8601",'
                                '"host":"$remote_addr",'
                                '"port":"$remote_port",'
                                '"method":"$request_method",'
                                '"uri":"$request_uri",'
                                '"status":"$status",'
                                '"body_bytes":"$body_bytes_sent",'
                                '"referer":"$http_referer",'
                                '"ua":"$http_user_agent",'
                                '"request_time":"$request_time",'
                                '"respons_time":"$upstream_response_time"'
                                '}';
    # 40x系のログを出力するための変数を設定
    map $status $res_status_4xx {
        ~^[4] 1;
        default 0;
    }
    # 50x系のログを出力するための変数を設定
    map $status $res_status_5xx {
        ~^[5] 1;
        default 0;
    }

    # access.logにjson形式で出力
    access_log /var/log/nginx/access.log json;

    # エラーログを出力
    access_log /var/log/nginx/error4xx.log json if=$res_status_4xx;
    access_log /var/log/nginx/error5xx.log json if=$res_status_5xx;
    error_log  /var/log/nginx/error.log info;

    # include
    include /etc/nginx/conf.d/*.conf;
}

4. nginx.d/example.conf の記述

次にサイトごとの設定ファイルを作成します。
ここにLaravelのURLに対応出来るように設定するようになります。

server {
    listen 80;
    server_name example.com;
    root /app/public;

    add_header X-Frame-Options "SAMEORIGIN";
    add_header X-XSS-Protection "1; mode=block";
    add_header X-Content-Type-Options "nosniff";

    index index.php;

    charset utf-8;

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

    location = /favicon.ico { access_log off; log_not_found off; }
    location = /robots.txt  { access_log off; log_not_found off; }

    error_page 404 /index.php;

    location ~ \.php$ {
        fastcgi_pass app:9000;
        fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
        include fastcgi_params;
    }

    location ~ /\.(?!well-known).* {
        deny all;
    }
}

これでまずはnginx側の設定が出来ました。
次にPHP側の設定を行っていきます。

5. php側のDockerfile の記述

次にPHP側の「Dockerfile」を作成し以下のように記述します。

FROM php:8.3-fpm

ENV TZ Asia/Tokyo

ARG BUILD_ENV=prod

RUN apt-get update -qq && \
    apt-get upgrade -qq && \
	apt-get install -y git unzip libzip-dev libicu-dev libonig-dev >/dev/null && \
    docker-php-ext-install intl pdo_mysql mbstring zip bcmath opcache >/dev/null && \
    pecl install xdebug && \
    apt-get clean && \
    :
		
COPY ./.docker/php/php.ini /usr/local/etc/php/php.ini

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

WORKDIR /app

6. php.ini の記述

次に「php.ini」を作成し、以下のように記述します。

zend.exception_ignore_args = off
expose_php = on
max_execution_time = 30
max_input_vars = 1000
upload_max_filesize = 64M
post_max_size = 128M
memory_limit = 256M
error_reporting = E_ALL
display_errors = on
display_startup_errors = on
log_errors = on
error_log = /var/log/php/php-error.log
default_charset = UTF-8

[Date]
date.timezone = Asia/Tokyo

[Assertion]
zend.assertions = -1

[mbstring]
mbstring.language = Japanese

7. xdebugに対応出来るように設定

xdebugでデバッグ出来るように「docker-php-ext-xdebug.ini」を作成し、以下のように記述します。

[xdebug]
zend_extension=xdebug
xdebug.mode=debug
xdebug.start_with_request=yes
xdebug.client_host = host.docker.internal
xdebug.client_port=9003

8. docker-compose.yml の記述

最後に「docker-compose.yml」を作成し、以下のように記述します。
各それぞれのコンテナごとにdockerfileを設定して作成します。

services:
    # PHP Service
    app:
        build:
            context: .
            dockerfile: ./.docker/php/Dockerfile
        volumes:
          - ./src/:/app
          - ./.docker/logs/php:/var/log/php
          - ./.docker/php/docker-php-ext-xdebug.ini:/usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini

    # Nginx Service
    web:
        build:
            context: .
            dockerfile: ./.docker/nginx/Dockerfile
        ports:
            - "9083:80"
        depends_on:
            - app
        volumes:
            - ./src/:/app
            - ./.docker/logs/nginx:/var/log/nginx

9. コンテナの立ち上げ

ターミナルを起動して「docker-compose.yml」があるディレクトリで以下のコマンドを実行します。

docker-compose up -d

10. Laravelのインストール

コンテナが立ち上がったら、コンテナに入ってLaravelをインストールします。
以下のコマンドでコンテナに入る事が出来ます。

docker-compose exec -it app bash

次にコマンドからLaravelをインストールします。

composer create-project --prefer-dist laravel/laravel .

11. ブラウザで確認

Laravelのインストールが完了したら、ブラウザを起動して http://localhost:9083 にアクセスして確認します。

Laravelの画面が表示されたら、まずは成功です。
このまま開発が進められるようになりますが、記事が長くなったので次回にPhpStormでデバッグするようにします。