概要

このinamuu.comをやっとHTTPS化しました。
wikiの方はさっくり出来たのですが、WordPressの方で少しハマってしまったので、メモとして残しておきます。

構成(下記roleは全てdockerコンテナで稼働)

nginx → WordPress(apache2+mod_php)

証明書作成(Let’sEncrypt)

Let’sEncryptのサイト通りにやります。

# git clone https://github.com/certbot/certbot
# cd cert-bot
# ./certbot-auto -n
# ./certbot-auto certonly --webroot \
-w DOCUMENTROOT1 \
-d inamuu.com \
-d www.inamuu.com \
-w DOCUMENTROOT2 \
-d wiki.inamuu.com \
-m メールアドレス \
--agree-tos -n
# ls -l /etc/letsencrypt/live/inamuu.com
合計 4
-rw-r--r-- 1 root 543  5月 25 23:08 README
lrwxrwxrwx 1 root  34  5月 25 23:08 cert.pem -> ../../archive/inamuu.com/cert1.pem
lrwxrwxrwx 1 root  35  5月 25 23:08 chain.pem -> ../../archive/inamuu.com/chain1.pem
lrwxrwxrwx 1 root  39  5月 25 23:08 fullchain.pem -> ../../archive/inamuu.com/fullchain1.pem
lrwxrwxrwx 1 root  37  5月 25 23:08 privkey.pem -> ../../archive/inamuu.com/privkey1.pem

nginxのProxy設定

ssl証明書をDockerコンテナが読み込める場所へ設置して、下記設定にしました。

server {
 listen 80;
 server_name inamuu.com www.inamuu.com;
 location / {
   rewrite ^(.*)$ https://inamuu.com$1 redirect;
 }
}

server {
    listen 80;
    server_name wiki.inamuu.com;
    return 301 https://$host$request_uri;
}

server {
  listen 443 default ssl;
  server_name inamuu.com;

  location / {
             proxy_redirect   off;
             proxy_set_header Host $host;
             proxy_set_header X-Real-IP $remote_addr;
             proxy_set_header X-Forwarded-Proto https;
             proxy_set_header X-Forwarded-Host $host;
             proxy_set_header X-Forwarded-Server $host;
             proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

             proxy_pass http://wordpress/;
             proxy_redirect http:// https://;
  }
  ssl_certificate /etc/nginx/ssl/fullchain1.pem;
  ssl_certificate_key /etc/nginx/ssl/privkey1.pem;
}

server {
  listen 443 ssl;
  server_name wiki.inamuu.com;
  proxy_set_header Host $http_host;
  location / {
    proxy_pass http://pukiwiki;
  }
  ssl_certificate /etc/nginx/ssl/fullchain1.pem;
  ssl_certificate_key /etc/nginx/ssl/privkey1.pem;
}

上記設定だと、httpsへリダイレクトされる、httpsページがLet’sEncryptのSAN証明書でアクセスできるようにはなります。
しかし、WordPress側でたくさんのMIXContentsが発生する上に、CSSが読み込まれないなどの問題があります。
これらの対応として、下記が必要です。

WordPress側の設定

プロキシまではSSLでも、Backendへproxyする際はhttpとなるため、WordPress側ではSSLと判定されないために、上記問題が起こるようです。
そこで、下記をwp-config.phpへ記述が必要です。

※wp-config.phpの下へ追記ではなく、最初に追記してください。そうしないと、https判定されません。

if (isset($_SERVER['HTTP_X_FORWARDED_PROTO'])
    && $_SERVER['HTTP_X_FORWARDED_PROTO'] === "https") {
  $_SERVER['HTTPS'] = 'on';
}

define('FORCE_SSL_LOGIN', true);
define('FORCE_SSL_ADMIN', true);

この後は、管理画面の設定より、サイトURLをhttpsへ変更してあげることで、httpsで接続できるようになります。

※私の場合は、プラグインがhttps対応していなかったりで、エラーだったりmix contentsとして表示されてしまったので、プラグインを停止するなども実施しました。

おしまい。

カテゴリー: HomeServerTech