Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
12
Help us understand the problem. What are the problem?

More than 3 years have passed since last update.

posted at

updated at

Organization

(Dockerで) 独自ドメイン + HTTPS 対応 な WordPress を一瞬で作る

自動で SSL 証明書を発行・管理しながら HTTPS リクエストをプロキシする Docker イメージ「CertFront」を作った。

GitHub: https://github.com/hoto17296/docker-certfront
DockerHub: https://hub.docker.com/r/hoto17296/certfront/

CertFront について

これを使うと何が出来るかと言うと、Web アプリを簡単に HTTPS 対応して公開できる。

certfront.png

中でやっていることは単純で、

  • Certbot (Let's Encrypt) で証明書を管理する
    • 起動時に証明書が無ければ新たに発行する
    • 起動時に証明書の有効期限が切れていたら更新する
    • 定期的に証明書の有効期限をチェックする
  • Nginx で HTTPS リクエストをリバースプロキシする
    • HTTPS リクエストを受け取ったら HTTP に変換して Web アプリに流す
    • HTTP リクエストを受け取ったら HTTPS の URL にリダイレクトする

これだけ。

使い所としては「ロードバランサを使うほどでもない趣味 Web アプリだけど HTTPS 対応したい」場合。

例えば AWS の場合、EC2 で動いている Web アプリを HTTPS 対応する場合の選択肢は以下の三択になる。

  • ACM + ELB を使う
    • 設定は簡単
    • EC2 (t2.micro) よりも ELB の方が料金が高い
    • EC2 一台しか動いてないのに LB 使うの気が引ける (?)
  • ACM + CloudFront を使う
    • (趣味アプリではこれが最適解っぽい)
    • 安い
    • 設定でハマる部分が多く、慣れるまでが大変
  • EC2 内で自前で証明書を管理する
    • Let's Encrypt 使えば無料
    • 設定が面倒くさい

どれもデメリットがあるので、ここで CertFront を使うという選択肢を増やしたい。

WordPress を動かす例

試しに WordPress を HTTPS 対応してみる。

あらかじめ用意しておくもの

  • サーバ
    • Docker と Docker Compose が動くこと
    • インターネット上からポート 80, 443 にアクセスできること
  • ドメイン
    • A レコードが上記サーバの Global IP を向いていること

docker-compose.yml の準備

docker-compose.yml
version: '3'

services:

  certfront:
    image: hoto17296/certfront
    ports:
      - 80:80
      - 443:443
    environment:
      DOMAIN: blog.example.com  # modify this to your domain
      EMAIL: mail@example.com  # modify this to your email
      APP_HOST: wordpress
    volumes:
      - certs:/etc/letsencrypt
    depends_on:
      - wordpress

  wordpress:
    image: wordpress:4
    environment:
      WORDPRESS_DB_HOST: mysql
    volumes:
      - app:/var/www/html
    depends_on:
      - mysql

  mysql:
    image: mysql:5
    environment:
      MYSQL_ALLOW_EMPTY_PASSWORD: 'yes'
    volumes:
      - data:/var/lib/mysql

volumes:

  # The certificate and private key are stored on this volume
  certs:
    driver: local

  app:
    driver: local

  data:
    driver: local

certfront と wordpress と mysql の3つのサービスが起動するように設定した。

また、永続化したいデータは volume に保存するようにした。

起動する

あとは起動するだけ。

$ docker-compose up

バックグラウンドで起動させる場合は -d オプションを付ける。

初回起動時には、CertFront コンテナ内の Certbot が証明書を発行する処理を行う。

少し待ってから、自分の設定したドメインにブラウザからアクセスしてみると、WordPress の初期設定画面が表示されると思う。

まとめ

「ロードバランサを使うほどでもない趣味 Web アプリだけど HTTPS 対応したい」ときがあったらぜひ CertFront 使ってください。

もしアクセスが増えてきたら冗長構成にしてロードバランサに切り替えればいいので。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
12
Help us understand the problem. What are the problem?