Load-Balancing

正在添加 HAProxy 後端負載平衡埠

  • August 10, 2020

我正在嘗試使用 HAProxy 在後端伺服器之間進行負載平衡,但由於某種原因,後端伺服器的埠不斷被插入。

範例:我連接到 192.168.1.1(通過埠 80,因為我試圖從 chrome 載入網頁)。HAProxy 工作,我得到一個後端的網頁

然後我嘗試點擊頁面內的連結。連結地址仍然是 192.168.1.1(無埠),但是當我點擊它時,我的 URL 將變為 192.168.1.1:8000/mypage(即使我正在由 192.168.1.2 伺服器提供服務)。

我使用wireshark查看消息,HAProxy有時會發送301響應,說頁面已永久移動到192.168.1.1:8000/mypage。頁面內容的其餘 GET 請求然後轉到 :8000 url。此外,有時即使 broswer 中的連結指向 192.168.1.1/mypage,初始 GET 請求仍會發送到:8000

有沒有辦法重新配置/更改 HAProxy 以使其沒有這種行為?它的要點是,當我輸入一個 url 時,我得到了正確的頁面,並且 url 並沒有改變我輸入的內容,但是當我點擊一個連結時(甚至到同一頁面,瀏覽器中的連結是同樣),我得到了正確的頁面,但是我的 url 更改為添加了後端埠。

我的 HAProxy 配置如下

global
   log         127.0.0.1 local2

   chroot      /var/lib/haproxy
   pidfile     /var/run/haproxy.pid
   maxconn     4000
   user        haproxy
   group       haproxy
   daemon

   stats socket /var/lib/haproxy/stats
   stats timeout 30s

defaults
   mode                    http
   log                     global
   option                  httplog
   option                  dontlognull
   option http-server-close
   option forwardfor       except 127.0.0.0/8
   option                  redispatch
   retries                 3
   timeout http-request    10s
   timeout queue           1m
   timeout connect         10s
   timeout client          1m
   timeout server          1m
   timeout http-keep-alive 10s
   timeout check           10s
   maxconn                 3000

frontend main
   bind *:80

   stats enable
   stats uri /stats
   stats realm HAProxy\ Statistics
   stats auth admin:password


   default_backend backend_main

backend backend_main
   balance     roundrobin
   option prefer-last-server

   cookie server_cookie insert indirect nocache

   server  s1 192.168.1.1:8000 check cookie s1
   server  s2 192.168.1.2:8000 check cookie s2

真正的答案是更改正在執行重定向的後端伺服器配置。當後端發送Location:標頭時(例如,當您從 URL 中的目錄中省略時index.html),HAProxy 將簡單地傳遞它。或者,當您的頁面 HTML 包含指向 192.168.1.1 的直接連結時,顯然這是瀏覽器在點擊時會去的地方。

有(至少)兩種方法可以解決這個問題。首先是在後端 Web 伺服器上 - 確保沒有頁麵包含 192.168.1.1 並且任何Location:標頭都具有正確的埠 (80)。第二種方法是在 HAProxy 中通過重寫Location:標頭,例如

http-request replace-header Location ^http://192.168.1.1:8000/(.*)$ http://192.168.1.1/\1

如果您使用 HAProxy 方法,請注意您需要分別為 IP 地址和域名執行此操作(如果您將同時使用兩者進行訪問並希望兩者都工作)。

引用自:https://serverfault.com/questions/1029591