【问题标题】:How do I fix this NGINX 502 Bad Gateway error?如何修复此 NGINX 502 Bad Gateway 错误?
【发布时间】:2020-07-31 10:20:27
【问题描述】:

我正在使用 Angular 应用程序中的网络套接字。我让它通过 nginx 连接到 python 后端。我发现大约 90% 的时间我都会收到 502“错误网关”错误。我会这样做:

  1. 在浏览器中加载页面并连接网络套接字
  2. Python 后端向 Angular 前端发送数据
  3. 断开网络套接字
  4. 尝试重新连接 Web 套接字
  5. Chrome 中的硬重新加载
  6. 在浏览器中加载页面并连接 web socket

我不知道为什么会这样。我不知道为什么会收到 502 错误。我也无法弄清楚为什么进行硬重新加载可以解决问题。我尝试过的事情:

  • 增加 nginx 日志级别以进行调试。日志仍然没有任何有用的信息。
  • 我没有保持任何网络套接字对象的状态。我这样做是为了以防某处缓存了某些东西。
  • 我总是用关闭代码 1000 关闭 Web 套接字
  • 我在服务器上手动运行python服务,以便可以观看。当 502 错误发生时,服务不会显示任何异常。
  • 将 nginx max_fails 设置为 0。将 fail_timeout 设置为 0。这些更改似乎都没有任何效果。 (我在其他 SO 答案中发现了这个建议)

我应该寻找什么来帮助我解决这个问题?

编辑:这是我的 nginx conf.d 文件:

server {
  listen  80;

  index index.html;
  root /var/www/mysite;

  location / {
    access_log  /var/log/nginx/mysite/ui.access.log;
    error_log /var/log/nginx/mysite/ui.error.log;
    try_files $uri $uri/ /index.html;
  }

  location /ws/ {
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "Upgrade";
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_http_version 1.1;
    proxy_set_header Host $proxy_host;
    proxy_pass http://WEBSOCKET/;
    access_log  /var/log/nginx/mysite/ws_services.access.log;
    error_log /var/log/nginx/mysite/ws_services.error.log;
    proxy_read_timeout 300s;
  }
}

upstream WEBSOCKET {
    ip_hash;
    server 127.0.0.1:8765;
}

【问题讨论】:

  • Python 服务的堆栈是什么? Python 端的框架和运行它的应用服务器?
  • 它是 CentOS Linux 上的 Python 3.6。我只导入标准的 websockets 库。我实际上是手动运行命令,尽管我通常将它作为守护进程运行。这是你的意思吗?
  • Python 标准库中没有提供 websockets 的模块。您必须在此处提供一些(最好是最少的)代码。
  • @AKX 我的 requirements.txt 文件中有这一行 websockets==8.0.1 我将包含我的 nginx 代码作为对我的问题的编辑
  • 哪个应用服务器正在运行您的应用? (监听 8765 端口的进程。)

标签: nginx websocket http-status-code-502


【解决方案1】:

与 OP 遇到的问题不同,但以防万一有人遇到此问题并具有与我相同的设置:

我在 SSL 上使用 WebSockets(所以 wss:// 协议)并弹出 502,即使该配置之前已经工作过。配置如下:

...
proxy_pass http://127.0.0.1:8080;
...

在后端,我使用带有 ws 包的节点来创建 websocket 服务器

正如我所说:它之前工作,但突然停止工作。此外,nginx 将upstream prematurely closed connection while reading response header from upstream 错误写入错误日志。我想 nginx 或 node 关闭了某种安全问题,导致设置不再工作。

为了使它工作,我必须做的是使用 https 而不是 http 作为 proxy_pass 配置

...
proxy_pass https://127.0.0.1:8080;
...

【讨论】:

  • 我遇到了完全相同的问题并尝试了您的解决方案。在此过程中,我注意到另一个导致容器相对频繁地重启自身的错误。在解决了这个问题之后,我为了好玩从 HTTPS 切换回了 HTTP。你瞧:问题消失了。
猜你喜欢
  • 1970-01-01
  • 2018-04-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-04
  • 2021-04-07
  • 2018-11-12
  • 2019-09-05
相关资源
最近更新 更多