nginx作为NodeJS + socket.io的代理:除了大消息外,一切正常

时间:2013-05-14 12:56:04

标签: node.js nginx websocket socket.io

正如nginx's website所述,我已经将这些设置用于我的nginx,以将websockets代理到NodeJS服务器:

location /socket.io/ {
    proxy_pass http://backend;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
}

一切正常,socket.emit()/ socket.on()互相发送消息;直到我发送一条相当大的短信(26 kB of html)。

  • NodeJS没有收到这条大消息(所以我猜这个问题是在nginx方面)
  • nginx日志没有错误
  • 一旦客户发送了这条大消息,NodeJS将停止从该客户端接收socket.io的心跳。

我做错了什么? 是否有我不知道的nginx设置?

2 个答案:

答案 0 :(得分:4)

找到的“解决方案”是使用haproxy在nginx和NodeJS之间拆分tcp流。

它不是最佳的,因为它在我们的堆栈中添加了另一个程序,但它完成了这项工作。

在我看来,nginx websocket支持仍远未投入生产。

答案 1 :(得分:0)

尝试在配置中添加以下内容:

proxy_buffers 8 2m;
proxy_buffer_size 10m;
proxy_busy_buffers_size 10m;

原因:proxy_buffer默认大小为4K或8K。因此,在大消息导致缓冲区溢出后,可能会丢弃这些连接。检查默认设置here,使其符合您的要求。