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负载均衡器地址.问题是如何知道/记录访问站点的最终客户端的地址而不是负载均衡器地址.
很好!,大多数人分析 nginxaccess.log
和客户端 ip 是其中的重要部分。
作为 docker 版本 1.12.1,问题存在。nginx 将记录 swarm 覆盖 ip。但是客户端 ip 作为独立容器记录得很好。作为一种变通方法,您可以reverse proxy
指向 swarm 服务。我知道这是对High availablity
和Self 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)
所以我现在解决这个问题的方法是使用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)
归档时间: |
|
查看次数: |
4518 次 |
最近记录: |