NGINX反向代理导致部分页面出现502错误

NGINX Reverse Proxy Causes 502 Errors On Some Pages

我在 Ubuntu 服务器上有一个 Node.js/Express 应用程序 运行。它位于 NGINX 反向代理之后,将端口 80(或 443 用于 ssl)上的流量传递到应用程序的端口。

我最近遇到了一个问题,在没有明确原因的情况下,尝试访问 / 的流量最终会出现 504 错误和超时。作为测试,我增加了超时时间,现在收到 502 错误。我可以在我的应用程序上访问其他一些路由,例如 /login,没有问题。

当我重新启动我的 Express 应用程序时,我的应用程序运行正常,没有任何问题,通常会持续几天,直到再次发生这种情况。查看我的 Express 应用程序的日志,一个好的请求类似于:

GET / 200 15.786 ms - 1214

而未正确响应的请求如下所示:

GET / - - ms - -

此应用程序已经 运行 正常运行了大约 13 个月,没有任何问题,这个问题是在没有提示的情况下出现的。在这发生的时间内我没有推送任何更新。

这是我的 NGINX 配置(为了安全性做了一些修改,例如 example.com

upstream site_upstream {
    server 127.0.0.1:3000;
}

server {
    listen 80;
    listen 443 ssl;

    server_name example.com;
    ssl_certificate /etc/nginx/ssl/nginx.crt;
    ssl_certificate_key /etc/nginx/ssl/nginx.key;

    location / {
        proxy_pass http://site_upstream;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
        proxy_redirect http://rpa_upstream https://example.com;
    }
}

我不确定这是我的 NGINX 配置问题还是我的应用程序本身的问题,因为我的配置都没有改变。

这听起来像是 nginx 或您的 Node 应用程序中的内存泄漏。如果它在重新启动您的 Node 应用程序后再次开始工作,但 没有 重新启动 nginx 那么这似乎是您的 Node 应用程序的问题。

也尝试在没有代理的情况下直接访问您的应用程序,看看在这种情况下您遇到了什么问题。有时,您可以通过浏览器的开发人员工具或命令行工具(如 curl)或基准测试(如 Apache ab)以这种方式获得更详细的信息。 运行 具有 ab 的重基准测试可以帮助您更快地发现问题,而不是等待。

当然,当您不显示任何代码时,很难说出到底是什么问题。

如果之前它运行良好,并且在此期间您没有升级任何东西(您的应用程序、任何 Node 模块或 Node 本身),那么您的流量可能略有增加,现在您开始看到问题之前没有表现出来。或者,也许您的系统现在使用更多 RAM 来执行其他任务,并且内存泄漏开始成为问题的速度比以前更快。

您可以开始定期记录 process.memoryUsage() 返回的数据,看看是否有问题。

还可以使用 pstophtop 或其他命令监控您的 Node 进程,或者查看内存使用情况 /proc/PID/status

您还可以定期监控 /proc/meminfo,看看系统中使用的总内存是否与应用程序无响应有关。

另一件可能导致问题的事情是,例如,如果您没有在应用程序内部处理错误和超时,那么连接到您的数据库响应缓慢或根本没有响应。添加更广泛的日志记录(进入每个路由处理程序的一行,每个 I/O 操作开始之前的一行 在每个 I/O 操作成功或失败或超时之后)应该会让你更深入地了解它。