disconnet事件不会在nginx + socket.io + xhr-polling中触发

时间:2014-02-11 06:11:10

标签: javascript node.js nginx socket.io

我尝试通过nginx代理node.js,socket.io和xhr-polling流量。

然后Socket.io不会触发“disconnect”事件。

然而,波纹管状况正常。

  • 直接连接到没有nginx代理的Node.js端口。
  • 从xhr-polling切换到websocket的传输。

我的版本如下:

  • nginx:1.4.4
  • node.js:0.10.24
  • socket.io:0.9.15

我的nginx配置文件设置如下。

server {
    listen       80;
    server_name  localhost;


   location / {
        proxy_pass http://127.0.0.1:3000/;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_redirect off;

        proxy_read_timeout 300;
        proxy_connect_timeout 300;

        chunked_transfer_encoding off;
        proxy_buffering off;

        proxy_set_header    Host    $http_host;
        proxy_set_header    X-Real-IP          $remote_addr;
        proxy_set_header    X-Forwarded-Host   $host;
        proxy_set_header    X-Forwarded-Server $host;
        proxy_set_header    X-Forwarded-For    $proxy_add_x_forwarded_for;
        proxy_set_header    X-NginX-Proxy true;
   }

我该如何解决这个问题?我错过了什么吗? 在此先感谢:)


此外,我发现了出现问题的新情况。

我的问题的结果取决于以下内容。

  1. 客户端浏览器和移动设备。
  2. 代理throgh nginx(端口80)或直接访问node.js(端口3000)。
  3. 调查结果如下。

    ・ Chrome @ Mac OS X
    ・ Aquos Phone(Android Brower, Android 4.0.4)
        port 80 ⇒ NG
        port 3000 ⇒ OK
    
    ・ Gallaxy S(Android Brower, Android 4.2.2)
    ・ iPhone 5(Safari, iOS 7) 
        port 80 ⇒ NG
        port 3000 ⇒ NG
    
    • “OK”是“可以实时触发断开事件”,“NG”是“无法触发断开事件”。
    • “端口80”使用nginx,“端口3000”使用node.js。
    • Trasport仅限xhr-polling。
    • Gallaxy S和iPhone 5与websocket兼容。

1 个答案:

答案 0 :(得分:0)

您是指用户关闭浏览器或标签时的断开事件吗?如果是这样,请在连接到服务器时在客户端尝试此代码:

io.connect('/', {
  'sync disconnect on unload':  true
});

(您的配置中的第一个参数'/'可能不同)

Here您可以找到详细信息。