socket.io服务多节点(负载均衡)和反向代理部署方案 (1)使用nginx做长连接服务(websocket、socket.io)的负载均衡 (2)使用nginx做长连接服务(websocket、socket.io)的反向代理 技术方案的详细说明

(2)使用nginx做长连接服务(websocket、socket.io)的反向代理

(3)通过ip_hash的均衡策略保证长连接服务(websocket、socket.io)的正常访问。

为提高用户的访问效率,生产环境需要部署至少两台socket.io服务,那么就需要保证长连接的请求正常。

(1)服务性能可通过水平拓展节点来提高

(2)保证了长连接的正常访问

 

3、成效说明

(1)提高了服务的性能,缓解高并发下单节点响应速度慢的问题。

(2)提高了服务的可用性,当其中一个服务宕机时,另外至少一个服务正常运行中,可保证用户的继续使用。

(3)提高了服务的稳定性,当流量飙升时,可以通过水平拓展服务节点来保证服务的稳定,避免宕机。

 

 

技术方案的详细说明

1、技术说明

架构图如下所示:

socket.io服务多节点(负载均衡)和反向代理部署方案
(1)使用nginx做长连接服务(websocket、socket.io)的负载均衡
(2)使用nginx做长连接服务(websocket、socket.io)的反向代理
技术方案的详细说明

 

 

nginx配置文件内容:

upstream collaboration_servers {
      ip_hash;
      server 172.24.126.2:3000;
      server 172.24.126.2:3001;
      server 172.24.126.2:3002;
      server 172.24.126.2:3003;
    }

    server
    {
        listen 3333;
        server_name collaboration.com;
        location /socket.io/ {
            proxy_pass              http://collaboration_servers;
            # WebScoket Support
            proxy_http_version      1.1;
            proxy_set_header        Upgrade $http_upgrade;
            proxy_set_header        Connection "upgrade";

            proxy_set_header        Host $host;
            proxy_set_header        X-Real-IP       $remote_addr;
            proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
            
            proxy_connect_timeout   900;
            proxy_send_timeout      900;
            proxy_read_timeout      900;
            proxy_buffer_size       128k;
            proxy_buffers           4       256k;
            proxy_busy_buffers_size         256k;
            proxy_temp_file_write_size      256k;
        }
        access_log /var/log/nginx/collaborationserverLog.log main;
    }

 

 

2、难点说明 

使用nginx做负载均衡后,测试时发现长连接经常断开,导致游戏流程无法继续。

经过查看,是由于长连接都是有状态的,每个长连接都会有一个固定的id,要保证这个id的连接一直稳定访问同一台服务器实例,否则会出现不断登录登出的问题。

那么就需要让Nginx实现让同一个用户访问同一个服务。

经过对nginx负载策略的资料查阅,经过测试后确认,可以使用ip_hash的方式进行负载均衡。

通过配置Nginx的均衡策略为ip_hash来解决:

ip_hash介绍:

Specifies that a group should use a load balancing method where requests are distributed between servers based on client IP addresses. The first three octets of the client IPv4 address, or the entire IPv6 address, are used as a hashing key. The method ensures that requests from the same client will always be passed to the same server except when this server is unavailable. In the latter case client requests will be passed to another server. Most probably, it will always be the same server as well.

译文:指定一个组应该使用负载平衡方法,其中请求基于客户端IP地址分布在服务器之间。客户端IPv4地址的前三个八进制数,或者整个IPv6地址,用作一个散列键。该方法确保来自同一客户端的请求将始终传递到同一服务器,除非该服务器不可用时。在后一种情况下,客户机请求将被传递到另一个服务器。最可能的情况是,它也将始终是同一台服务器。

 

 

ip_hash是以client_ip作为key进行hash的一个负载均衡算法,保证了同一个client_ip可以一直访问到同一个服务器,适合有状态请求。

解决了上述长连接无法稳定访问一个服务的问题。

 

collaboration长连接服务分流效果:

socket.io服务多节点(负载均衡)和反向代理部署方案
(1)使用nginx做长连接服务(websocket、socket.io)的负载均衡
(2)使用nginx做长连接服务(websocket、socket.io)的反向代理
技术方案的详细说明