[HAProxy] 建立 WordPress 負載平衡 Load balancing 架構筆記

本篇文章更新時間:2021/01/12
如有資訊過時或語誤之處,歡迎使用 Contact 功能通知。
一介資男的 LINE 社群開站囉!歡迎入群聊聊~


主需求是 WordPress + WooCommerce 的購物網站原架構撐不住了,改成新的架構來處理大流量。HAProxy 架設在新開的一台主機,轉發請求的等級不用很高就能處理,效果不錯。

安裝 HAProxy 服務

主機使用 Ubuntu 20.04 Server 作業系統,搭配套件管理軟體 apt 指令安裝 HAProxy。

apt install haproxy

寫文時安裝的版本: HA-Proxy version 2.0.13-2ubuntu0.1 2020/09/08

驗證 HAProxy 組態是否正確的方法

套件安裝的 HAProxy 設定目錄在: /etc/haproxy

驗證測試指令:

$(which haproxy) -c -V -f /etc/haproxy/haproxy.cfg

改了設定要重新載入設定前先驗證一下設定組態是否正確!

重新載入設定的方法: service haproxy reload

Ref: Validate haproxy.cfg

如果想做到「不損失連線」的重載設定可以參考這討論 HAProxy graceful reload with zero packet loss 原理是透過 iptables 把 SYN 封包先封鎖著,趁這中間趕快重新載入新的設定,然後再重新打開防火牆,此時連線的客戶端會自動重新嘗試連線,終端用戶只會覺得「卡」一下,但不會「斷線或顯示錯誤」。 很有意思!

WordPress 設定的關鍵

原先架構的 WordPress 是走在 HTTPS 協定下,但改由 HAProxy 處理憑證後,backend 走 HTTP 方式把請求後送。

意思是會碰到對一個 HTTPS 設定的 WordPress 站請求 HTTP 連線,Core 會自動做跳轉回 HTTPS 造成無限迴圈。

需要在 wp-config.php 裡補上下方設定:

define( 'WP_HOME', 'http:// domain name' );
define( 'WP_SITEURL', 'http:// domain name' );
define( 'FORCE_SSL_ADMIN', false );
define( 'FORCE_SSL_LOGIN', false );
$_SERVER['HTTPS'] = 'on';
$_SERVER['SERVER_PORT'] = 443;

後台設定裡的網站網址不變,但透過寫在檔案裡的常數去改變,然後騙 WordPress 當前請求來自 HTTPS 輸出含有 HTTPS Schema 的連結,完成一連串的互動反應。

針對這個操作討論的沒找到很多,這篇不錯 WordPress behind HAProxy with TLS termination

HAProxy 的 backend 設定如下:

backend backend-web
    balance roundrobin
    option forwardfor
    server host1.domain.com 192.168.155.222:80  check inter 1500 rise 3 fall 3 weight 50
    server host2.domain.com 192.168.139.69:80 check inter 1500 rise 3 fall 3 weight 50

如果有設定 WAF 的話,要記得打開 forwardfor 功能,這樣後端的 Nginx/Apache 才可以解析出原始請求 IP,來做軟體防護。

Nginx 處理 X-Forwarded-For 還要記得加上 --with-http_realip_module 參數來編譯過。

針對 HAProxy 選用的負載模式解說可以參考這篇: HAProxy 負載模式

我開兩台就是平均處理就好。不過如果機器等級不同就要調整一下權重 weight 參數了!

HAProxy 強制轉 HTTPS 的方法

這個設定不論是在以前使用 Nginx 或 Apache 時都會處理,不然瀏覽器會幫你顯示個「不安全」多丟臉(?)

redirect scheme https code 301 if { hdr(Host) -i www.domain.com } !{ ssl_fc }

frontend 設定針對網域與 Schema 協定去判斷指定網域來跳轉

Ref: HAProxy redirecting http to https (ssl)

觀看分流狀態

套用下面設定開啟監控狀態的儀表板來看看 HAProxy 主機的狀態。

# HAProxy 監控儀表板
listen stats
    bind :8080
    mode http
    stats enable
    stats hide-version
    stats realm Haproxy\ Statistics
    stats uri /
    # 帳號密碼
    stats auth mxp:123456
    stats refresh 10s

參數其實也沒啥好介紹的,就是自己用的時候要「特別」一點,別被人猜到了。補不補 SSL 憑證等都是看自己設定囉~

Ref: Install and Setup HAProxy on Ubuntu 20.04

後記

關於憑證處理,日後再寫過一篇紀錄。(更新:[HAProxy] 處理憑證相關筆記:Let’s Encrypt 自動續約、default-dh-param 與 憑證串順序 等)這裡面還有很多細節可以提,比方說網站檔案部分怎麼處理?軟體服務部分會不會有設計上不符合架構的?都是改架構前要研究的大問題。


Share:

作者: Chun

資訊愛好人士。主張「人人都該為了偷懶而進步」。期許自己成為斜槓到變進度條 100% 的年輕人。[//////////____30%_________]

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *