カテゴリー: Server

https-portalで既存のdocker環境をhttps化

はじめに

こんにちは。最近dockerを触ってばかりいます。以前、ローカルでオレオレ証明書をサクッと発行する方法をご紹介しましたが、その記事の最後にご紹介したhttps-portalを使い、今回はdocker-composeのみでhttps化をしてみようと思います。

環境はmacOS High Sierra 10.13.6, Docker Desktop 2.0.0.3です。

https-portalとは

dockerで構築したサーバを自動でhttps化してくれるコンテナで、nginxとlet’s encryptを内包しています。DNS登録されているドメインなら実際に証明書を取得し、ローカルの場合はオレオレ証明書に切り替えてくれます(ブラウザの警告は出てしまいますが)。
チュートリアルにはwordpressコンテナとの接続方法が記載されていますが、今回は一度構築したnginx+php-fpmをhttps化します。

設定ファイル

前回の記事で作成したdocker-compose.ymlがベースになっています。

docker-compose.yml

最終的にこうなります。php-fpm, db, mailhogは一切変更が無いので、ここでは触れません。

version: "3"
services:
  https-portal:
    image: steveltn/https-portal:1
    ports:
      - 80:80
      - 443:443
    restart: always
    environment:
      DOMAINS: 'laravel.local -> http://web:8000'
      STAGE: local
    volumes:
      - ./org-chimata-ssl-certs:/var/lib/https-portal
  web:
    image: nginx:latest
    ports:
      - 8000:8000
    volumes:
      - ./docker/web/default.conf:/etc/nginx/conf.d/default.conf
      - .:/var/www/html
    depends_on:
      - php-fpm
  php-fpm:
    build: ./docker/php
    volumes:
      - .:/var/www/html
    depends_on:
      - db
      - mailhog
  db:
    image: mariadb:latest
    ports:
      - 3306:3306
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_USER: test
      MYSQL_PASSWORD: test
      MYSQL_DATABASE: testdb
    volumes:
      - ./db-data:/var/lib/mysql
  mailhog:
    image: mailhog/mailhog
    ports:
      - "8025:8025"
      - "1025:1025"

default.conf

nginxの設定ファイルです。こちらも最終的な内容になります。

server {
    listen 8000;
    server_name laravel.local

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

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

    location / {
        try_files $uri $uri/ /index.php$is_args$args;
    }

    location ~ \.php$ {
        root /var/www/html/testapp/public;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass   php-fpm:9000;
        fastcgi_index  index.php;

        include        fastcgi_params;
        fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param  PATH_INFO $fastcgi_path_info;
    }
}

php-fpmDockerfileは前回から変更ありませんので省略しています。

説明

docker-compose.yml

https-portalの記述部分を抜粋しています。

https-portal:
  image: steveltn/https-portal:1
  ports:
    - 80:80
    - 443:443
  restart: always
  environment:
    DOMAINS: 'laravel.local -> http://web:8000'
    STAGE: local
  volumes:
    - ./org-chimata-ssl-certs:/var/lib/https-portal
web:
  image: nginx:latest
  ports:
    - 8000:8000
  • image:
    現在公開されているのが1系なので、その最新版が入るようにします。
  • ports:
    httpの80番およびhttpsの443番はhttps-portalのコンテナに含まれるnginxがプロキシとなって受けて、php-fpmと連携しているnginxに転送します。
  • DOMAINS:
    どのドメインでアクセスされたら、どのdockerコンテナに転送するかを記述します。左側がドメイン、右側がコンテナ名(この場合はweb)で、80番ポートはhttps-portalで使用しているので任意の別ポートを指定します。
  • STAGE:
    local/staging/productionの3種類を指定できます。
    意味はそれぞれ見ての通りで、staging/productionはオンラインのサーバですから実際にlet’s encryptが証明書を発行します。ドメインがDNSに登録されている必要があります。
    localのみオレオレ証明書になるため、ブラウザの警告が出ます。
  • volumes:
    コンテナ内の/var/lib/https-portalに設置される証明書をマウントしています。ホスト側にマウントしないと証明書ファイルが永続化できず、コンテナ起動の度に証明書を発行することになってしまいます。
    ローカルのオレオレ証明書なら問題ありませんが、ステージングや本番で実際に証明書を発行する場合、毎回証明書を発行していると回数制限に引っかかってしまいますので、きちんと永続化しましょう。
  • ports(web):
    https-portalで転送設定したポートで待ち受けるようにします。この場合は8000番ですね。何番でも構いませんが、他のサービスと被らないようにしてください。

default.conf

こちらもhttps-portalに対応して、下記の一箇所だけ書き換えています。
docker-compose.ymlで指定したポート番号をlistenするようにします。

server {
    listen 8000;
...
...

ビルドして実行

ここまで設定したら、あとはdocker-compose build && docker-compose up -dを実行するのみです。

接続確認

ローカル環境の場合はdocker-compose.ymlhttps-portal.DOMAINS、およびdefault.confserver_nameに記述したドメインを/etc/hostsに忘れず追記しましょう。

さいごに

let’s encryptそのものだけでも便利な代物ですが、dockerコンテナとして動いてくれると一層便利ですね。コンテナ内で定期的に証明書の再取得までしてくれるので、cron設定すら不要になります。

おすすめ書籍

nomura

シェア
執筆者:
nomura
タグ: Docker

最近の投稿

フロントエンドで動画デコレーション&レンダリング

はじめに 今回は、以下のように…

3週間 前

Goのクエリビルダー goqu を使ってみる

はじめに 最近携わっているとあ…

1か月 前

【Xcode15】プライバシーマニフェスト対応に備えて

はじめに こんにちは、suzu…

2か月 前

FSMを使った状態管理をGoで実装する

はじめに 一般的なアプリケーシ…

3か月 前