Nginxを使用してLaravelのトップページを表示する方法(Docker + Nginx + PHP8.2)
はじめに
今回は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の設定
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開発に必要な依存関係をインストールすることができます🪄
# M1 Macを使用しているので指定しています
FROM 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
[Date]
date.timezone = "Asia/Tokyo"
[mbstring]
mbstring.internal_encoding = "UTF-8"
mbstring.language = "Japanese"
docker-compose.yml
今回はわかりやすいようにlaravel(appコンテナ),nginx以外の記述はしておりません。
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