我需要一个 haproxy 的变量,它是实际的远程 ip,同时仍在使用accept-proxy
,就像http-response set-header Upstream-Server %[req.real_ip]
.%[src]
一样不是accept-proxy
如果处于活动状态,则工作并从代理协议发送客户端ip 。
我有这样的设置:
- haproxy 负载均衡器
- haproxy ddos 保护服务器
- nginx 代理 PHP Web 应用程序
1 接受公共 Internet HTTP/S 连接并mode tcp
转发它们。2
这些accept-proxy
连接,终止ssl crt
,然后应用反机器人逻辑。3
是最终目的地和 Web 应用程序。
这是一个相当复杂的设置,因此配置中偶尔会出现一些小问题,由于移动部件的数量,这些问题很难诊断。我需要 nginx 知道 1 和 2 的 IP,这样它就可以将其发送到实际的 Web 应用程序进行调试。
答案1
非常愚钝,但确实有效。
tcp-request
必须出现在任何 http 请求之前,以免引起警告。tcp-request connection
是 中唯一不受 中的指令src
改变的范围。因此,accept-proxy
bind
frontend http-in
bind :443 ssl crt /etc/ssl/mycert accept-proxy
option forwardfor
tcp-request connection set-var(sess.last_server_ip) src
http-request add-header X-Forwarding-Frontend %[var(sess.last_server_ip)]
这将添加标头X-Forwarding-Frontend
,其中包含 haproxy 接收代理协议请求的服务器的值。必须以这种方式将其设置为变量,因为src
当不作为 的参数时,在其他每个上下文中都有不同的值tcp-request connection
。