Рейтинг:3

Nginx не всегда обслуживает js и css при балансировке нагрузки между контейнерами докеров — работает при обновлении

флаг us

У меня есть Nginx, настроенный как обратный прокси-сервер, балансирующий нагрузку между двумя контейнерами докеров, работающими на одном сервере. При первой загрузке страницы страница загружается, но я получаю много ошибок 404 для всех файлов css и js:

404 ошибки при загрузке страницы

При обновлении или открытии второй вкладки все эти ошибки исчезают и страница загружается нормально. Когда я уменьшаю это до обслуживания только одного контейнера, он также работает нормально.

Сначала я думал, что это связано с тем, что js и css запрашивались с одного и того же корневого URL-адреса, а некоторые аспекты балансировщиков нагрузки и контейнеров выдавали ошибки, поскольку кластер запросов для одного пользователя был сбалансирован между двумя серверами. Немного поэкспериментировав, я попытался использовать proxy_set_header Хост $host (смотрящий здесь и здесь для ответов) - насколько я понимаю, это должно отправлять последующие запросы одного пользователя на один и тот же вышестоящий сервер. Это, казалось, сделало проблему более редкой, но не устранило ее полностью.

Мои оставшиеся вопросы (от обучающегося любителя!):

  • Это правильное использование proxy_set_header, и возможно ли, таким образом, обслуживать js/css с одного и того же вышестоящего сервера одному пользователю, а не распределять нагрузку между этими относительно небольшими запросами между двумя серверами?
  • Является ли это вероятным корнем проблемы, что второй контейнер должен отвечать на некоторые запросы, вызванные загрузкой страницы для первого контейнера, эти ответы каким-то образом не совпадают?
  • Моя пользовательская база будет состоять из 100-200 пользователей, одновременно получающих доступ к удаленному URL-адресу из одного места. я не думаю ip_hash будет ли тогда работать, поскольку все запросы будут поступать с одного и того же IP? Есть ли другие способы более эффективно привязать одного пользователя к одному серверу?

Мой файл конфигурации nginx:

восходящий сервер {
        наименьшее_соединение;
        локальный хост сервера: 4000;
        локальный хост сервера: 4001;
}

сервер {
        слушать 80;
        слушать [::]:80;

        имя_сервера хххххххххх;

        место расположения / {
                прокси_пасс http://бэкэнд;
                proxy_redirect http://backend/ $scheme://$host/;
                прокси_http_версия 1.1;
                proxy_set_header Обновить $http_upgrade;
                proxy_set_header Хост $host;
                proxy_set_header Соединение $connection_upgrade;
                proxy_read_timeout 20 дней;
                прокси_буферизация выключена;
        }
}
флаг ru
Посмотрите логи для nginx. Похоже, 404 — это не ответ nginx, а ответ бэкенда.
Andy Baxter avatar
флаг us
Спасибо за это. Да, похоже, что запрос отправляется вверх по течению в порядке, но сервер контейнера докеров не справляется с ответом. Теперь я попробовал `ip_hash`, чтобы добавить постоянство на каждый сервер, и при тестировании с двух IP-адресов я получаю отличные ответы от обоих. Просто кажется, что когда одно устройство последовательно отправляет запросы на оба, возникают проблемы.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.