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 として設定します。

既存のネットワーク sailipam ブロックでサブネットに環境変数: 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) で接続ができます。

以上