Когда вы используете nginx в качестве балансировщика нагрузки для перенаправления трафика на несколько хостов, вы можете оказаться в ситуации, когда у вас есть такая конфигурация:
Предположим, что my-domain.app.local
— это запись A, сопоставленная с:
В документации nginx указано:
Доменное имя, которое разрешается в несколько IP-адресов, одновременно определяет несколько серверов.
При запуске nginx происходит следующее:
- nginx разрешает
my-domain.app.local
в свои IP-адреса. - nginx заменяет запись
my-domain.app.local
на IP-адреса.
Сейчас мы находимся в этом виртуальном состоянии:
Что это означает?
При каждом запуске/перезагрузке nginx разрешает домены, указанные в блоке upstream
, с их соответствующими IP-адресами.
Это означает, что если содержимое записи A изменится (например, появится новый IP-адрес), nginx не обнаружит это изменение. Требуется перезапустить/перезагрузить сервис (например, с sudo systemctl reload
).
Как насчет веса?
Можно определить вес для каждой записи upstream
, например:
В данном примере это означает, что из 7 запросов 5 будут переадресованы на 10.0.1.2
, а 2 — на 10.0.1.1
.
При работе с доменными именами важно учитывать предыдущее определение:
Доменное имя, которое разрешается в несколько IP-адресов, одновременно определяет несколько серверов.
Это означает, что фактический вес доменного имени зависит от количества IP-адресов, сопоставленных с этим доменом.
Вспоминая нашу первоначальную настройку, конфигурация такова:
Который будет практически преобразован в:
Это означает, что вес доменного имени на самом деле больше. В некоторых случаях может потребоваться сбалансировать этот избыточный вес, например. путем настройки весов других IP-адресов: