我正在尝试使用 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。此外,有时即使浏览器中的链接指向 192.168.1.1/mypage,初始 GET 请求仍会发送到 :8000
有没有办法重新配置/更改 HAProxy 以避免出现此行为?要点是当我输入网址时,我会得到正确的页面,并且网址与我输入的内容没有任何变化但是当我点击链接时(即使是同一个页面,浏览器中的链接也是相同的),我找到了正确的页面但我的 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
答案1
真正的答案是更改执行重定向的后端服务器配置。当后端发送标Location:
头时(例如,当您index.html
从 URL 中的目录中省略时),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 地址和域名执行此操作(如果您将使用两者进行访问并且希望两者都能正常工作)。