5
respostas

Pegar o IP original no NGINX

Amigos,

Quando olho os logs do Nginx, eu recebo apenas o IP dos container internos. Como eu posso configurar o swarm para enviar para o Nginx o IP original do usuário?

Obrigado

5 respostas

Opa Emerson, tudo bem?

Deixa eu confirmar se entendi. Você tem o nginx rodando dentro de um nó qualquer de um cluster e não quer pegar o IP dos nós, e sim da máquina host?

Olá Daniel, Obrigado pelo retorno. Eu preciso ter acesso ao IP original do usuário que esta acessando o meu ambiente.

Eu preciso salvar esses dados de acesso.. Como hora, path, IP, etc... Pego essas infos no log de acesso do Nginx, porem o IP que vem é do nodes internos.. O que eu preciso é que venha o IP original do usuário que acessou..

Exemplo:

 | 10.0.24.144 - - [19/May/2020:07:24:42 +0000] "GET /media/kderno/files/2020/05/13/anigif_sub-buzz-22161-1512589653-2.gif HTTP/1.1" 200 997632 "http://localhost:3000/@lucas/kderno-de-lucas" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36" "10.0.0.2"

onde vemos 10.0.24.144, deveríamos ver o IP real do usuario que esta acessando.

Qual comando você está executando para criar o nginx?

Estou usando docker swarm

version: '3.3'
services:
  nginx:
    image: nginx:latest
    volumes:
     - /mnt/data/images:/var/www/images
     - /mnt/data/images:/var/www/media
    networks:
     - frontends
     - traefik
    logging:
      driver: json-file
    deploy:
      replicas: 3
      labels:
        traefik.docker.network: traefik
        traefik.enable: 'true'
        traefik.http.routers.nginx.entrypoints: websecure
        traefik.http.routers.nginx.rule: Host(`XXXX`)
        traefik.http.routers.nginx.tls.certresolver: mytlschallenge
        traefik.http.services.nginx.loadbalancer.server.port: '80'
      restart_policy:
        condition: on-failure
      placement:
        constraints:
         - node.role == manager
networks:
  frontends:
    external: true
  traefik:
    external: true

Uma possibilidade seria você utilizar apenas uma réplica para execução do serviço do nginx e fazer a publicação utilizando o modo host. Algo como:

ports: 
  - mode: host 
  ....

Caso realmente haja a necessidade de utilizar mais de uma réplica, você pode deixar a atribuição de portas de maneira randômica.