Более ранние версии nginx (до 1.1.4), которая уже использовала огромное количество самых посещаемых веб-сайтов по всему миру (а некоторые до сих пор работают даже в наши дни, если верить заголовкам серверов), даже не поддерживали keepalive
на стороне upstream
, потому что это очень мало выгодно в настройке центра обработки данных, если только у вас нет нетривиальной задержки между вашими различными хостами; см. https://serverfault.com/a/883019/110020 для некоторых объяснений.
По сути, если вы не знаете, что вам конкретно нужен keepalive между вашими восходящим и внешним интерфейсом, есть вероятность, что это только сделает вашу архитектуру менее устойчивой и ухудшенной.
(Обратите внимание, что ваше текущее решение также неверно, потому что изменение IP-адреса также останется незамеченным, потому что вы выполняете разрешение имени хоста только при перезагрузке конфигурации; поэтому, даже если nginx запустится, он в основном перестанет работать как только IP-адреса вышестоящих серверов меняются.)
Потенциальные решения, выберите один:
Лучшее решение, похоже, просто избавиться от upstream
keepalive
как вероятно ненужный в среде центра обработки данных, и используйте переменные с proxy_pass
для актуального разрешения DNS для каждого запроса (nginx все еще достаточно умен, чтобы выполнять кэширование таких разрешений)
Другой вариант - получить платную версию nginx через коммерческую подписку, которая имеет параметр resolve
для директивы server
в пределах upstream
контекст.
Наконец, еще одна вещь, которую можно попробовать, это использовать переменную set
и / или map
для указания серверов в upstream
; это ни подтверждено, ни опровергнуто не было выполнено; например, это может или не может работать.