Linux
如何在 tcp 模式下將客戶端的 IP 地址從 Haproxy 轉發到 Nginx
我想以 tcp 模式將真實客戶端的 IP 地址從 haproxy 轉發到我的後端伺服器。Haproxy的配置如下:
frontend main bind *:80 mode http option forwardfor option http-server-close default_backend app-main frontend https_main bind *:443 mode tcp option tcplog option tcpka default_backend app-ssl backend app-main balance roundrobin server web1 192.168.1.22:8080 check fall 3 rise 2 server web2 192.168.1.33:8080 check fall 3 rise 2 backend app-ssl balance roundrobin mode tcp option ssl-hello-chk server web3 192.168.1.44:443
http 請求的後端伺服器是 apache,我已將 httpd.conf 中的以下行替換為日誌行,因此我現在可以正確獲取客戶端的 IP 地址:
LogFormat "%h %l %u %t \"%r\" %>s %b %{X-Forwarded-For}i" common
我的 https 後端伺服器使用 Nginx 作為 ssl 終止的 reverse_proxy 並將請求發送到 apache 後端。我的問題是我不知道如何在 nginx 日誌中獲取真實客戶端的 IP 地址?我搜尋了很多,並在 serverfault 和 stackoverflow 上找到了一些解決方案,但它們都沒有解決我在 haproxy 中以 tcp 模式轉發客戶端 IP 地址的問題。任何幫助表示讚賞。
您應該
listen 443 ssl proxy_protocol;
在 nginx 端使用並send_proxy
在 Haproxy 端使用指令。
我的工作配置HA端:
# USED FOR some_service frontend some_service_https mode tcp bind *:443 option tcplog option forwardfor default_backend some_service_https backend some_service_https balance roundrobin stick-table type ip size 1m expire 1h stick on src server some_service 192.168.1.2:443 send-proxy check
和 NGINX 方面:
set_real_ip_from 192.168.1.1; # HAproxy local IP set_real_ip_from 183.55.111.30; # HAproxy external IP real_ip_header proxy_protocol; # proxy_protocol needed real_ip_recursive on; upstream some_service { server unix:/tmp/unicorn.some_service.sock fail_timeout=0; } server { server_name some_service.myserver.com some_service_1.myserver.com; listen 443 proxy_protocol; # proxy_protocol needed root /opt/apps/some_service/current/public; add_header X-Whom some_service_1.myserver.com;
不要忘記在 HA 後端和 real_ip_header proxy_protocol 上添加“send-proxy”,並將 proxy_protocol 監聽到 NGINX。即使您使用 80 或 443 埠或兩者都可以使用。