nin*_*dev 5 nginx docker docker-swarm traefik docker-swarm-mode
我正在使用Traefik作为docker swarm环境上nginx服务之前的反向代理。这是我的docker-stack.yml:
traefik:
image: traefik
command: -c /dev/null --web --docker --docker.swarmmode --docker.watch --docker.domain=domain --logLevel=DEBUG
ports:
- "8080:8080"
- "80:80"
- "443:443"
networks:
- app
volumes:
- /var/run/docker.sock:/var/run/docker.sock
deploy:
placement:
constraints: [node.role == manager]
nginx:
image: nginx
networks:
- app
deploy:
labels:
traefik.port: 80
traefik.docker.network: app
traefik.frontend.rule: "Host:app.domain"
Run Code Online (Sandbox Code Playgroud)
一切正常,但是我需要在Nginx访问日志中使用真实的客户端IP,相反,我得到的信息类似于10.0.1.37
如何获得真实的客户IP?
谢谢,
这个问题在github#614上进行了讨论。
当上游服务收到从Traefik转发的请求时,
X-Forwarded-For标头包含来自覆盖网络的IP地址,而不是实际的客户端地址。
为了克服这个问题,您可以使用在docker-compose> = 3.2(LONG SYNTAX)中声明服务端口的新方法。
然后,确保traefik连接到主机网络,并将发送正确的X-Forwarded-For标头(mode: host有关80端口,请参见下文):
version: "3.2"
services:
traefik:
...
ports:
- "8080:8080"
- target: 80
published: 80
protocol: tcp
mode: host
- "443:443"
...
Run Code Online (Sandbox Code Playgroud)
最后,您必须在中更改nginx log_format http {} section。这可以通过nginx.conf配置文件的卷绑定来完成:
nginx:
..
volumes:
- /data/nginx/nginx.conf:/etc/nginx/nginx.conf
Run Code Online (Sandbox Code Playgroud)
您将拥有nginx.conf:
http {
...
log_format main '$http_x_forwarded_for - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent "$http_referer" '
'"$http_user_agent"' ;
Run Code Online (Sandbox Code Playgroud)
在AWS ec2上进行了测试,该traefik_nginx服务(我称为我的stack traefik)日志如下所示:
$ docker service logs -f traefik_nginx
...
traefik_nginx.1.qpxyjheql5uk@xxx | 82.253.xxx.xxx - - [20/Jun/2017:08:46:51 +0000] "GET / HTTP/1.1" 200 612 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.104 Safari/537.36"
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3963 次 |
| 最近记录: |