Когда вы используете 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-адресов: