HAProxy 后端负载平衡端口正在添加

HAProxy 后端负载平衡端口正在添加

我正在尝试使用 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 地址和域名执行此操作(如果您将使用两者进行访问并且希望两者都能正常工作)。

相关内容