雲端現代化:如何將 WordPress 部署至 Cloud Run、Cloud SQL 與 Cloud Storage
在管理多個 WordPress 專案時,傳統 VM 加架構往往面臨擴展性與維護成本的挑戰。透過 Google Cloud Run (Serverless)、Cloud SQL (代管資料庫) 與 Cloud Storage (雲端儲存) 的組合,我們可以建立一個自動縮放、安全且高效率的網站環境。
一、 架構預覽
- 計算節點:Google Cloud Run (Docker 容器化運行)。
- 資料庫:Google Cloud SQL (MySQL 8.0)。
- 靜態檔案:Google Cloud Storage (GCS)。
- 流量分配:Google Cloud Load Balancing (HTTPS 負載平衡器)。
二、 準備 Docker 鏡像與環境排除
在打包之前,請務必設定 .dockerignore 以優化鏡像體積並保護敏感資訊 。
my-wp-site/
├── Dockerfile # 自動化打包腳本
├── wp-config.php # 修改為讀取環境變數的版本
├── .dockerignore # 排除不需要打包的檔案 (如 .git, local backups)
└── wp-content/
├── plugins/ # 放置您自定義的外掛
└── themes/ # 放置您自定義的主題建立 標準化 Dockerfile 範本
# 使用官方 PHP-Apache 映像檔,穩定且相容性高
FROM wordpress:php8.2-apache
# 1. 設定環境變數 (Cloud Run 預設監聽 8080,但官方 WP 鏡像預設是 80)
# 這裡我們讓 Apache 監聽 Cloud Run 指定的 PORT
RUN sed -i 's/Listen 80/Listen ${PORT}/g' /etc/apache2/ports.conf
RUN sed -i 's/:80/:${PORT}/g' /etc/apache2/sites-available/000-default.conf
# 2. 安裝必要的系統套件 (如有需要自訂 PHP 擴展可在這加)
RUN apt-get update && apt-get install -y \
libpng-dev \
libjpeg-dev \
&& docker-php-ext-configure gd --with-jpeg \
&& docker-php-ext-install gd
# 3. 複製現有的自定義檔案進入容器
# 建議只複製 plugins 和 themes,核心檔案由官方鏡像提供
COPY ./wp-content/plugins/ /var/www/html/wp-content/plugins/
COPY ./wp-content/themes/ /var/www/html/wp-content/themes/
COPY ./wp-config.php /var/www/html/wp-config.php
# 4. 設定正確的檔案權限 (對 WordPress 運行至關重要)
RUN chown -R www-data:www-data /var/www/html
# 5. 設定預設環境變數 (可在部署時被 gcloud 指令覆蓋)
ENV PORT=8080
ENV DB_HOST=127.0.0.1
ENV DB_USER=root
ENV DB_PASSWORD=password
# 暴露埠號
EXPOSE 80801. 建立 .dockerignore
Plaintext
.git .gitignore .dockerignore Dockerfile *.sql *.zip .vscode/ wp-config-sample.php
2. 打包與推送鏡像
PowerShell
# 編譯鏡像 docker build -t asia-east1-docker.pkg.dev/[PROJECT_ID]/wp-repo/[docker_name]:latest . # 推送到 Artifact Registry docker push asia-east1-docker.pkg.dev/[PROJECT_ID]/wp-repo/[docker_name]:latest
三、 資料庫遷移與設定
1. 匯入 SQL 腳本
將 .sql 檔案上傳至 Google Cloud Storage (GCS) 後執行匯入 。
注意:請確保 SQL 檔案中不含
CREATE DATABASE或USE語句,以免匯入失敗或指向錯誤的資料庫。
PowerShell
gcloud sql import sql [INSTANCE_NAME] gs://[BUCKET_NAME]/[docker_name].sql --database=[docker_name]_db
2. 設定 wp-config.php 智慧判斷
為了同時支援本地開發與雲端環境,建議在 wp-config.php 加入連線判斷邏輯 :
PHP
// 偵測是否在 Cloud Run 環境 (透過 Unix Socket 連線)
if (getenv('INSTANCE_CONNECTION_NAME')) {
define( 'DB_HOST', ':/cloudsql/' . getenv('INSTANCE_CONNECTION_NAME') );
} else {
define( 'DB_HOST', getenv('DB_HOST') ?: '127.0.0.1' );
}
// 負載平衡器 HTTPS 辨識
if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https') {
$_SERVER['HTTPS'] = 'on';
}
四、 部署至 Cloud Run
部署時需指定 Cloud SQL 連線名稱,這會自動建立加密隧道 。
PowerShell
gcloud run deploy [docker_name] ` --image asia-east1-docker.pkg.dev/[PROJECT_ID]/wp-repo/[docker_name]:latest ` --region asia-east1 ` --allow-unauthenticated ` --add-cloudsql-instances [PROJECT_ID]:asia-east1:[INSTANCE_NAME] ` --set-env-vars="INSTANCE_CONNECTION_NAME=[PROJECT_ID]:asia-east1:[INSTANCE_NAME],DB_NAME=[docker_name]_db,DB_USER=root,DB_PASSWORD=[PASSWORD]"
五、 設定負載平衡器 (GCLB) 與自訂網域
為了使用自有的網域(如 blog.rain.tips),建議使用 HTTPS 負載平衡器 。
- 建立 Serverless NEG:讓負載平衡器找到 Cloud Run 。
- 設定前端 IP:保留一個靜態全域 IP。
- Google 管理憑證:在前端設定中新增網域,Google 會自動處理 SSL 簽發與續期 。
- DNS 設定:將您的網域 A 紀錄 指向負載平衡器的靜態 IP 。
六、 故障排除 (Troubleshooting)
- Error establishing a database connection:
- 檢查 Cloud Run 服務帳戶是否擁有 「Cloud SQL Client」 角色 。
- 確認
DB_HOST在雲端環境是否正確指向:/cloudsql/...。
- 503 Service Unavailable:
- 確認 Cloud Run 服務已設定為 「允許未經驗證的叫用」 。
- 檢查負載平衡器的憑證是否已變為綠色的 Active 狀態 。
- IPv6 連線問題:
- 若使用 Nginx 反向代理遇到
Network is unreachable,請強制 Nginx 優先使用 IPv4 或修改系統/etc/hosts。
- 若使用 Nginx 反向代理遇到
近期留言