
Tentei perguntar no StackOverflow sem sucesso, então espero que esta comunidade possa me ajudar a rastrear esse problema. Temos um aplicativo web que muitas pessoas na empresa precisam acessar. Ocasionalmente, o aplicativo da web parece parar de responder às solicitações.
Por exemplo, se uma página de índice de recursos (por exemplo, tabela de pedidos) tentar atualizar a lista de recursos durante uma interrupção, ela solicitará os dados por meio de uma API, mas a solicitação acabará falhando silenciosamente após um tempo. O aplicativo se torna inacessível com solicitações duradouras para quase todos na empresa ao mesmo tempo por vários minutos de cada vez, mas acessar o aplicativo durante esse período de interrupção/lentidão de outra rede (por exemplo, dados móveis) funciona. Outros sites também não parecem ser afetados durante este período.
A guia de rede do navegador mostra que as solicitações falharam após 20-40 anos, mas não há código de status. O texto de status quando a solicitação é selecionada é net::ERR_CONNECTION_TIMED_OUT com falha. Parece que quando você não clica na solicitação enquanto ela está sendo processada e abre os detalhes mais tarde, a guia de tempo dirá que ela travou na fase Paralisada. Mas se você abrir os detalhes da solicitação enquanto ela estiver sendo processada, ele dirá que ficou preso na fase de conexão inicial. Isso faz com que a guia de tempo dos detalhes da solicitação pareça não confiável, pois o que ela mostra parece depender de eu estar inspecionando a solicitação no momento em que ela estava sendo processada ou não.
Configuração do servidor:
O servidor não parece mostrar grande sobrecarga durante esse período - máximo de 30% de uso de CPU/memória. O servidor está rodando em um droplet Digital Ocean e usando nginx para hospedar o aplicativo Laravel.
O que considerei/tentei: As conexões da empresa vêm do mesmo IP. Mas, embora o aplicativo em si tenha a limitação ativada, ele está vinculado ao ID do usuário, retorna uma mensagem de erro “Muitas tentativas” e o código de status 429. Se este for um caso de limitação, não deverá ser no nível do aplicativo porque a limitação é reconhecível pela mensagem de erro e pelo código de status.
Tentei inspecionar as configurações do nginx para encontrar qualquer limitação habilitada, mas ela não parece estar explicitamente habilitada, a menos que o nginx imponha algum tipo de padrão. Mas mesmo se habilitado, o nginx também deve retornar 429/503, pelo que entendi pelo que li. Mas no nosso caso parece que nenhum erro ou código foi retornado.
Tentei entrar em contato com a DigitalOcean e o ISP da empresa e ambos afirmam não estar usando nenhum tipo de mecanismo de limitação/limitação de taxa. O administrador da rede da empresa também afirma que não existe tal mecanismo em execução.
O que posso fazer para depurar/investigar a origem do problema? Pelo que entendi, o problema pode estar em qualquer lugar, desde a configuração do nginx até a limitação do provedor do ISP. Estou pensando que isso é algum tipo de limitação no momento, mas poderia estar faltando alguma coisa.
Responder1
Utilize ferramentas de diagnóstico para identificar gargalos ou erros em diversas partes da sua infraestrutura (nginx, Digital Ocean, rede interna). Registre dados durante a interrupção para analisar posteriormente.
# nginx logs
tail -f /var/log/nginx/access.log
tail -f /var/log/nginx/error.log
# Network diagnostics (replace x.x.x.x with server IP)
traceroute x.x.x.x
mtr --report --report-cycles=10 x.x.x.x
# Laravel logs
tail -f /path/to/laravel/storage/logs/laravel.log
# Digital Ocean droplet metrics
# Check droplet metrics via Digital Ocean dashboard
Isso o ajudará a identificar se o problema está na configuração do nginx, no droplet do Digital Ocean, na rede interna ou em outro lugar. Logs e diagnósticos de rede podem fornecer pistas.
Responder ao comentário
• Para inspecionar se há alguma regra de modelagem ou limitação de tráfego aplicada usando o tc
comando, que possa estar influenciando o fluxo do tráfego de rede:
# Display all the traffic control (qdisc) settings on all interfaces:
tc qdisc show dev [interface-name]
# Example for eth0 interface:
tc qdisc show dev eth0
Se houver regras específicas de controle de tráfego aplicadas, elas serão listadas aqui. Eles podem ser analisados posteriormente para determinar se estão contribuindo para os tempos limite relatados.