socket.io常见问题

记录使用Socket.io过程中遇到的各种问题及解决方案。

1. PM2服务器启动后,一直400,因为负载均衡导致。
1
failed: Error during WebSocket handshake: Unexpected response code: 400

可以参考官方配置。

解决方案

配合Nginx IpHash + Pm2启动多个端口app:

参考这个 :

https://github.com/socketio/socket.io/issues/1942

https://github.com/Unitech/pm2/issues/637

http://www.cnblogs.com/accordion/p/6930152.html

  • pm2配置文件,app.json:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    {
    "apps": [{
    "name": "hxdd-7101",
    "port": 7101,
    "script": "bin/www",
    "env": {
    "NODE_ENV": "production"
    },
    "args": "['-p7101','-t','plan']",
    "exec_mode": "cluster",
    "autorestart": true
    }, {
    "name": "hxdd-7102",
    "port": 7102,
    "script": "bin/www",
    "env": {
    "NODE_ENV": "production"
    },
    "args": "['-p7102','-t','plan']",
    "exec_mode": "cluster",
    "autorestart": true
    }]
    }
  • Nginx配置:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    upstream io_nodes {
       ip_hash; # 这里,可以可以根据cookie等设置,总之是让它访问同一台服务器
       server 127.0.0.1:7101;
       server 127.0.0.1:7102;
    }
          
    location ^~ /socket.io/ {
       proxy_pass  http://io_nodes;
       proxy_redirect off;
       proxy_http_version 1.1;
       proxy_set_header Upgrade $http_upgrade;
       proxy_set_header Connection "upgrade";
       proxy_set_header Host $host:$server_port;
       proxy_set_header X-Real-IP $remote_addr;
       proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }

2. 总有些数据库连接垃圾数据无法disconnect时删除

如果因为服务器网络或者重启等导致无法监听到disconnect或某些属性丢失,在线的连接无法删除。

解决方案:

设置connection的ttl属性。过期自动删除。客户端加入探测机制,ttl时间内在线的,刷新ttl时间,延长租期。