Nginx proxy_pass с $remote_addr - программирование
Подтвердить что ты не робот

Nginx proxy_pass с $remote_addr

Я пытаюсь включить $remote_addr или $http_remote_addr в свой proxy_pass без успеха.

Правило rewrite работает

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

Прокси-пароль без $remote_addr работает, но freegeoip не читает 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;
}

Затем я добавляю ip в конец запроса, например:

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

но nginx сообщит об этой ошибке: для решения проблемы freegeoip.net не определено никакого распознавателя.

4b9b3361

Ответ 1

Если оператор proxy_pass не имеет в нем переменных, он будет использовать системный вызов "gethostbyaddr" во время запуска или перезагрузки и будет кэшировать это значение навсегда.

если есть какие-либо переменные, например, используя одно из следующих действий:

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

Затем nginx будет использовать встроенный преобразователь, и должна присутствовать директива "resolver". "резольвер", вероятно, является неправильным; подумайте об этом как "какой DNS-сервер будет использовать встроенный преобразователь". Начиная с nginx 1.1.9 встроенный преобразователь будет соблюдать значения DNS TTL. До этого он использовал фиксированное значение 5 минут.

Ответ 2

Кажется немного странным, что nginx не может разрешить имя домена во время выполнения, а не во время конфигурации (поскольку имя домена жестко закодировано). Добавление объявления resolver в блок местоположения обычно фиксирует проблемы DNS, возникающие во время выполнения. Таким образом, ваш блок местоположения может выглядеть так:

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

Это решение основано на статье, которую я прочитал некоторое время назад - Прокси-пропуск и преобразователь. Было бы полезно прочитать.

Ответ 3

Вы также можете указать свой nginx server port в proxy_pass uri. Это решило проблему для меня.

Ответ 4

Если кто-то испытывает проблемы, для меня это помогло переместить хост proxy_pass на отдельный поток вверх, поэтому я придумал что-то вроде этого

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/;
  }
}