Nginx + Node.js + WebSockets的问题

时间:2018-08-21 21:42:00

标签: node.js nginx websocket

我具有以下nginx配置,以便在nginx反向代理后面通过websocket运行node.js:

worker_processes 1;

events {
  worker_connections 1024;
}

http {
  include mime.types;
  default_type application/octet-stream;

  sendfile on;
  gzip on;

  upstream nodejsserver {
    server 127.0.0.1:3456;
  }

  server {
    listen 443 ssl;
    server_name myserver.com;

    error_log /var/log/nginx/myserver.com-error.log;
    ssl_certificate /etc/ssl/myserver.com.crt;
    ssl_certificate_key /etc/ssl/myserver.com.key;

    location / {
      proxy_pass https://nodejsserver;
      proxy_http_version 1.1;
      proxy_set_header Upgrade $http_upgrade;
      proxy_set_header Connection "upgrade";
      proxy_read_timeout 36000s;
    }
  }
}

node.js服务器使用与nginx配置中指定的证书相同的证书。

我的问题是,在我的浏览器中(Firefox,尽管在其他浏览器中也会发生此问题),我的websocket连接每隔几分钟就会用1006代码重置一次。我已经研究了在这个特定(或相似)星座中发生此错误的原因,并且此处以及其他资源上的大多数答案都指向proxy_read_timeout nginx配置变量未设置或设置得太低。但这不是我的配置。

值得一提的是,当我运行node.js并直接访问它时,在本地和服务器上都不会遇到这些断开连接。

此外,我尝试不安全地运行nginx和node.js(端口80),并在客户端中访问ws://而不是wss://。问题依旧。

1 个答案:

答案 0 :(得分:0)

要使连接保持活动状态,您需要做一些事情。

您应该建立一个保持活动状态的connection count per worker proccess,并且文档指出您还需要明确说明您的协议。除此之外,您可能还会遇到其他类型的超时,因此请编辑上游和服务器块:

upstream nodejsserver {
  server 127.0.0.1:3456;
  keepalive 32;
}

server {
  #Stuff...
  location / {
    #Stuff...
    # Your time can be different for each timeout, you just need to tune into your application's needs
    proxy_read_timeout 36000s; 
    proxy_connect_timeout 36000s;
    proxy_send_timeout 36000s;
    send_timeout 36000s; # This is stupid, try a smaller number
  }
}

SO中有许多关于同一主题check this answer out

的其他讨论