配置 HAProxy 以包含不同後端的主機頭
我正在探索使用 HAProxy 作為在 IIS 上執行的一組 web api 前面的平衡器。
- node1.myapp.mycompany.com
- node2.myapp.mycomapny.com
我們目前正在使用主機頭在 IIS 上正確解析正確的 Web 應用程序。例如,我們可能在同一伺服器/埠上執行 otherapp.mycompany.com,但使用 Host Headers IIS 知道要為哪一個提供服務。
我對 HAProxy 的最初嘗試給我留下了 404 錯誤,因為我的請求中沒有包含主機標頭,因此 IIS 正在返回綁定到給定 IP 的預設站點,而不是通過主機名解析。
修復給我留下了這樣的東西:
frontend localnodes bind *:80 mode http default_backend nodes backend nodes mode http balance roundrobin option forwardfor reqirep ^Host: Host:\ node1.myapp.mycompany.com server web01 node1.myapp.mycompany.com:80
這對於單個後端非常有用,但我對如何包含正確的主機標頭感到頭疼,具體取決於哪個後端正在提供請求:
backend nodes mode http balance roundrobin option forwardfor reqirep ^Host: Host:\ node1.myapp.mycompany.com server web01 node1.myapp.mycompany.com:80 server web02 node2.myapp.mycompany.com:80
上面的內容在
node2
使用時不起作用,因為它在 IIS 中無法正確解析(在這種情況下,node2 在不同的伺服器上,因此在不同的 IP 上。事實上,如果它們在相同的伺服器/IP 上執行,我懷疑該請求工作“工作”,但它們都將由 node1 每個主機頭提供服務)。
- 是否可以根據用於提供請求的後端 url 設置主機?
- 如果是這樣,這意味著我
check
的 s 還需要基於後端提供正確的主機頭,那將如何完成?編輯:我正在使用 HA-Proxy 版本 1.7.9 2017/08/18
讓我再多介紹一點背景。我們過去只是
myapp.mycompany.com
提供 api 請求。我們需要擴展它。我們的客戶仍然會呼叫myapp.mycompany.com
,但這只會指向 HAProxy,它將平衡它到node1.myapp.mycompany.com
和node2.myapp.mycompany.com
。我們目前的伺服器配置讓我們在每台伺服器上綁定一個 IP 地址,因此我們使用主機頭來解析。
我不確定以下是否可行,並且現在無法測試,但也許這仍然有幫助。(稍後我會再看一遍):
解決方案1:
backend nodes mode http balance roundrobin option forwardfor http-request set-header Host node1.myapp.mycompany.com if { srv_id 1 } http-request set-header Host node2.myapp.mycompany.com if { srv_id 2 } server web01 node1.myapp.mycompany.com:80 server web02 node2.myapp.mycompany.com:80
解決方案2:
注意 這個是官方不推薦的。閱讀關於http-send-name-header的評論:據報導,該指令目前被用作覆蓋傳出請求中的 Host 標頭欄位的一種方式;雖然這個技巧在一段時間內被認為是該功能的副作用,但它不受官方支持,並且可能在未來的版本中不再起作用,具體取決於此功能引起的技術困難…… [歸功於 rustyx。 ]
backend nodes mode http balance roundrobin option forwardfor http-send-name-header Host server node1.myapp.mycompany.com node1.myapp.mycompany.com:80 server node1.myapp.mycompany.com node2.myapp.mycompany.com:80