【发布时间】:2016-07-14 00:28:55
【问题描述】:
我正在尝试从我的 nodejs 服务器中的请求对象中获取客户端的 IP 地址。
我的技术结构是:
我运行两个 docker 容器。一个用于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 标头设置为docker 网络网关接口ip。调试日志也记录了相同的 ip。
所以这就是问题所在。由于haproxy 在容器内运行,它认为 docker 网络网关接口是客户端。
我如何才能将实际客户端的 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
注意:我没有使用任何防火墙。另外,请随时建议对我的配置进行任何改进。 Keep-alive 也被证明是一个问题。
【问题讨论】:
-
我花了几天时间来完成这项工作。我已经看到了恐怖......请参阅下面的答案。我也有一个可用的 haproxy:1.6 版本,但这不会是这里的问题。
标签: node.js networking docker haproxy