2021-10-04
Laravel Sail で SSL (HTTPS) 接続を行う
🎉 Laravel Sail を HTTPS 化するプラグイン: Sail-SSL がリリースされました
本記事で解説している Nginx コンテナを利用した HTTPS 化を行えるプラグイン: Sail-SSL がリリースされました。
インストールおよび起動方法は下記の通りです。
ローカルの PHP / Composer を利用する場合:
composer require ryoluo/sail-ssl --dev
php artisan sail-ssl:install
./vendor/bin/sail up
Sail コンテナを利用する場合:
./vendor/bin/sail up -d
./vendor/bin/sail composer require ryoluo/sail-ssl --dev
./vendor/bin/sail artisan sail-ssl:install
./vendor/bin/sail down
./vendor/bin/sail up
コンテナの起動後、 https://localhost にアクセスできます。
GitHubリポジトリの README も併せてご参照ください。
以下、旧解説記事になります。
やること
- Docker Compose に Nginx コンテナを追加
- Nginx でリバースプロキシを設定し、Laravel のビルトインサーバに流す
- Nginx には固定 IP でアクセスできるように設定
サンプルは https://github.com/ryoluo/laravel-sail-ssl で公開しています。 (README.md にしたがって、すぐに立ち上げられます。)
環境変数の設定
あらかじめ以下の環境変数を追加します。
APP_PORT
, APP_SSL_PORT
, FORWARD_DB_PORT
- 私の環境ではローカルでも Nginx および MySQL を利用しているため、ポートが被らないように変更します。
APP_ADDRESS
, NW_SUBNET
- Nginx の IP アドレスを固定するために指定します。
.env
APP_PORT=50080
APP_SSL_PORT=50443
FORWARD_DB_PORT=53306
APP_ADDRESS=192.168.64.10
NW_SUBNET=192.168.64.0/18
Nginx コンテナの追加
web
という名前で Nginx コンテナを追加します。ネットワークには既存の sail
を指定し、環境変数: APP_ADDRESS
を固定 IP として設定します。
既存のネットワーク sail
は ipam
ブロックでサブネットに環境変数: NW_SUBNET
を指定します。
これで Nginx コンテナが固定 IP で立ち上がります。
docker-compose.yml
version: '3'
services:
# Nginx コンテナを追加
web:
image: nginx:latest
volumes:
- ./nginx/templates:/etc/nginx/templates
- ./nginx/certs/:/etc/nginx/certs
ports:
- '${APP_SSL_PORT:-443}:443'
networks:
sail:
# 固定 IP
ipv4_address: ${APP_ADDRESS}
depends_on:
- laravel.test
laravel.test:
# 省略
networks:
sail:
driver: bridge
# サブネットを指定
ipam:
driver: default
config:
- subnet: ${NW_SUBNET}
volumes:
# 省略
サーバ証明書の生成
./nginx/certs
および ./nginx/templates
ディレクトリを作成しておきます。
自己署名証明書を生成し、./nginx/certs
に配置します。
bash
mkdir -p {./nginx/certs,./nginx/templates}
openssl req -x509 -nodes -newkey rsa:2048 -days 3650 \
-keyout ./nginx/certs/server.key \
-out ./nginx/certs/server.crt
Nginx の設定ファイルを作成
./nginx/templates
ディレクトリに設定ファイル: default.conf.template
を作成します。このファイルは Nginx コンテナで /etc/nginx/conf.d/default.conf
として展開されます。
参考: https://hub.docker.com/_/nginx
/etc/nginx/templates/default.conf.template will be output with the filename /etc/nginx/conf.d/default.conf.
./nginx/templates/default.conf.template
server {
listen 80 default_server;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl default_server;
ssl_certificate /etc/nginx/certs/server.crt;
ssl_certificate_key /etc/nginx/certs/server.key;
location / {
proxy_pass http://laravel-sail-ssl_laravel.test_1;
}
}
80 番にアクセスが来た際は HTTPS にリダイレクトし、さらに 443 ポートではプロキシで Laravel のビルトインサーバに送ります。
proxy_pass
の"laravel-sail-ssl" の箇所はディレクトリ名に依存するので、適宜置き換えてください。
コンテナを起動
bash
./vendor/bin/sail up
正常にコンテナが起動したら、下記 URL から Laravel アプリケーションに SSL (HTTPS) で接続ができます。
以上