私のnodejsサーバーの要求オブジェクトからクライアントのIPアドレスを取得しようとしています。haproxy docker container内のリクエストからクライアントIPを取得する方法は?
私の技術構造は次のとおりです。 私は2つのドッカーコンテナを実行しています。 1つはhaproxy
であり、他のものはnodejs
であり、expressjs
フレームワークを使用します。すべての着信トラフィックは、プロキシとロードバランシングに使用するhaproxyによって最初に受信されます。 Haproxyは、構成ファイル内のACLs
に基づいて、要求を適切なバックエンドに転送します。
私のnodejs内のx-forwarded-for
リクエストヘッダーにアクセスしようとしましたが、ドッカーネットワークゲートウェイインターフェイス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