我想将实际客户端的IP地址从haproxy转发到我的后端服务器在TCP模式。 Haproxy的configuration如下:
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 addreses:
LogFormat "%h %l %u %t \"%r\" %>s %b %{X-Forwarded-For}i" common
我的https后端服务器使用Nginx作为ssl终止的reverse_proxy并将请求发送到apache后端。 我的问题是,我不知道如何才能在nginx日志中获得真实客户端的IP地址? 我googled了很多,发现serverfault和stackoverflow的一些解决scheme,但没有一个解决了我在haproxy转发客户端的IP地址在tcp模式下的问题。 任何帮助表示赞赏。
你应该使用listen 443 ssl proxy_protocol; 在nginx端和send_proxy在Haproxy端的指令。
在Nginx上使用代理协议
Haproxy文档
从HAProxy发送PROXY协议头
我的工作configurationHA方:
# 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端口,或两者兼而有之。