👨‍👩‍👦

Nginxを使用してLaravelのトップページを表示する方法(Docker + Nginx + PHP8.2)

2023/11/15に公開

はじめに

今回はNginxを使用して http://localhost:8080/ にアクセスするとLaravelのトップページを表示されるようにしたいと思います。

Laravelプロジェクトの作成

curl -s https://laravel.build/<プロジェクト名> | bash

無事にプロジェクトが作成できると下記のコマンドが表示されますので、表示通りに実行してコンテナを起動してください。

 cd <作成されたプロジェクト名> && ./vendor/bin/sail up

sail upのあとに-dをつけると、バックグラウンドでSailを立ち上げることができるのでターミナルでコマンドを入力し続けることができます。

立ち上げが終わったら、下記にアクセスしてみてください。

http://localhost/ にアクセスするとLaravel のデフォルトのトップページ(welcome.blade.php)が表示されているかと思います。

http://localhost:8080/ ではアクセスできないと思います。

それでは以下の項目を実行して http://localhost:8080/ にアクセスするとLaravelのトップページを表示されるようにしたいと思います。

dockerフォルダの作成

ルートディレクトリに以下のように作成します。

Nginxの設定

docker/nginx/default.conf
server {
    listen 80; # ポート80でリクエストを受け付け
    server_name localhost; # localhostをサーバー名として設定
    root /var/www/html/public; # 公開するディレクトリ

    error_log /var/log/nginx/error.log;
    access_log /var/log/nginx/access.log;

    # セキュリティヘッダーを追加して、クロスフレームスクリプティング(XSS)やクリックジャッキングなどのセキュリティ攻撃から保護
    add_header X-Frame-Options "SAMEORIGIN";
    add_header X-XSS-Protection "1; mode=block";
    add_header X-Content-Type-Options "nosniff";

    index index.php index.html; # デフォルトのインデックスドキュメントとしてindex.phpとindex.htmlを指定

    charset utf-8;

    location / {
        try_files $uri $uri/ /index.php?$query_string; # ホスト名/ にアクセスしたら、まずリクエストURIで処理、次にindex.phpで処理を試みる
    }

    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; # 404エラーが発生した場合、/index.phpにリダイレクト

    # PHPファイルの処理を記述
    location ~ \.php$ {
        try_files $uri =404; # .phpファイルが存在しない場合は404エラーを返す、現在はLaravelのindex.phpにリダイレクトされることになる
        fastcgi_pass app:9000; # "app" サービスを指定、 "app" サービスの9000ポートにFastCGIリクエストを転送している
	fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
        fastcgi_cache off; # Nginxのキャッシュを無効化
    }

    # 不正なリクエストへの対応
    location ~ /\.(?!well-known).* {
        deny all;
    }
}

PHP

今回はcurl -s https://laravel.build/<プロジェクト名> | bash でLaravelプロジェクトの作成しているので不要ですが、RUN composer global require "laravel/installer"と記述することで、Laravel開発に必要な依存関係をインストールすることができます🪄

docker/php/Dockerfile
# M1 Macを使用しているので指定しています
FROM --platform=linux/amd64 php:8.2-fpm

# 設定ファイル(php.ini)をPHPイメージ内のディレクトリにコピー
COPY ./php.ini /usr/local/etc/php/

# 開発ライブラリ、PHPの拡張機能などをインストール
RUN apt-get update \
    && apt-get install -y zlib1g-dev mariadb-client vim libzip-dev libgmp-dev libgd-dev \
    && docker-php-ext-install zip pdo_mysql gmp gd

# Composerのインストール
RUN php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
RUN php composer-setup.php
RUN php -r "unlink('composer-setup.php');"
RUN mv composer.phar /usr/local/bin/composer

# Composerのための環境変数を設定
# Composerをルートユーザーとして実行できるように設定
ENV COMPOSER_ALLOW_SUPERUSER 1
# Composerがファイルを保存するディレクトリを設定
ENV COMPOSER_HOME /composer
# Composerでグローバルにインストールされたコマンドやツールが、どのディレクトリからでも直接実行できるようになる
ENV PATH $PATH:/composer/vendor/bin

WORKDIR /var/www/html
docker/php/php.ini
[Date]
date.timezone = "Asia/Tokyo"
[mbstring]
mbstring.internal_encoding = "UTF-8"
mbstring.language = "Japanese"

docker-compose.yml

今回はわかりやすいようにlaravel(appコンテナ),nginx以外の記述はしておりません。

docker-compose.yml
version: "1"
services:
    app:
        platform: linux/amd64 # M1 Macを使用しているので指定しています
        container_name: app
        build:
            context: ./docker/php
            dockerfile: Dockerfile
        volumes:
            - ./:/var/www/html
        ports:
            - "80:80"
            - "443:443" # HTTPSの際に使用されるポート
    nginx:
        platform: linux/amd64 # M1 Macを使用しているので指定しています
        container_name: nginx
        image: nginx:latest
        ports:
            - "8080:80" # ホストのポート80をコンテナのポート8080にマッピング
        volumes:
            - ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf
            - ./:/var/www/html
        working_dir: /var/www/html
        depends_on:
            - app

コンテナの起動

コンテナイメージをビルドして

docker-compose build

コンテナを起動します。(-dはデタッチドモードです。)

docker compose up -d

無事にコンテナが起動していることを確認したら、

http://localhost:8080/ にアクセスしてLaravel のデフォルトのトップページ(welcome.blade.php)が表示されているか確認してください。

ホストのポート80をコンテナのポート8080にマッピングしているので
http://localhost/ はアクセスできなくなっていると思います。

終わりに

何かありましたらお気軽にコメント等いただけると助かります。
ここまでお読みいただきありがとうございます🎉

Discussion