星期二, 9月 07, 2021

HAProxy的VirtualHost

 

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,反之亦然。

沒有留言: