Usamos uma combinação de formatos de log no nginx e no lmon para capturar coisas assim. Um formato de log NGINX como:
log_format main '$ status: $ request_time: $ upstream_response_time: $ pipe: $ body_bytes_sent $ conexão $ remote_addr $ host $ remote_user [$ time_local] "$ request" "$ http_referer" "$ http_user_agent" "$ http_x_forwarded_for" $ upstream_addr $ upstream_addr " in: $ http_cookie "'
Ele captura muitas informações úteis de diagnóstico, como o servidor upstream que tratou da solicitação, além de colocar o status na frente, para facilitar a leitura, mesmo que os logs estejam 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 logs:
http://www.bsdconsulting.no/tools/lmon-README
Isso pode ajudá-lo a ser alertado sobre um problema que está acontecendo, que é o momento mais fácil para depurá-lo.
A outra coisa que você provavelmente deve considerar se ainda não o fez é 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, poderá configurá-lo para usar outro se receber 500, ocultando a falha do usuário:
http://wiki.nginx.org/NginxHttpProxyModule#proxy_next_upstream
error_log
. Publique também seu arquivo de configuração.