web-dev-qa-db-fra.com

Nginx proxy_pass avec $ remote_addr

J'essaie d'inclure $ remote_addr ou $ http_remote_addr sur mon proxy_pass sans succès.

La règle de réécriture fonctionne

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

Le proxy_pass sans $ remote_addr fonctionne, mais freegeoip ne lit pas le 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;
}

Ensuite, j'ajoute l'adresse IP à la fin de la demande, comme ceci: 

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

mais nginx a signalé cette erreur: aucun résolveur défini pour résoudre freegeoip.net

23
david.sansay

Si l'instruction proxy_pass ne contient aucune variable, elle utilisera l'appel système "gethostbyaddr" lors du démarrage ou du rechargement et mettra en cache cette valeur de manière permanente.

s'il existe des variables, telles que l'utilisation de l'un des éléments suivants:

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

Ensuite, nginx utilisera un résolveur intégré et la directive "resolver" doit être présente. "resolver" est probablement un abus de langage; considérez-le comme "quel serveur DNS le résolveur intégré utilisera-t-il". Depuis nginx 1.1.9, le résolveur intégré prendra en compte les valeurs DNS TTL. Avant cela, il utilisait une valeur fixe de 5 minutes.

88
Chris Cogdon

Il semble un peu étrange que nginx ne parvienne pas à résoudre le nom de domaine au moment de l'exécution plutôt qu'au moment de la configuration (car le nom de domaine est codé en dur). L'ajout d'une déclaration resolver au bloc d'emplacement résout généralement les problèmes de DNS rencontrés au moment de l'exécution. Donc, votre bloc de localisation pourrait ressembler à:

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

Cette solution est basée sur un article que j'ai lu il y a quelque temps - Pass proxy et resolver . Vaut la peine d'être lu.

45
Rob Squires

Vous pouvez également mentionner votre nginx server port dans proxy_pass uri. Cela a résolu le problème pour moi.

0
RijulB