二流エンジニアの逆襲

二流エンジニアが一流エンジニアになるまでの記録である

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 とwordpresshttps リクエストをリダイレクトしあってしまいます。。原因は、wordpresshttps での要求を待ち構えているのに、nginx-proxy が https要求をhttp要求としてwordpress に中継してしまうこと。その結果、wordpresshttps でないパケットを要求元にリダイレクトし、nginx-proxy は再び wordpresswordpressから受信した要求をリダイレクトしてしまいます。。。


if (isset($_SERVER['HTTP_X_FORWARDED_PROTO'])

&& $_SERVER['HTTP_X_FORWARDED_PROTO'] === "https") {

$_SERVER['HTTPS'] = 'on';

}

この記載を追記しています。無限リダイレクトする原因は、nginx-proxy からきたhttp要求をwordpress がリダイレクトしてしまうことなので、wordpress 側で、https をポートフォワードした要求を https 要求とみなすように設定しています。

さて、次はメールサーバーの構築か。。。