Я использую nginx / 0.7.68, работающий на CentOS, со следующей конфигурацией:
server {
listen 80;
server_name ***;
index index.html index.htm index.php default.html default.htm default.php;
location / {
root /***;
proxy_pass http://***:8888;
index index.html index.htm;
}
# where *** is my variables
Это proxy_pass
DNS-запись, IP-адрес которой часто меняется. Nginx кэширует устаревший IP-адрес, что приводит к запросу на неправильный IP-адрес.
Как я могу остановить nginx от кеширования IP-адреса, если он устарел?
Ответы:
Это интригующий вопрос и AFAIK, который не будет работать хорошо. Вы можете попробовать использовать вышестоящий модуль и использовать директивы для аварийного переключения, чтобы увидеть, работает ли он как хак.
Редактирование 2018 года: многое изменилось. Проверьте ответ @ohaal, чтобы получить реальную информацию об этом.
источник
server
флагresolve
для апстрима, который доступен только в коммерческой версии (см. Nginx.org/en/docs/http/ngx_http_upstream_module.html#server )Принятый ответ не работал для меня на nginx / 1.4.2.
Использование переменной приводит к
proxy_pass
повторному разрешению имен DNS, потому что NGINX обрабатывает переменные иначе, чем в статической конфигурации. Из документации NGINXproxy_pass
:Например:
Примечание: распознаватель (т. Е. Используемый сервер имен) ДОЛЖЕН быть доступен и настроен для его работы (и записи в
/etc/hosts
файле не будут использоваться при поиске).По умолчанию версия 1.1.9 или более поздние версии кэша NGINX отвечают, используя значение ответа TTL и необязательный
valid
параметр, позволяющий переопределить время кэширования:До версии 1.1.9 настройка времени кэширования была невозможна, и nginx всегда кэшировал ответы продолжительностью 5 минут. ,
источник
In such setup ip address of "foo.example.com" will be looked up dynamically and result will be cached for 5 minutes.
Я добавил это к ответу для ясности.set
внутренняя частьlocation
не работает должным образом. ОсторожноBy default, nginx caches answers using the TTL value of a response. An optional valid parameter allows overriding it: resolver 127.0.0.1 [::1]:5353 valid=30s;
resolver 127.0.0.11 [::1]:5353 valid=15s;
В комментариях гансбреста и устных ответах содержится ценная информация.
Но я думаю, что важно упомянуть об этой официальной статье nginx, опубликованной в 2016 году, в которой четко объясняется поведение nginx по этому вопросу и возможные решения: https://www.nginx.com/blog/dns-service-discovery-nginx-plus /
Нам действительно нужно «установить имя домена в переменной» и использовать директиву resolver .
однако использование переменной изменяет поведение при перезаписи. Возможно, вам придется использовать директиву rewrite, это зависит от вашего местоположения и настройки proxy_pass.
PS: хотел бы оставить комментарий, но пока недостаточно очков ...
источник
Ответ ohaal переносит большинство из нас туда, но есть случай, когда DNS-распознаватель не живет по адресу 127.0.0.1 (например, когда вы находитесь в специальной контейнерной среде)
В этом случае вы можете изменить nginx conf на
resolver ${DNS_SERVER};
. Затем, прежде чем запустить nginx, запуститеисточник
Я взломал скрипт, который следит за тем, как папка conf.d направляет изменения dns, и перезагружает nginx при обнаружении. Это первый проход, и, безусловно, его можно улучшить (на следующем проходе я буду использовать nginx -T для конкретного анализа исходящих потоков. Та же идея может быть использована для директив proxy_pass):
источник