架設 WordPress 中健康偵測 (Health Check) 一直失敗的解決方法

docker-compose

在寫鐵人賽的時候想說寫個 CDK WordPress 建置,我把 CDK 寫完在測試的時候發現服務有時候正常有時候不正常查了一下發現 ECS 一直重啟 Docker 看一下 Log 發現原因是 Target group 的 Health Check 會失敗

使用 cURL 測試服務狀態

cURL 測試了一下發現回應竟然不是 200 OK 而是 302 Found

$ curl -v http://cdkwo-servi-ysnp5li748bg-66853377.us-west-2.elb.amazonaws.com/index.php
*   Trying 54.149.6.49...
* TCP_NODELAY set
* Connected to cdkwo-servi-ysnp5li748bg-66853377.us-west-2.elb.amazonaws.com (54.149.6.49) port 80 (#0)
> GET /index.php HTTP/1.1
> Host: cdkwo-servi-ysnp5li748bg-66853377.us-west-2.elb.amazonaws.com
> User-Agent: curl/7.64.1
> Accept: */*
>
< HTTP/1.1 302 Found
< Date: Tue, 13 Oct 2020 14:21:58 GMT
< Content-Type: text/html; charset=UTF-8
< Content-Length: 0
< Connection: keep-alive
< Server: Apache/2.4.38 (Debian)
< X-Powered-By: PHP/7.4.11
< Expires: Wed, 11 Jan 1984 05:00:00 GMT
< Cache-Control: no-cache, must-revalidate, max-age=0
< X-Redirect-By: WordPress
< Location: http://cdkwo-servi-ysnp5li748bg-66853377.us-west-2.elb.amazonaws.com/wp-admin/install.php
<
* Connection #0 to host cdkwo-servi-ysnp5li748bg-66853377.us-west-2.elb.amazonaws.com left intact
* Closing connection 0

判斷原因

第一次開啟需要跑安裝流程

看了一下網頁發現因為 WordPress 第一次開啟需要跑安裝流程所以會 302 到 /wp-admin/install.php 這樣子理所當然 Health Check 會失敗,但是我又不能把檢查代碼設定成 302,因為等第一次安裝結束後一定會是正常的 200 OK

查詢 Docker Hub 文件

所以就查了一下 wordpress – Docker Hub 的說明文件想要看看有沒有 Health Check 頁面可以使用,結果答案是沒有

查詢 Docker library issue

就再去查了一下 docker-library/wordpress 發現有一個 PR 441 要加入 mod_status.html,想說有希望了只是文件沒有寫到結果被拒絕 QQ …

尋找 WordPress 靜態頁面

想說竟然都到這邊了就找個靜態頁面來用吧!就去翻了 WordPress Project 找了一個比較適合檔案 /wp-includes/images/blank.gif 它只有 43 Bytes 看來會是一個不錯的解決方法

使用 WordPress 靜態頁面當解決方案

就直接把它喂給 Health Check 因為它是靜態頁面理當在沒有帶入 session 的情況下每次都會回應 200 OK,使用此解法才把問題解決

延伸閱讀