我有以下nginx配置,可在nginx反向代理后面通过websockets运行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://。问题仍然相同。
最佳答案
要使连接保持活动状态,您需要做一些事情。
您应该建立一个keepalive 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的其他讨论。
关于node.js - Nginx + Node.js + WebSockets的问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51957072/