Nós usamos uma combinação de formatos de log em nginx e lmon para capturar coisas como esta. Um formato de registro NGINX como:
log_format main '$status:$request_time:$upstream_response_time:$pipe:$body_bytes_sent $connection $remote_addr $host $remote_user [$time_local] "$request" "$http_referer" "$http_user_agent" "$http_x_forwarded_for" $upstream_addr $upstream_cache_status "in: $http_cookie"'
Capturará muitas informações de diagnóstico úteis, como o servidor upstream que processou a solicitação, além de colocar o status na frente para facilitar a leitura, mesmo se os registros estiverem rolando rapidamente.
Usamos o LMON para assistir a esses logs e, em seguida, nos alertar (pagers / email) se houver erros, como 500s, 503s, 400s, nos registros:
Isso pode ajudá-lo a ser alertado sobre um problema quando estiver ocorrendo, qual é o melhor momento para depurá-lo.
A outra coisa que você deve considerar, se você ainda não tiver, é que, por padrão, o nginx considera um 500 uma condição fatal e não tenta outro upstream. Se você tiver vários upstreams, você pode configurá-lo para usar outro se obtiver um 500, obscurecendo a falha do usuário: