2017-06-19 169 views
3

我使用Traefik作爲碼頭羣環境中的nginx服務前面的反向代理。這是我的搬運工,stack.yml:Nginx後面Traefik碼頭羣模式真正的ip

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" 

一切工作正常,但我需要真正的客戶端IP在我的Nginx的訪問日誌,而不是我得到的東西像10.0.1.37

如何得到我可以和真正的客戶端IP?

謝謝,

回答

3

此問題在github #614上進行了討論。

當上遊服務接收到從Traefik轉發的請求時,X-Forwarded-For標頭包含來自覆蓋網絡的IP地址,而不是實際的客戶端地址。

要解決這個問題,可以使用declaring service ports in 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" 
    ... 

最後,你必須改變nginx的log_format在http {} section 。這可以通過批量做一個nginx.conf配置文件的結合:

nginx: 
    .. 
    volumes: 
    - /data/nginx/nginx.conf:/etc/nginx/nginx.conf 

你不得不nginx.conf本:

http { 
    ... 
    log_format main '$http_x_forwarded_for - $remote_user [$time_local] ' 
    '"$request" $status $body_bytes_sent "$http_referer" ' 
    '"$http_user_agent"' ; 

測試上的AWS EC2,在traefik_nginx服務(我叫我的籌碼traefik )這樣的日誌:

$ docker service logs -f traefik_nginx 
... 
[email protected] | 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" 
+0

謝謝你的回答,那可以工作。我認爲mode'host'阻止Swarm路由機制:如果我的swarm中有2個節點,那麼實際上只有1個節點暴露traefik權利? –

+0

我認爲你是對的(沒有檢查它),但由於路由網格使用入口網絡(我們繞過使用'主機'網絡的覆蓋網絡),所以traefik應該只顯示在它部署到的主機上。如果你測試它,如果你能更新我,我會很高興。 –

+0

HA和LB不太好:( –

相關問題