Utilizamos una combinación de formatos de registro en nginx y lmon para capturar cosas como esta. Un 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_forwards_for" $ upstream_addr $ upstreamuscache_t en: $ http_cookie "'
Capturará una gran cantidad de información de diagnóstico útil, como el servidor ascendente que manejó la solicitud, y pondrá el estado en primer plano para que sea fácil de leer, incluso si los registros se desplazan bastante rápido.
Usamos LMON para ver estos registros y luego nos alerta (buscapersonas / correo electrónico) si ve errores, como 500, 503, 400, en los registros:
http://www.bsdconsulting.no/tools/lmon-README
Esto puede ayudarlo a ser alertado de un problema cuando está sucediendo, que es el momento más fácil para depurarlo.
La otra cosa que probablemente debería considerar si aún no lo ha hecho es que, por defecto, nginx considera que un 500 es una condición fatal y no prueba con otro flujo ascendente. Si tiene múltiples flujos ascendentes, puede configurarlo para usar otro si obtiene un 500, con la esperanza de ocultar el fallo del usuario:
http://wiki.nginx.org/NginxHttpProxyModule#proxy_next_upstream
error_log
. También publique su archivo de configuración.