
Eu tenho o Nginx configurado como um balanceamento de carga de proxy reverso entre dois contêineres docker rodando no mesmo servidor. Ao carregar uma página pela primeira vez, ela carrega, mas recebo muitos erros 404 para todos os arquivos css e js:
Ao atualizar ou abrir uma segunda aba, todos esses erros desaparecem e a página carrega corretamente. Quando reduzo isso para servir apenas um contêiner, ele funciona bem da mesma forma.
Inicialmente pensei que isso acontecia porque js e css estavam sendo solicitados a partir do mesmo URL raiz, e algum aspecto dos balanceadores de carga e contêineres estava gerando erros à medida que um cluster de solicitações para um único usuário era balanceado entre os dois servidores. Através de algumas experiências, tentei usar proxy_set_header Host $host
(olhandoaquieaquipara obter respostas) - meu entendimento seria que isso deveria enviar as solicitações subsequentes de um único usuário para o mesmo servidor upstream. Isso pareceu fazer com que o problema ocorresse mais raramente, mas não o eliminou completamente.
Minhas perguntas restantes (de um amador em aprendizagem!):
- Este é o uso correto de
proxy_set_header
e, portanto, é possível servir js/css do mesmo servidor upstream para um único usuário, em vez de balancear a carga dessas solicitações relativamente pequenas em dois servidores? - Esta é a provável raiz do problema, que com o segundo contêiner tendo que responder a algumas das solicitações solicitadas pelo carregamento da página do primeiro contêiner, essas respostas de alguma forma não estão alinhadas?
- Minha base de usuários seria de 100 a 200 usuários acessando simultaneamente um URL remoto de um único local. Eu não acho que
ip_hash
funcionaria, pois todas as solicitações viriam do mesmo IP. Existem outras maneiras de vincular com mais eficiência um único usuário a um único servidor?
Meu arquivo de configuração 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;
}
}