我负责一个重定向和拆分请求的 nginx 服务器。在我们的生产引擎上,我们运行 nginx 1.2.1,在测试机器上,我们运行 1.4.1。配置相同,但在生产环境中,我总是得到一个,500 Internal Server Error"
但在测试环境中,一切运行正常。我总是检查 Nginx 的 access.log 和 error.log。但没有什么可担心的。
我该如何分析错误并进一步调查该错误的原因?
答案1
首先要问自己:是什么发出了 500 响应。查看响应标头和页面样式会告诉您很多有关它来自何处的信息。例如,响应中是否有 X-Powered-By 标头?如果有,它就不会来自 Apache(例如)。
与 Apache 等相比,Tomcat 错误页面与 Nginx 页面看起来非常不同。这就是为什么我指导工作中的人员给我提供好的屏幕截图的原因。
此外,如果您看到 500 的日志,但错误日志中没有任何内容,那么它很可能来自后端,您应该在那里查看。
另外,为什么您的测试和生产 nginx 版本不同?您没有提到在生产中使用与测试中相同的版本。
注意不同版本软件默认行为的变化。最近我从 2.2 迁移到 Apache 2.4 时就多次想到了这一点。
最后,您说对于测试和生产来说后端是相同的(真的吗,就像在同一个实例中?),但这并不一定意味着请求将被以相同的方式处理(例如,传递不同的主机头或 SNI 服务器名称)
希望这能帮助您掌握反向代理调试。
答案2
这是我诊断错误时使用的 nginx 检查表。
使用以下方法验证你的 nginx 配置
sudo nginx -t
这是一个非常基本的步骤,但始终应该首先完成。
验证 nginx 是否正在运行
sudo service nginx status
验证您指定的日志文件地点配置
find /etc/nginx -name '*.conf' | xargs grep -i log
如果您收到 500 错误,您应该会在错误日志中看到与该错误相关的条目,该条目会提示您错误发生的原因。如果您在错误日志中没有看到错误消息,则说明错误日志配置存在问题,您需要验证错误日志文件上的时间戳以确保它正在更新。
答案3
这通常是后端错误。(CGI)或 PHP/Javascript/Java 代码崩溃。有多种选择:
i) 最常见的是,如果你检查 nginx 错误日志,你将看到崩溃代码的堆栈跟踪。
less /var/log/nginx/error.log
请注意,您的代码可以将错误消息记录到不同的日志文件,例如在 Laravel 中,它将崩溃报告到 storage/logs/laravel.log 和 /var/log/tomcat9/ 下的 tomcat 和/或 /var/log/syslog 。
ii) 有时代码本身会返回 500 内部服务器错误,例如 Wordpress,并且不会提供任何堆栈跟踪,因为它是由代码“处理”的。在这种情况下,最好的选择是搜索源代码中返回 500 的位置。一种方法是在源代码目录中使用递归 grep:
grep -r 500 .
iii) 我偶然发现了这个线程,因为 Docker Registry 前面有 nginx。Registry 报告正常,但 Nginx 在一个非常大的对象上 PATCH 返回 500。因此,也可能是 Nginx 导致了错误,我会尝试增加超时时间。
答案4
要捕获任何外部请求/错误,您可能会收到并导致 500 错误:您还可以在打开chrome://net-internals页面的“事件”菜单上。
您可以在那里分析更多外部请求/响应(DNS信息,发送的标头等)