LINUX.ORG.RU

Nginxопроблемы

 ,


0

1

Есть некий докер-композ, в котором есть с десяток сервисов, из них часть которых это фронты. Зачастую, разработчику API фронты вообще не нужны, потому для сохранения возможности запуска nginx без части upstream-ов было сделано следующее:

    set $call_center_frontend_host "http://call-center-frontend:80";

    location / {
        proxy_pass $call_center_frontend_host;
    }

Но в таком случае появляется новая проблема – IP резолвится один раз, и если адрес контейнера меняется по какой-нибудь причине, то приходится перезапускать контейнер с nginx, что в общем-то в некоторых случаях может бесить.

Вопрос: а можно ли заставить nginx не падать, если какие-нибудь контейнеры не резолвятся в proxy_pass, при этом всём не напарываясь на какие-нибудь проблемы? Ну и это, выкидывать nginx в пользу какого-нибудь caddy или что там ещё сейчас любят не варинат, пока что на проде nginx и скорее всего он там будет ещё оч долго.


IP резолвится один раз, и если адрес контейнера меняется по какой-нибудь причине, то приходится перезапускать контейнер с nginx

resolver 127.0.0.11 valid=10s;

Где 10s - таймаут времени отрезолвленных записей

Pinkbyte ★★★★★
()

Пинкбайт дело говорит, компоуз свой резолвинг поднимает и контейнеры по имени сервисов могут общаться.
Но почему на всём, кроме Nginx, это работает без шаманства с ручным указанием резолвера я не знать

zolden ★★★★★
()
Ответ на: комментарий от Pinkbyte

Спасибо, попробую. Но сказать помогло или нет смогу только позже.

u0000
() автор топика
Ответ на: комментарий от zolden

Nginx по умолчанию по разному резолвер использует.

Если как у ТСа через

set $variable "http://backend:port";
proxy_pass $variable;
- то запись перезапрашивается ровно по истечению TTL, пришедшего от сервера. Но ТОЛЬКО если в конфиге указан параметр resolver, системный резолвер nginx использовать почему-то не хочет.

Есть еще те, кто настраивают DNS по древним методичкам и у них там TTL сутки стоит. Какой TTL отдаёт docker-овский DNS - я даже проверять не стал, с дефолтными настройками он меня не устраивал.

А вот если настраивать сразу, без переменной:

proxy_pass "http://backend:port";

то оно мало того, что резолвится строго ОДИН раз(и тут почему-то прекрасно работает системный резолвер, удивительно прям) при старте nginx(ну может еще при перечитывании конфига, тут не проверял), так еще и если адрес хотя бы одного backend не резолвится вообще - то nginx не стартует с соответсвующей ошибкой в логах :-)

Пока nginx стартует позже всех сервисов - это можно и не заметить, но рано или поздно эту особенность конфигурации придется осознать, принять и сделать всё правильно.

Pinkbyte ★★★★★
()
Последнее исправление: Pinkbyte (всего исправлений: 1)
Ответ на: комментарий от Pinkbyte

А я даже и не знал, я почему-то был уверен, что на каждый запрос делается резолв. Наверное, где-то в доке это всё-таки написано было, но я даже не видел. А фикс помог, да. Спасибо ещё раз.

u0000
() автор топика
Ответ на: комментарий от u0000

Без проблем, я когда с этим первый раз столкнулся сам был удивлен как тем фактом, что использование переменной МЕНЯЕТ логику работы, так и фактом того, что нужно ОТДЕЛЬНО настроить резолвер, потому что системный не всегда берется.

Pinkbyte ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.