
У меня настроен Nginx как обратный прокси-балансировщик нагрузки между двумя контейнерами docker, запущенными на одном сервере. При первой загрузке страницы она загружается, но я получаю множество ошибок 404 для всех файлов css и js:
При обновлении или открытии второй вкладки все эти ошибки исчезают и страница загружается нормально. Когда я уменьшаю это до обслуживания только одного контейнера, это также работает нормально.
Сначала я думал, что это из-за того, что js и css запрашивались с одного и того же корневого URL, и какой-то аспект балансировщиков нагрузки и контейнеров выдавал ошибки, поскольку кластер запросов для одного пользователя был сбалансирован между двумя серверами. Немного поэкспериментировав, я попробовал использовать proxy_set_header Host $host
(ищуздесьиздесьдля ответов) - я понимаю, что это должно отправлять последующие запросы одного пользователя на тот же сервер верхнего уровня. Это, казалось, сделало проблему более редкой, но не устранило ее полностью.
Мои оставшиеся вопросы (от любителя!):
- Правильно ли это использование
proxy_set_header
, и возможно ли, таким образом, обслуживать js/css с одного и того же вышестоящего сервера одному пользователю, а не распределять нагрузку на эти относительно небольшие запросы по двум серверам? - Является ли это вероятным корнем проблемы, поскольку второй контейнер должен отвечать на некоторые запросы, вызванные загрузкой страницы для первого контейнера, и эти ответы каким-то образом не выстраиваются в линию?
- Моя пользовательская база будет состоять из 100-200 пользователей, одновременно получающих доступ к удаленному URL из одного места. Я не думаю, что
ip_hash
это сработает, так как все запросы будут приходить с одного IP? Есть ли другие способы более эффективной привязки одного пользователя к одному серверу?
Мой файл конфигурации nginx:
upstream backend {
least_conn;
server localhost:4000;
server localhost:4001;
}
server {
listen 80;
listen [::]:80;
server_name xxxxxxxxxx;
location / {
proxy_pass http://backend;
proxy_redirect http://backend/ $scheme://$host/;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Host $host;
proxy_set_header Connection $connection_upgrade;
proxy_read_timeout 20d;
proxy_buffering off;
}
}