我想从我的nodejs服务器中的请求对象获取客户端的IP地址。如何从haproxy docker容器中的请求获取客户端IP?
我的技术结构是: 我运行了两个码头集装箱。一个用于haproxy
和其他用于nodejs
其中使用expressjs
框架。所有传入流量首先由haproxy接收,我使用它代理和负载平衡。 Haproxy根据配置文件中的ACLs
将请求转发到适当的后端。
我试图在我的nodejs中访问x-forwarded-for
请求头,但它只返回了docker网关接口172.17.0.1
的IP地址。
通过haproxy
配置并在defaults
块中使用option forwardfor header X-Client-IP
也将x-client-ip
标头设置为码头网络网关接口ip。此外,调试日志也记录相同的IP。
所以这就是问题所在。由于haproxy
在容器内运行,因此认为泊坞网网关接口是客户端。
如何在容器内部将实际客户端的IP地址设置为haproxy
以便它可以将其转发到nodejs?
这是我haproxy
配置文件:
global
debug
maxconn 4096
defaults
mode http
timeout connect 5000ms
timeout client 50000ms
timeout server 50000ms
timeout http-keep-alive 50000ms
option http-keep-alive
option http-server-close
option forwardfor header X-Client-IP
frontend http-in
bind *:80
acl is_api hdr_end(host) -i api.3dphy-dev.com
use_backend api if is_api
default_backend default
backend default
server s0 "${DOCKER_INTERFACE_IP}:3000"
backend api
balance leastconn
option httpclose
option forwardfor
server s1 "${DOCKER_INTERFACE_IP}:17884"
我跑我使用HAProxy的容器:
docker run -d --name haproxy_1 -p 80:80 -e DOCKER_INTERFACE_IP=`ifconfig docker0 | grep -oP 'inet addr:\K\S+'` -v $(pwd)/config/haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg:ro haproxy:1.6
注:我没有使用任何防火墙。另外,随时提出我的配置的任何改进。保持活力也被证明是一个问题。
我花了好几天的时间来完成这项工作。我已经看到了恐怖......见下面的答案。我也有一个工作haproxy:1.6版本,但这不会是这里的问题。 – eljefedelrodeodeljefe