用 Docker 容器管理 WordPress 網站:WP Proxy Companion 和 WP Proxy Sites


作者: | 2019/12/24 | 留言


背景說明

因為服務對象是中小企業,連同正式、測試網站大概有30個左右的網站散佈在幾個主機上,有實體主機也有 VPS,9成都是 WordPress 網站,不過其他1成也是 PHP Framework 刻的,如 CodeIgniter、Laravel、Slim … 等,之前也有很舊的手刻 PHP。

問題的痛點一開始是發生在主機更新環境。前些年 PHP7.x release 造成一波更新潮,像是 WordPress 和 WooCommerce 的更新都訂出最低 PHP 版本支援的限制。有了更新環境的壓力,所以就要開始來處理,但有些主機不明原因就是無法升級,只要一下指令就會噴錯,也很怕服務爆炸。尤其是一些大主機,裡頭裝了很多東西,工程師一代一代的接手,更新就會愈來愈有壓力。

另一個痛點是發生雞助網站的維護。有些老網站不一定能允許你直接升級,通常不是技術問題,而是成本問題,因為要修改裡頭的 code 多少都要花時間,而老闆沒有想要花這些時間,只想要它活著就好。這種雞助可能只支援到 PHP 5.4,或者使用一些舊版的 module,然後就被低調的放在大主機的一個小角落裡,每路過看到這些雞助,各種進退兩難就會浮上心頭。

Docker + WordPress 可以 Google 到很多教學,但跟想像不太一樣

大部份的 Docker + WordPress 教學都是談安裝一個 mySQL 容器再搭配一個 WordPress 官方的容器,然後官方的 WordPress 容器裡有 PHP + Apache。如果一個一個這樣建立部署似乎也是可行,但我期望可以加入更多 Feature,尤其是我想管理一堆 PHP 網站,未來也許會有 Node.js 或其他類型的專案進來。所以我就先開始列出期望清單:

  • WordPress w/ PHP 5~7:可以快速部署很多 WP 和其他 PHP 網站,並且可指定 PHP 5~7 的版本。
  • WP-Cli:可以下 WP Cli 指令,這個好方便耶。
  • MariaDB / mySQL:當然要能指定裝哪種DB & 哪個版本。
  • Redis:如果可以跑個 Redis 容器來支援網站也不錯。
  • Apache / Nginx:哪種都可以。
  • SSL (Let’s Encrypt):SSL 憑證已經是標配了,可以整合進來最好。

然後開始準備 Docker 設定檔,研究到最後,發現要使用「組合技」來處理我的需求,會是現階段最好的解法,因此我整理出兩個 Docker Compose 設定檔:「WP Proxy Companion」和「WP Proxy Sites」兩者搭配使用就可以滿足我現階段的需要。

WP Proxy Companion

圖畫得有點爛,運作上其實沒有很複雜,圖中間的 WP Proxy Companion (黃虛框) 這個設定檔會生出三個容器 (黑框),簡單說明如下:

  • Wp-Proxy 是一個 Nginx 的反向代理 (Reverse Proxy) Server容器,主要負責接客 (Request) 然後帶到正確的包廂 (網站),包廂即是 WP Proxy Siets (綠虛框) 這個設定檔生出來的各種網站相關的容器 (像是 WP、Redis、DB …等)。
  • Wp-Proxy-Letsencrypt 主要是負責處理 SSL 憑證下載。
  • WP-Proxy-Gen 是會自動查看 docker-compose.yml 裡各站的設定,再依 nginx 模版設定檔來自動生成反向代理的設定,讓 Wp-Proxy 可以正確的接到客。

目前我把安裝流程、使用說明、常見問題…等都整理在 github 的 readme 了,這邊如果需要什麼其他說明之後再補。

https://github.com/mrmu/wp-proxy-companion

WP Proxy Sites

這裡也有滿滿的說明哦!

https://github.com/mrmu/wp-proxy-sites

實際使用的情境

這個架構我大概跑了快半年,使用的情境是這樣…

WP Proxy Companion 這個設定檔自從第一次執行 docker-compose up -d 運行三個容器後,就幾乎沒有重開過,就是放著給它在背景跑,即使是本機 (Mac OS),重開機也都是自動跑在背景,自動監看 Wp Proxy Sites 的設定變更再自動反應,所以幾乎讓人忘記它的存在。

平時最容易更動到的是 WP Proxy Sites 的 yml 檔,通常是新增網站或修改網站,我就會打開 yml 檔,參考現有的網站設定,加上一段新站的設定,或修改設定,然後儲存 yml 檔,假設變更的容器設定名叫 my-site,我就下指令:

$ docker-compose up -d --no-deps --build my-site

這個指令只會作用在新站容器,不影響其他運作中的容器,指令幾秒跑完,新站就上線了,這時新站可能還沒有 SSL,就再補上兩行設定,再下一次一樣的指令,再等一下下,SSL 就會自動裝好。

大概感覺是這樣,未來要再進化也還有很多方向,比方 Log 檔的管理目前不是很滿意,也許可以引進 ELK 架構,雖然 ELK 也有 docker compose 設定,但目前還沒時間研究XD。


標籤:, ,

分類:

本文作者是Audi Lu

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。

*

*

*

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料