ローカルのDocker(PHP)環境でHTTPS(SSL)対応する

docker

ローカルのDockerでHTTPS(SSL)対応しました。
dockerでPHPを動かしている環境です。Laravelでもローカル環境でHTTPS通信することが可能です。

とあるライブラリを使用するときにHTTPS(SSL)にする必要があり調べてみました。
すると、mkcertを使用することでローカルのHTTPS化が可能でした。

この記事では下記を解説しています。

・mkcertのインストール
・mkcertで証明書の作成
・HTTPSなDocker(PHP)環境の構築

試してみた環境は下記です。

OS:MacOS
nginx : lastest
PHP: 7.4-fpm

お急ぎの方は、HTTPS(SSL)対応したDockerを公開していますので、こちらのgithubのブランチをご確認ください。
codelike_web_dockerのsslブランチで対応してみました。

証明書は入れてないので、mkcert作成して上書きすれば使えると思います。

PR

mkcertをインストールする

brewコマンドでinstallします。

brew install mkcert

mkcertで証明書を作成する

mkcertコマンドを使用して、証明書を作成します。
mkcert -installを使っているパソコンで一度実行する必要があるようです。

mkcert -install

localhostと127.0.0.1の名前に対応した証明書を作ります。

mkcert localhost 127.0.0.1

コマンドを実行すると、下記の証明書が作成されます。
・localhost+1-key.pem
・localhost+1.pem

作成したファイルをdockerで管理している任意の場所に移動します。
今回はcodelike_web_docker/nginx/cert-key/に移動しました。

docker-compose.ymlを修正する

docker-compose.ymlのnginxのイメージ箇所に下記のように設定します。

version: '3'
services:
  nginx:
    image: nginx:latest
    container_name: codelike_web_nginx
    ports:
      - 8080:8080
      - 443:443
    depends_on:
      - php
      - db
    volumes:
      - ./nginx/codelike_server.conf:/etc/nginx/conf.d/default.conf
      - ./nginx/cert-key/localhost+1.pem:/etc/certs/localhost+1.pem
      - ./nginx/cert-key/localhost+1-key.pem:/etc/certs/localhost+1-key.pem
      - ../:/var/www/html

追加したところの解説です。
まず、portsのところにhttps(ssl)通信するポート番号の443を記載しました。

volumesに先ほど、作成した証明書を/nginx/cert-key//etc/certs/配下で共有するように設定しました。
この証明書をnginxの設定ファイルで使います。

- ./nginx/cert-key/localhost+1.pem:/etc/certs/localhost+1.pem
- ./nginx/cert-key/localhost+1-key.pem:/etc/certs/localhost+1-key.pem

nginxの設定ファイルを修正する

/nginx/codelike_server.confに下記のように追加しました。

server {
    listen 443 ssl;
    ssl_certificate /etc/certs/localhost+1.pem;
    ssl_certificate_key /etc/certs/localhost+1-key.pem;

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

    root  /var/www/html/;
    index index.php index.html;

    charset utf-8;

    location / {
        if (!-e $request_filename) {
            rewrite ^(.*)$ /$1.php;
        }
        try_files $uri $uri/ =404;
    }

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

SSL(443)で接続された場合の設定を追加しています。
普通にPHPを使えるようにするのと、違う箇所が下記になります。

listen 443 ssl;
ssl_certificate /etc/certs/localhost+1.pem;
ssl_certificate_key /etc/certs/localhost+1-key.pem;

SSLを使用するようにして、証明書を使うようにしています。
今回はPHPを動かすように設定していますが、Laravelの設定をここにすることでLaravelもHTTPS(SSL)で動いてくれます。

DockerなHTTPS通信の動作確認

https://localhostに接続してみると…
下記のようにHTTPS化できていることが確認できました。

dockerなphpでhttps(ssl)通信する

終わりに

ローカル環境のSSL化が簡単にできました。
とあるライブラリでSSLが必要だったのでやってみましたが、簡単にできてよかった。。

8080ポートは、なんでSSLにならないんじゃ?とかちょっと思いましたが
SSLは443ポートを使うからですね。。
他のポート番号は使えるんだろうか…🤔

dockerPHPプログラミング
独学に限界を感じたら、オンラインのプログラミングスクールへ...
  • Code ViIlage
      挫折させない本気のプログラミングスクール。学習継続率93.3%・卒業生800名以上。
  • DMM WEBCAMP
      働きながら自分のペース学んでエンジニア転職。無料カウンセリング満足度99%!
  • TECH CAMP
      無料カウンセリング満足度95%!本業に活かせる。キャリアアップにつながる。
  • TechAcademy
      現役エンジニアから学べるオンラインに特化したプログラミングスクール。
  • テックパートナーズカレッジ
      WEBシステム開発会社のノウハウが学べるオンラインスクール。14日無料体験有り!
  • \ PHP・Laravelに特化したオンラインスクール /
    yasuakiをフォローする
    codelikeなブログ

    コメント

    タイトルとURLをコピーしました