欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 科技 > 能源 > vip与haproxy构建nginx高可用集群传递客户端真实ip

vip与haproxy构建nginx高可用集群传递客户端真实ip

2025/2/14 2:25:46 来源:https://blog.csdn.net/qq_41633199/article/details/144891763  浏览:    关键词:vip与haproxy构建nginx高可用集群传递客户端真实ip

问题

系统使用了vip与haproxy实现高可用以及对nginx进行负载均衡,但是发现在上游的应用服务无法拿到客户端的请求ip地址,拿到的是主haproxy机器的ip,以下是nginx与haproxy的缩减配置:

location ~* ^/(xx|xx) {proxy_pass http://upsteam;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

haproxy配置,已缩减

frontend nginxmode tcpbind 0.0.0.0:443default_backend nginx_clusterbackend nginx_clustermode tcpbalance leastconnserver inst1 10.17x.xx.xx:4433

haproxy配置参考地址
https://www.haproxy.com/documentation/haproxy-configuration-tutorials/load-balancing/tcp/
haproxy版本:2.4.22
nginx版本:1.24.0

网络架构图

在这里插入图片描述

原因分析

因为haproxy为了提升性能使用了tcp模式转发,但是由于工作在第四层协议,不会解析到第七层的http包,所以无法直接将客户端ip传递给上游的Nginx。

解决方案

对haproxy与nginx采用proxy协议,haproxy通过send-proxy指令将客户端ip传递给上游nginx,nginx获取到客户端ip后将其写入调用上游应用的请求头中,配置如下

  1. haproxy
frontend nginxmode tcpbind 0.0.0.0:443default_backend nginx_clusterbackend nginx_clustermode tcpbalance leastconnserver inst1 10.17x.xx.xx:4433 send-proxy
  1. nginx
server {listen 4433 ssl default_server proxy_protocol;server_name  localhost;ssl_certificate "/etc/nginx/cert/xx.pem";ssl_certificate_key "/etc/nginx/cert/xx.key";charset utf-8;location ~* ^/(xx|xx) {proxy_pass http://upsteam;proxy_set_header X-Real-IP $proxy_protocol_addr;proxy_set_header X-Forwarded-For $proxy_protocol_addr;}
}

参考文档地址:
https://docs.nginx.com/nginx/admin-guide/load-balancer/using-proxy-protocol/#realip

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com