我想從我的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