Amazon LightsailのWordpressをhttps化した際にロードバランサーのヘルスチェックが失敗していた



Amazon Lightsail でWordpressサイトを構築した際に、https化後にLightsailでのロードバランサーヘルスチェックが失敗していたので、その時の対応をメモ。

Lightsail / Wordpress 共に初めてのお触りです。

# 前提条件・環境

### 前提条件

* サイト・Wordpressのhttps化が終わっている
* WordpressのSSL化については「Really Simple SSL」プラグインを使用
* SSHでサーバーに接続出来て、ファイルの編集が出来る

### 環境

* 環境：Amazon Lightsail
* インスタンス：Lightsail の Wordpressインスタンスを使用(Webサーバーはapache2の模様)
* DNSゾーン：LightsailのDNSゾーンを使用(Route53も使用)
* ロードバランサー：Lightsailのロードバランサーを使用
* 証明書：AWS Certificate Managerで取得
* WordpressのSSL化：「Really Simple SSL」プラグインを使用

#### Really Simple SSL の設定

.htaccessは使用していない設定です。
本設定後にプラグインの検出設定で「❌Really Simple SSL has received no response from the webpage. 」が出たり出なかったりします。
「See our knowledge base...」でサイトの内容をみると、「フロントページのロードが上手く行っていれば、誤検知の可能性もある」というような記載があったので、サイトは見れるので良いかなと・・・(ダメなのかしら）
(数日後にみたらでなくなっていたので大丈夫そう？かな)
https://really-simple-ssl.com/knowledge-base/how-to-fix-no-response-from-webpage-warning/

<img width="404" alt="20190306_SSL設定０２.png" src="https://qiita-image-store.s3.amazonaws.com/0/101125/549850d4-3264-21ca-af82-0f346f3aaaa1.png">

# 状況

ロードバランサーのヘルスチェックが失敗する

|<img width="235" alt="20190306_ヘルスチェック０２.png" src="https://qiita-image-store.s3.amazonaws.com/0/101125/37b94737-0a08-9cf1-f6aa-288e4a0a7c3c.png">
|:-:|

# 対応

流れとしては、

1. ヘルスチェック用の空htmlを作る(TOPページの読み込みに時間がかかる等の回避のため)
1. httpd-prefix.conf の設定を追記
1. apache2の再起動
1. Lightsail のヘルスチェック先をカスタマイズする

になります。

#### ヘルスチェック用の空htmlを作成する

SSHでサーバーに接続し下記コマンドで空htmlを作成

```bash:空html作成
$ touch /opt/bitnami/apps/wordpress/htdocs/health.html
```

### httpd-prefix.conf を変更する

以下の設定を「App url moved to root」設定と「Default」設定の間に追加しました。

ファイルは`/opt/bitnami/apps/wordpress/conf/`配下にあります。

```conf:httpd-prefix.conf
RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} !https [NC]
RewriteCond %{REQUEST_URI} !^/health.html
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
```

「`RewriteCond %{REQUEST_URI} !^/health.html`」が無い時だとヘルスチェック失敗が解消されなかったので追加しました。
Lightsailのロードバランサーは80番(http)でチェックしているが、SSL化で443に飛ばされて失敗する（？）のかなと思い、リクエストがhealth.htmlの時はhttps飛ばさないようにしたつもりです。

全体は、こんな感じになりました

```conf:httpd-prefix.conf
# App url moved to root
DocumentRoot "/opt/bitnami/apps/wordpress/htdocs"
#Alias /wordpress/ "/opt/bitnami/apps/wordpress/htdocs/"
#Alias /wordpress "/opt/bitnami/apps/wordpress/htdocs"

# User Add
RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} !https [NC]
RewriteCond %{REQUEST_URI} !^/health.html
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

# Default
RewriteEngine On
RewriteCond "%{HTTP_HOST}" ^ec2-([0-9]{1,3})-([0-9]{1,3})-([0-9]{1,3})-([0-9]{1,3})\..*\.amazonaws.com(:[0-9]*)?$
RewriteRule "^/?(.*)" "%{REQUEST_SCHEME}://%1.%2.%3.%4%5/$1" [L,R=302,NE]
Include "/opt/bitnami/apps/wordpress/conf/httpd-app.conf”
```

### apacheを再起動

```text:再起動
$ sudo /opt/bitnami/ctlscript.sh restart apache
```

### Lighsailのヘルスチェック先をカスタマイズ

Lightsailのロードバランサーの設定画面に入り、カスタマイズ先に「health.html」を記載します。

|<img width="665" alt="20190306_ヘルスチェック０１.png" src="https://qiita-image-store.s3.amazonaws.com/0/101125/27136f66-b4d9-681e-2656-af626b2a3dfc.png">
|:-:|

「保存」します。

チェックが成功するまでにしばらくかかりましたが、無事成功しました。

# 最後に

やっぱりプラグインの検出設定での❌になったり✅で大丈夫だったりが気になります。
数日後確認したら✅で安定（？）しているっぽかったのでまずは良しと。

ヘルスチェック失敗の画像を撮ろうとおもって、チェック先をデフォルト(/)に戻してみたら、なかなか失敗になりませんでした。(結局、無い宛先を指定した)
うーん、httpd-prefix.confのhealth.htmlへの除外設定、本当に要るの？と思ってしまったり。

# 参考にさせていただいたサイト
https://yukiosugiyama.com/wordpress/post-2906/
https://yukiosugiyama.com/wordpress/post-1745/
https://qiita.com/clown0082/items/d9ede1d775cb35aa30fa
https://qiita.com/m1ul24/items/efbf5bfc75d65cffa166
https://qiita.com/foursue/items/58e74c4a8c946dd49e12