為什麼需要負載均衡?
| 單機模式 | 集群模式 |
| 單點故障:掛了全站不可用 | 高可用:節點故障自動剔除 |
| 垂直擴展昂貴(CPU/記憶體上限) | 水平擴展:加機器即可線性增長 |
| 部署需停機 | 滾動部署:零停機發布 |
核心挑戰:狀態同步
PHP 本身無狀態,但應用依賴的「有狀資源」需共享:
- PHP 程式碼檔案
- 使用者上傳檔案
- Session 資料
- 設定檔
- 日誌
解決方案對照表
1. 程式碼部署同步
| 方案 | 原理 | 優點 | 缺點 | 適用場景 |
| Rsync | 增量同步檔案 | 簡單、無額外依賴 | 易人為錯誤、版本不一致 | 小型集群 |
| Git / SVN | 版本控制拉取 | 版本追蹤、回滾容易、原子性 | 需每節點安裝 Git、佈署腳本 | 中大型、CI/CD 整合 |
| 共享儲存 (NFS/EFS) | 單一掛載點 | 天然一致、無同步延遲 | 單點故障、效能瓶頸、鎖競爭 | 程式碼讀多寫少 |
| 容器映像 (Docker/K8s) | 不可變基礎設施 | 完美一致、秒級部署、回滾 | 學習曲線、架構複雜 | 現代雲原生 |
2. 上傳檔案共享
| 方案 | 實作 | 優點 | 缺點 |
| 資料庫 BLOB | 檔案存入 DB | ACID、備份簡單 | DB 膨脹、效能差、備份巨大 |
| 共享檔案系統 | NFS/GlusterFS/Ceph | POSIX 相容、應用無感 | 單點、延遲、擴展難 |
| 物件儲存 (S3/MinIO) | API 上傳、CDN 分發 | 無限擴展、高可用、成本低 | 應用需改造、最終一致性 |
| 本地 + 同步 | lsyncd/rsync 實時同步 | 讀取快、無單點 | 衝突處理複雜、延遲 |
推薦架構:物件儲存 (主) + CDN (分發) + 本地快取 (加速)
3. Session 共享
| 方案 | 實作 | 優點 | 缺點 |
| 資料庫 | session_save_handler = DB | 持久化、可查詢 | 寫入延遲、連線數壓力 |
| Redis (推薦) | session.save_handler = redis | 高效能、集群模式、TTL 自動清理 | 需維護 Redis 集群 |
| Sticky Session | LB 綁定 IP/Cookie 到節點 | 無需共享、實作簡單 | 節點掉線 Session 丟失、負載不均 |
| JWT Stateless | 客戶端攜帶 Token | 完全無狀態、水平擴展最佳 | Token 體積大、無法主動失效、安全風險 |
// php.ini / .user.ini
session.save_handler = redis
session.save_path = "tcp://redis-cluster:6379?auth=password&database=2"
session.gc_maxlifetime = 7200
4. 設定檔管理
- 環境變數 (`.env`) + 容器注入:十二要素應用標準
- 配置中心:Consul、Etcd、Apollo、Nacos
- 版本控管:敏感資訊加密 (git-crypt/SOPS)
5. 日誌聚合
| 方案 | 架構 | 優點 |
| 本地檔案 | 各節點各寫各的 | 簡單 |
| Syslog/Rsyslog | UDP/TCP 轉發到中央 | 標準、輕量 |
| ELK/EFK Stack | Filebeat → Logstash/Fluentd → Elasticsearch → Kibana | 全文搜尋、視覺化、告警 |
| Loki + Grafana | Promtail → Loki → Grafana | 標籤索引、成本低、K8s 原生 |
負載均衡器選型
| 層級 | 產品 | 特色 |
| L4 (TCP) | LVS、HAProxy、Nginx Stream、Cloud LB | 高效能、透傳、不解析 HTTP |
| L7 (HTTP) | Nginx、HAProxy、Traefik、Envoy、Cloud ALB | 路由規則、SSL 卸載、WAF、限流 |
完整架構圖
用戶 → DNS → CDN/WAF → L7 LB (Nginx/HAProxy)
↓
┌───────────────┼───────────────┐
↓ ↓ ↓
PHP-FPM Node 1 PHP-FPM Node 2 PHP-FPM Node N
↓ ↓ ↓
┌─────┴─────┐ ┌─────┴─────┐ ┌─────┴─────┐
│ Redis │ │ Redis │ │ Redis │ (Session/Cache Cluster)
│ Cluster │ │ Cluster │ │ Cluster │
└───────────┘ └───────────┘ └───────────┘
↓ ↓ ↓
┌─────────────────────────────────────┐
│ MySQL Primary/Replica │
│ (Read/Write Splitting) │
└─────────────────────────────────────┘
↓
┌─────────────────────────────────────┐
│ MinIO/S3 + CDN (靜態資源) │
└─────────────────────────────────────┘
遷移檢查清單
- [ ] 程式碼無硬編碼路徑(使用環境變數)
- [ ] Session 改用 Redis
- [ ] 上傳檔案改用 S3 API
- [ ] 設定檔外部化(.env / Config Center)
- [ ] 日誌輸出 stdout/stderr(容器標準)
- [ ] 健康檢查端點(
/health 回傳 200)
- [ ] 優雅關閉處理 SIGTERM(完成當前請求再退出)
- [ ] 測試單節點故障自動恢復
- [ ] 壓力測試驗證水平擴展效果