AWS EC2で動かしている docker コンテナのwordpress を HTTPS化した話
本サイトは docker コンテナ内の wordpress + nginx + mysql で動作していましたが、この度、 nginx-proxy と letsencrypt-nginx-proxy-companion で HTTPS リクエストに対応しました。
HTTPS化の手順
yml ファイルに proxy コンテナを追加
まずは、yml ファイルに
nginx-proxy と letsencrypt-nginx-proxy-companion コンテナを追加し、 wordpress の environment にVIRTUAL_HOSTとVIRTUAL_PORTの設定を追加しましょう。
- ./docker-compose.d/certs:/etc/nginx/certs:ro
証明書や鍵を永続化するための設定です。永続化していないと、 docker-compose する度に鍵を生成します。letencrypt での鍵の生成は 1週間5回と制限があるため、 docker-compoes しまくると、鍵が作れなくなってしまいます。。。
- /var/run/docker.sock:/tmp/docker.sock:ro
nginx-proxy が docker コンテナのイベントを監視するための設定です。セキュリティ上の理由で読み取り専用にしなければなりません。
VIRTUAL_HOST: www.example.com
VIRTUAL_PORT: 80
proxy の宛先の設定です。今回の宛先は wordpress をホストする nginx です。www.example.com ポート80 宛の要求を wordpress 側の nginx に中継するように設定しています。
LETSENCRYPT_HOST: www.example.com
LETSENCRYPT_EMAIL: xxx@example.com
letsencrypt で認証するホストの設定です。上記の VIRTUAL_HOST と同じホスト名にします。
wordpress をリバースプロキシで動作させるための設定
この設定をしないと、wordpress の 管理画面を開くと、無限に proxy とwordpress でhttps リクエストをリダイレクトしあってしまいます。。原因は、wordpress が https での要求を待ち構えているのに、nginx-proxy が https要求をhttp要求としてwordpress に中継してしまうこと。その結果、wordpress が https でないパケットを要求元にリダイレクトし、nginx-proxy は再び wordpress にwordpressから受信した要求をリダイレクトしてしまいます。。。
if (isset($_SERVER['HTTP_X_FORWARDED_PROTO'])
&& $_SERVER['HTTP_X_FORWARDED_PROTO'] === "https") {
$_SERVER['HTTPS'] = 'on';
}
この記載を追記しています。無限リダイレクトする原因は、nginx-proxy からきたhttp要求をwordpress がリダイレクトしてしまうことなので、wordpress 側で、https をポートフォワードした要求を https 要求とみなすように設定しています。
さて、次はメールサーバーの構築か。。。