nginx - 在 Docker Swarm 1.12 访问服务时记录客户端的 "real"IP 地址

标签 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 负载均衡器地址。问题是如何知道/记录访问站点的最终客户端的地址,而不是负载均衡器的地址。

最佳答案

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

作为 docker 版本 1.12.1 存在问题。 nginx 将记录 swarm 覆盖 ip。但是客户端 ip 可以作为独立容器记录。作为一种解决方法,您可以有一个指向 swarm 服务的 reverse proxy。我知道这与 swarm 的 HighavablitySelf 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

关于nginx - 在 Docker Swarm 1.12 访问服务时记录客户端的 "real"IP 地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39854682/

相关文章:

Nginx -- 如果引用者,将 (x-forwarded-for) ip 添加到黑名单

redis - 我可以只使用 2 个 Redis/Sentinel 服务器来管理我的 2 个服务器设置上的故障转移吗?

url-rewriting - 使用 nginx 服务器重写静态 js 和 css 文件的 url

redirect - DNS 记录将 www 重定向到非 www

docker - Docker测量说 “another repo already pulling”

docker - 在 Bluemix 中创建 Docker 容器时出错

mongodb - 将网络应用程序链接到 Docker 中的 mongoDB

kubernetes - 在多个 namespace 中具有后端Kubernetes服务的入口资源

apache - 减少 Tomcat 负载平衡器故障转移的时间

ruby-on-rails - 当连接到多个数据库时,Rails 从其他请求返回结果。