Apache / Nginx 很常用到的情境就是同個 Port 會有不同的站台,這時會使用到 VirtualHost 。
那 HAProxy 可以這樣做嗎?利用 Google 找了一下,發現是可以,主要是使用 ACL 的設定。
關鍵的設定是寫在 frontend 裡 (設定摘錄自 HAProxy – route by domain name | Sean McGary)
frontend http-in
bind *:80
# Define hosts
acl host_bacon req.hdr(host) -i ilovebacon.com
acl host_milkshakes req.hdr(host) -i bobsmilkshakes.com
## figure out which one to use
use_backend bacon_cluster if host_bacon
use_backend milshake_cluster if host_milkshakes
利用 acl + hdr(host) 來判斷 HTTP header 裡的 Host ,接著再使用 use_backend … if … 來決定使用哪一個 backend。
查到以後,我試了好一陣子,都試不出來,後來才搞懂,當使用這個來判斷 header 時,mode 必須要改為 http,如果 mode 是 tcp,那麼是沒作用的。同理,當要用到 https 上時,也會不行,因為連線的內容被加密,HAProxy 無法解讀內容,也就無法得知 header。
HAProxy 的 backend 裡可以改寫 request 的 header,方法如下
backend ocp-apps-http
mode http
http-request del-header Host
http-request set-header Host petclinic.apps.example.com
server node1 petclinic.apps.example.com:80
透過這個,就可以達到類似 reverse proxy 的效果。
今天試下來,大致對 Apache / Nginx / HAProxy 的定位有了一定程度的了解。HAProxy 有兩個 mode:tcp / http,tcp 適用於 SSL pass-through 跟純 TCP 傳輸的情況,這時是由 backend 來處理 SSL 憑證;http 可以視為跟 Apache / Nginx 相似的情況,也可以掛 SSL 憑證。
簡單的說,Apache / Nginx 並不能完全取代 HAProxy,反之亦然。
沒有留言:
張貼留言