У меня две отдельные машины Nginx. Домен использует циклический DNS и имеет две записи A, по одной для каждого из двух внешних серверов Nginx.
Оба сервера Nginx используют ip_hash
директива и прокси-запросы к одним и тем же внутренним серверам.
Будет ли IP-адрес, который идет на первый сервер Nginx, всегда маршрутизироваться на тот же внутренний сервер, что и тот же IP-адрес, который идет на другой сервер Nginx?
Это может помочь: Какой IP-адрес использует nginx для липких сессий ip_hash?
Серверы Nginx не знают друг друга со своими собственными таблицами ip_hash. Таким образом, конкретный сервер будет направлять трафик на бэкэнд на основе своего собственного пула ip_hash. Любая согласованность между интерфейсными серверами Nginx может быть чисто случайной.
На практике это может быть меньшей проблемой, потому что DNS клиента вряд ли изменится во время сеанса. В результате они попадут на один и тот же интерфейсный сервер и будут перенаправлены на один и тот же внутренний сервер.
Другой подход к этому - использовать что-то вроде HAProxy, который может балансировать по ряду показателей, например как параметр URL. Ваше приложение может установить параметр, чтобы гарантировать, что клиент будет перенаправлен на тот же сервер. Конечно, предпочтительнее нормализовать данные через серверную часть с помощью распределенного инструмента, но с устаревшими приложениями это может быть проблематично.
Согласно документам:
Ключом для хеширования является сетевой адрес класса C или весь IPv6-адрес клиента.
Так что теоретически это должно работать.
Другая проблема, которая может возникнуть, - это отказ одного из ваших серверов. Nginx не дает никаких обещаний относительно того, какой бэкэнд клиент использует дальше.
Но да, HAProxy ftw.