Let's Encrypt と Nginx と WordPress
blog
2020-4-24 19:08 JST

OpenVPN + Let's Encrypt を順調に入れることが出来たので、調子に乗って NGINX + Let's Encrypt + WordPress にチャレンジしてみる。

Nginx + Let's Encrypt

NGINX はもともと導入されていて Docker 上の WordPress へと転送されている。びっくりするほど重要なサイトじゃなかったが、やはりユーザがいるのでとめたくない。Let's Encrypt の certbot は --standalone で起動すると80 のポートを使用しようとする。

動作中の NGINX と共存させるためには NGINX の機能を間借りすることになる。といっても NGINX には plug-in などは必要ない。certbot の --webroot と --webroot-path オプションを使えば、NGINX の機能を間借りすることが可能だ。

その前に NGINX で特別な location を設定しておく。それ以外は Docker のWordPress に転送される。

    location ^~ /.well-known/acme-challenge/ {
      default_type "text/plain";
      root        /var/www/html/;
    }

さらに certbot 用のシェルプロを書いておく。シェルプロは最終的にsudo で実行される。セキュリティ上危ないのでシェルプロの中身にsudo は書いていない。最初は --dry-run にした方がよいでしょう。

certbot certonly 
    --webroot-path /var/www/html 
    -m メールアドレス 
    -d ドメイン名称 --webroot

生成された fullchain.pem と privkey.pem を NGINX の設定ファイルから参照するようにする。意外と簡単。NGINX の reload を忘れずに。

server {
    server_name ドメイン名称;

    listen 443;
    ssl on;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_certificate     /etc/letsencrypt/live/ドメイン名称/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/ドメイン名称/privkey.pem;

    client_max_body_size 20M;

    access_log    /var/log/nginx/ssl_access.log;
    error_log     /var/log/nginx/ssl_error.log info;

    location / {
        proxy_pass http://127.0.0.1:XXXX;
        proxy_redirect http:// https://;
    }
}
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;

WordPress 側の設定(未完)

さて、WordPress 側を設定しましょう。とWordPress の設定を変えた瞬間に WordPress 見えなくなりました。変えたのは WordPress アドレスとサイトアドレス。復旧には 30 分かかりました。

wp-config.php をアドホックに修正

ええ、これ前やったよね。通常は MySQL を見るみたいですがwp-config.php に書いておくと強制的に修正できます。とりあえず復旧するためにアドホックに修正を加えます。運よく Docker の Volume をホストのディレクトリにしてあったので簡単に修正できました。

wp-config.php
define('WP_SITEURL''http://ドメイン名称/');
define('WP_HOME''http://ドメイン名称/');

MySQL のデータベースの中身を変更

不幸なことに MySQL のデータのボリュームは分離していたもののDocker のイメージ内でした。しかたがないので docker exec -it で Docker に入り込みmysql コマンドで wordpress データベースの wp_options のsiteurl と home を元に戻しました。select と update を屈指します。これ where とか間違えて全書き換えしちゃうと元に戻りませんから。作業の前にバックアップしておきましょう。

アドホックな修正は元に戻しておきます。

redirect loop とか

作業していると redirect loop 発生しちゃいました。解決してません。

443

そもそも Docker 構築時に 443 をあけてませんでした。もうだめぽ。Docker ってたぶんセキュリティ上の問題なんだろうけど、あとからポート空けられないんだよね(たぶん)。そのうち、データベース事コピーして Docker のイメージを再度構築しなおします。

リンク集