10年以上前に作った個人サービスをHTTPS化しました
※ この記事は前提として Nginx や Docker Compose, Docker Machine の知識が必要です。
ウェブサイトやウェブサービスを HTTPS で提供するのが当たり前になって久しいですが、昔作ったサイトがいまだ HTTP のまま残っているケースも多いのではないでしょうか。私の場合10年以上前に作った梅酒のコミュニティサイト「梅酒.in」がずっと HTTP のまま放置されていました。しかしこのまま放置するのも良くないので、色々と調べてようやくレガシーなシステムにはなるべく手をつけない HTTPS 化を実施できました。
梅酒.in のシステムはすでにサポート終了済みの CentOS 5 や PHP 5 が使われている VPS で、いくつか他のサイトも乗ってしまっているありがちなごちゃごちゃシステムです。こんなサイトを手軽に HTTPS にするには、
このように従来のサーバーの前に HTTPS を受けるだけのサーバーを置いて、すべてのリクエストを従来のサーバーにそのまま流す構成にするのが手っ取り早いと思われます。
HTTPS を受けるために新しくサーバーを用意しなければいけませんが、古いサーバーに手を入れるといずれまた手をつけられなくなるのは目に見えていますし、機能の多いアプリケーションすべてを新しいサーバーに移す作業的&時間的なコストも大きく、それよりは多少料金的なコストがかかるとしても上記の構成がまずは良いと判断しました。
しかし HTTPS を受けるだけのサーバーを手間をかけて構築するのもまた大変です。そこで「Docker Machine SAKURA CLOUD Driver」を使ってさくらのクラウドに Docker ホストとなる最小インスタンスを立ち上げ、そこでHTTPS-PORTALを使ってコンテナを起動させることにしました。
ホストサーバーは Docker だけ動けばいいので今回は RancherOS を選択。docker-machine コマンドで例えば以下のように仮想マシンを1つ作成します。
docker-machine create -d sakuracloud \
--sakuracloud-zone=is1a \
--sakuracloud-access-token=アクセストークン \
--sakuracloud-access-token-secret=アクセストークンシークレット \
--sakuracloud-os-type=rancheros \
--sakuracloud-core=1 \
--sakuracloud-memory=1 \
--sakuracloud-disk-size=20 \
umeshu.in
HTTPS-PORTAL は Let’s Encrypt を使用した Nginx サーバーを自動で構築してくれる便利ツールです。今回の場合 docker-compose.yml は例えば以下のようになります。
---
version: '3'
services:
https-portal:
image: steveltn/https-portal
ports:
- "80:80"
- "443:443"
restart: always
environment:
DOMAINS: "umeshu.in -> http://従来のサーバーのIPアドレス:80"
STAGE: production
volumes:
- https-portal-ssl-certs:/var/lib/https-portal
networks:
- umeshu
volumes:
https-portal-ssl-certs:
networks:
umeshu:
このように DOMAINS: "umeshu.in -> http://従来のサーバーのIPアドレス:80"
のように記述するだけで umeshu.in の SSL 証明書を自動取得し、リクエストを従来のサーバーに流してくれるだけでなく、http:// へのリクエストを自動的に https:// へリダイレクトもしてくれます。
なお、Let’s Encrypt の証明書取得には DNS が使用されるので、あらかじめドメインの DNS 設定を新しいサーバーの IP アドレスに変更しておく必要があります。そのため一時的にサイトにアクセスできなくなる可能性があります。
あとは、
eval $(docker-machine env umeshu.in)
docker-compose up -d
と実行するだけ。
まだサイト内の API で取得した画像が HTTP だったりするので Mixed content の問題が残っていますが、これでひとまずは https://umeshu.in で動作するようになりました。
今後は梅酒.inのアプリケーション側についても分離しやすいバッチ処理等から Docker コンテナ化して徐々に脱レガシーをしていく予定です。一部機能のコンテナ化は他の個人サービスでもすでに実施しているので、ある程度アプリケーションの分離手順を定型化できたらドットインストールのシステムにも適用していきます。
コメントを残す