需求背景
使用 docker swarm 集群来安装 nginx 有一个问题,nginx获取到的客户端地址是内网ip,通过初步排查,发现这几个ip都是 nginx 启动在 docker 节点上的 bridge 网络网关地址
影响
这样nginx仍然有办法获取到真实ip的,但是需要多层nginx,然后通过上一层添加到请求头 X-Forwarded-For 中
但是对于其他应用,不能主动获取 http 头部的程序,甚至是 tcp 应用,就没有那么容易修改、获取真实的客户端 ip 地址了,那此时应该如何处理呢?
方案
解决方案一共有两个:
- 启动服务的时候端口设置为 host 模式,那么监听就会绑定在对应物理机的接口上,从而可以实现获取客户端真实的 ip 地址。但这个方法也是有缺点的,一旦使用 host 模式,那么就无法实现负载均衡(无法访问其他docker节点端口来访问到此服务),之前很早就使用的这个办法,为了让其他节点都能提供服务,于是在每个节点都启动了一份 nginx
- docker 官方到今天仍然没有给出很好的解决方案,这是一个长达8年的讨论(2016~2024)
# 超长时间的讨论
https://github.com/moby/moby/issues/25526
但是根据帖子的内容,第三方开发者给出了以下解决方案: https://github.com/newsnowlabs/docker-ingress-routing-daemon 后续尝试使用,但是有几个点需要注意,是否影响性能、是否在已有docker swarm集群中能够使用、在使用后能否在docker swarm集群中移除、添加节点扩展、提权、降级节点等
评论