我正在测试一个新的网络服务器设置,它有几个问题。本质上,我们有一个网络服务器,其中代码使用远程 IP 来处理一些有趣的事情,还有一些 apache 目录被保护到某些特定的 IP(我们的办公室等)。
然而,我们只是把它放在 ha_proxy 后面,所以我们可以考虑添加更多的应用程序服务器,但是现在远程 IP 总是作为代理 IP 而不是真正的远程用户。这意味着我们无法到达某些位置,并且我们的应用在用户 IP 很重要的地方表现得有点奇怪。
我们的配置如下:
global
maxconn 4096
pidfile /var/run/haproxy.pid
daemon
defaults
mode http
retries 3
option redispatch
maxconn 2000
contimeout 5000
clitimeout 50000
srvtimeout 50000
listen farm xxx.xxx.xxx.xxx:80
mode http
cookie GALAXY insert
balance roundrobin
option httpclose
option forwardfor
stats enable
stats auth username:userpass
server app1 xxx.xxx.xxx.xxx:80 maxconn 1 check
Run Code Online (Sandbox Code Playgroud)
Max*_*ell 33
引用自haproxy.1wt.eu的 HAProxy 文档。
- 如果应用程序需要记录原始客户端的 IP,请使用
“forwardfor”选项将添加一个“X-Forwarded-For”标头
原始客户端的 IP 地址。您还必须使用“httpclose”来确保
您将重写每个请求,而不仅仅是每个请求中的第一个
会议:
选项 httpclose
选项转发
据说应用程序必须处理 X-Forwarded-For HTTP Header 才能知道客户端 IP 地址。似乎是您的情况的唯一方法。
Haproxy 1.4 引入了一种带有“option http-server-close”的新模式。它仍然关闭到服务器的连接,但如果可能并使用,它会保持对客户端的连接。在大多数设置中,您可能希望使用它,因为它有助于解决连接的单个高延迟部分(Haproxy 和客户端之间)的延迟。
Run Code Online (Sandbox Code Playgroud)option http-server-close option forwardfor
有一种方法可以重新编译 HAproxy 以包含 Tproxy,这将允许转发源地址。
这里有一篇关于它的博客文章:http : //blog.loadbalancer.org/configure-haproxy-with-tproxy-kernel-for-full-transparent-proxy/
一些注意事项:
最新的 linux 内核 (2.6.28-11-server) 包括对 TProxy 的支持,因此不需要重新编译内核。
确保使用指向 HAProxy 服务器的默认网关地址配置网络场中的服务器。