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

esk*_*skp 8 load-balancing nginx docker docker-swarm

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

docker network create --driver overlay proxy
docker service create --name proxy --network proxy -p 80:80 nginx
Run Code Online (Sandbox Code Playgroud)

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

Far*_*ahi 9

很好!,大多数人分析 nginxaccess.log和客户端 ip 是其中的重要部分。

作为 docker 版本 1.12.1,问题存在。nginx 将记录 swarm 覆盖 ip。但是客户端 ip 作为独立容器记录得很好。作为一种变通方法,您可以reverse proxy指向 swarm 服务。我知道这是对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;
  }
}
Run Code Online (Sandbox Code Playgroud)

更多信息可以在这个 github 问题上找到。

另外一个选项:

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

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
Run Code Online (Sandbox Code Playgroud)


sas*_*sas 6

所以我现在解决这个问题的方法是使用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
Run Code Online (Sandbox Code Playgroud)