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 не определено никакого распознавателя.
Ответы
Ответ 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/;
}
}