proxy_pass example nginx proxypass

example - nginx rewrite proxy_pass



Nginx proxy_pass con $ remote_addr (4)

Estoy intentando incluir $ remote_addr o $ http_remote_addr en mi proxy_pass sin éxito.

La regla de reescritura funciona

location ^~ /freegeoip/ { rewrite ^ http://freegeoip.net/json/$remote_addr last; }

El proxy_pass sin el $ remote_addr funciona, pero freegeoip no lee el x-Real-IP

location ^~ /freegeoip/ { proxy_pass http://freegeoip.net/json/; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $host; }

Luego, estoy agregando la dirección IP al final de la solicitud, de esta manera:

location ^~ /freegeoip/ { proxy_pass http://freegeoip.net/json/$remote_addr; }

pero nginx informa de este error: no se ha definido un resolutor para resolver freegeoip.net


Parece un poco extraño que nginx no logre resolver el nombre de dominio en tiempo de ejecución en lugar de en el momento de la configuración (ya que el nombre de dominio está codificado). La adición de una declaración de resolver al bloque de ubicación generalmente corrige los problemas de DNS experimentados en el tiempo de ejecución. Por lo tanto, su bloque de ubicación podría verse como:

location ^~ /freegeoip/ { #use google as dns resolver 8.8.8.8; proxy_pass http://freegeoip.net/json/$remote_addr; }

Esta solución se basa en un artículo que leí hace un tiempo: Proxy pass and resolver . Valdría la pena una lectura.


Si alguien está experimentando problemas, para mí, me ayudó a mover el host proxy_pass a una secuencia separada, por lo que se me ocurre algo como esto.

upstream backend-server { server backend.service.consul; } server { listen 80; server_name frontend.test.me; location ~/api(.*)$ { proxy_pass http://backend-server$1; } location / { # this works mystically! backend doesn''t... proxy_pass http://frontend.service.consul/; } }


Si la sentencia proxy_pass no tiene variables, utilizará la llamada al sistema "gethostbyaddr" durante el inicio o la recarga y almacenará ese valor de manera permanente.

Si hay alguna variable, como el uso de cualquiera de los siguientes:

set $originaddr http://origin.example.com; proxy_pass $originaddr; # or even proxy_pass http://origin.example.com$request_uri;

Entonces nginx usará un programa de resolución integrado, y la directiva "resolver" debe estar presente. "resolver" es probablemente un nombre inapropiado; considérelo como "qué servidor DNS utilizará el sistema de resolución integrado". Desde nginx 1.1.9, el sistema de resolución integrado respetará los valores TTL de DNS. Antes de eso utilizaba un valor fijo de 5 minutos.


También puede mencionar el server port su server port nginx en el proxy_pass uri . Esto solucionó el problema para mí.