我正在测试一个新的 Web 服务器设置,它有几个问题。本质上,我们有一个 Web 服务器,其中代码使用远程 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
引用自haproxy.1wt.eu的 HAProxy 文档。
据说应用程序必须处理 X-Forwarded-For HTTP Header 才能知道客户端 IP 地址。在你的情况下,这似乎是唯一的方法。
为 HAProxy 1.4 更新
有一种方法可以重新编译 HAproxy 以包含 Tproxy,这将允许转发源地址。
这里有一篇关于它的博客文章:http: //blog.loadbalancer.org/configure-haproxy-with-tproxy-kernel-for-full-transparent-proxy/
几点注意事项:
最新的 linux 内核 (2.6.28-11-server) 包括对 TProxy 的支持,因此不需要重新编译内核。
确保使用指向 HAProxy 服务器的默认网关地址配置 Web 场中的服务器。
使用 rpaf apache 模块http://stderr.net/apache/rpaf/ 我知道这是旧帖子,但我花了几天时间才找到它。这将向任何应用程序显示 x-forwarded-for ip。
请注意,您似乎可以覆盖应用程序看到的我更改 Apache 标头的内容:
但是,这不适用于通过“允许来自”等进行的 Apache 访问。
根据设计,HAProxy 无法将原始 IP 地址转发到真实服务器,就像任何其他代理一样。
如果您唯一的问题是 Web 服务器,则一种解决方案可能是查看 X-forwarded-for HTTP 标头,该标头应包含客户端的地址。现在,这几乎是特定于应用程序/语言的,但请看一下 php 中的这个示例:
$headers = apache_request_headers();
$real_client_ip = $headers["X-Forwarded-For"];
如果你还想记录原始地址,你可以修改 httpd.conf 中的 LogFormat 看起来像这样:
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{X-Forwarded-For}i\"" common
好吧,X-Forwarded-for 似乎不适用于您的设置。那么,你坚持使用 haproxy 有什么特别的原因吗?似乎 IPVS 更适合您的需求(我实际上使用 ldirector,而后者又使用 ipvs)。
看一眼:
http://kb.linuxvirtualserver.org/wiki/IPVS
和
http://www.vergenet.net/linux/ldirectord/
在“IP 隧道”或“直接路由”模式下使用 IPVS 可以保留客户端的地址。
从http://www.openinfo.co.uk/apache/尝试 mod_extract_forwarded
在 tcp 和 nginx 模式下使用 haproxy 的简单方法:
添加 send-proxy 作为服务器选项:
haproxy.conf:
.
.
听 ssl 0.0.0.0:443
模式 tcp
平衡最小连接
选项 httpchk GET /ping
选项日志健康检查
服务器 w1 192.168.1.1:443 发送代理检查检查 SSL 验证无
服务器 w2 192.168.1.1:443 发送代理检查检查 SSL 验证无
.
.
Nginx 需要支持代理协议
nginx.conf:
.
.
听 192.168.1.1:443 ssl proxy_protocol;
.
.
set_real_ip_from 192.168.1.0/24;
real_ip_header 代理协议;
.
.