访问服务时,在Docker Swarm 1.12中记录客户端的“真实”IP地址

时间:2016-10-04 14:17:05

标签: nginx docker load-balancing docker-swarm

我在用户创建的覆盖网络中的Docker Swarm中运行nginx容器作为服务。两者都创建于:

docker network create --driver overlay proxy
docker service create --name proxy --network proxy -p 80:80 nginx

当通过浏览器访问nginx站点时,在nginx访问日志远程地址被记录为10.255 ...格式化地址,我认为是Swarm负载均衡器地址。问题是如何知道/记录访问站点的最终客户端的地址,而不是负载均衡器地址。

3 个答案:

答案 0 :(得分:4)

好抓!大多数人分析nginx access.log和客户端ip是其中的重要部分。

作为docker版本1.12.1存在问题。 nginx会记录swarm overlay ip。但是客户端ip可以作为独立容器记录。作为一种解决方法,您可以reverse proxy指向群服务。我知道这违反了High availablitySelf Healing群体的概念,但似乎是目前唯一的解决方法。

示例配置:(假设swarm服务正在localhost上监听8081)

server {
  listen 80 default_server;
  location / {
    proxy_set_header        Host $host;
    proxy_set_header        X-Real-IP $remote_addr;
    proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header        X-Forwarded-Proto $scheme;
    proxy_pass          http://localhost:8181;
    proxy_read_timeout  90;
  }
}

可在this github issue找到更多信息。

另一种选择:

您可以在主机模式下使用网络。

docker service create \
--name nginx \
--network <your overlay network> \
--publish mode=host,target=80,published=80 \
--publish mode=host,target=443,published=443 \
--replicas 1 \
nginx

答案 1 :(得分:1)

所以我现在解决这个问题的方法是使用mode=host选项发布端口并将代理容器固定到单个节点,如下所示:

docker service create \
--name proxy \
--network proxy \
--publish mode=host,target=80,published=80 \
--publish mode=host,target=443,published=443 \
--constraint 'node.hostname == myproxynode' \
--replicas 1 \
letsnginx

答案 2 :(得分:0)

我们必须解决为运行 https://www.newsnow.co.uk/ 的 Docker Swarm 生产部署识别客户端真实 IP 的问题(mode=host 不是一个选项,因为我们需要在多个节点上运行多个副本)。< /p>

为了解决这个问题,我们创建了:https://github.com/newsnowlabs/docker-ingress-routing-daemon,一个修改入口网状网络路由以向服务容器公开真实客户端 IP 的守护进程。