安裝與設定 HAProxy
HAProxy 是一套 TCP/HTTP Load Balancer. 原本想說 nginx 似乎終於要支援 proxy websocket 了, 結果 1.2 釋出後還是搞不定, 於是決定跳槽… 應該說是加入新的工具, 因為 HAProxy 沒辦法完整取代 nginx. HAProxy 提供了很完整的 proxy 能力, 不過它並不是 web server, 所以沒有 serve static file 的能力, 所以 nginx 就變成 serve static file 專用的 server 了… XD
安裝
在 Arch Linux 下要從 AUR 安裝, 我用 yaourt:
1
| |
設定
打開 /etc/haproxy/haproxy.cfg 你會看到 global, defaults 和一堆 listen,
由於本文只打算作為快速入門用, 就不詳細解釋這些東西在幹嘛了
(懶 + 很多還不知道 XD).
事前
listen 區塊是結合 frontend 與 backend 功能的區塊,
你可以在這裡把 header 解析和 backend server 一起設定,
不過我的需求有點複雜, 所以還是 frontend 和 backend 乖乖分開寫…
所以先砍掉所有的 listen 區塊吧!
為了測試, 請先把 global 中的 chroot, uid, gid, daemon 關掉
(使用 # 開頭表示註解), 並打開 debug.
nginx backend + virtual hosts 設定
我們打算讓 nging serve static file, 以這個 blog 來說就是把所有來自 ayaya.tw 的請求都往 80 port 丟.
在前端我們想要 listen 8080 port, 所以寫一個 frontend 區塊:
1
| |
接著, 寫下比對的條件:
1 2 3 | |
acl 指令在符合指定條件 (hdr_beg(Host) -i ayaya.tw) 時,
會將指定的值 (is_blog) 設定為 true.
在這裡我給的條件是:
當 header (hdr) 中的 Host 欄位以 ayaya.tw 開始 (beg) 時,
將 is_blog 設定為 true. -i 則表示無視大小寫.
下一行看起來就很 ruby: 如果 is_blog 就使用 static 這個 backend.
所以來設定 static 這個 backend:
1 2 3 4 | |
static01 是我給 server 取的名字, 它的位置在 127.0.0.1:80,
check 則是告訴 HAProxy 定時檢查 server 狀態,
預設是用 OPTIONS / 檢查,
你可以使用 option httpchk 改以其他 method/path 檢查.
透過以上的設定, 就可以將 http://ayaya.tw:8080 導至 server 本機的 127.0.0.1:80.
啓動
1
| |
這個時候就可以連上 ayaya.tw:8080 試試看能不能正確取得檔案了. 沒有問題的話, 就可以和 nginx 互換 port 讓 HAProxy 跑在前面了.
1
| |
別忘了打開 global 中的 chroot, uid, gid, daemon, 關掉 debug…
Snippets
WebSocket
WebSocket 需要比較持久的連線, 所以在 backend 中將時間拉長…
1 2 3 4 5 6 7 8 9 | |
讓 backend 保有 client ip
不設定這個的話, backend 永遠都會得到 HAProxy 所在的 ip address.
1 2 | |
HTTP basic auth
把 LIST_NAME, USERNAME 和 PASSWORD 換成你喜歡的:
1 2 3 4 5 6 | |
字串不能用引號包, 要用 \ escape 空白…
啓用 HAProxy 內建後台
把帳號密碼換成你喜歡的:
1 2 3 4 5 | |
Hot-reconfigure
1
| |