Nginx与websocket和socket-io的负载均衡

background

前言

在之前写过使用socketio来实时向用户推送站内信springboot使用netty-socketio推送消息, 在前天上线时遇到了一个问题,后端在生产上启动了,消息也能启动,但是前段页面是直接请求的IP加端口号, 而这个端口是不对外开放的,只能走Nginx;也就是前端需要通过Nginx来转发到后端;最后还得自己去配置Nginx;

正文

Nginx安装

这个就不需要安装,直接去Nginx官网下载对应系统的压缩包;Nginx官网;我的版本是nginx-1.12.2;下载下来是一个压缩包,只需要解压就行了,不用安装;这里需要知道几个命令就行了;

  • nginx.exe -s quit 退出
  • nginx.exe -s reload 重新加载(重启)这个用得比较多,修改配置就用到这个命令
  • nginx.exe -s stop 停止
  • start nginx.exe 启动

Nginx配置socket-io负载均衡

先说自己的情况:前端使用Vue框架,且socketio采用的三方插件; 我的配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

http {
    upstream websocket {
        server 192.168.1.16:9099 weight=1;
        server 192.168.1.16:9999 weight=1;
        ip_hash;
    }
    server {
        listen       8080;
        server_name 192.168.1.16;
        location /socket.io/ {
            proxy_pass http://websocket;

            proxy_set_header Host $host;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";
        }
    }
}

由于前端每次请求的路径都会附带socket.io,所以我这里配置的是转发socket.io的路径,而且还要注意的是我在后边是加了/的;

Nginx配置websocket负载均衡

配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
http {
    upstream websocket {
        server 192.168.1.16:9099 weight=1;
        server 192.168.1.16:9999 weight=1;
    }
    server {
        listen       8080;
        server_name 192.168.1.16;
        
        location /socket {
            proxy_pass http://websocket/;

            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_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";
        }
    }
}

注意

  1. socketio的upstream中多了一个ip_hash;,如果没有在里面加这个字段,前后端的连接就会变成短连接,连上就断,断了就连接,反反复复;具体的原因还未搞清楚;
  2. 两者的路径配置,其中socketio的请求路径后加了/,转发路径末尾未添加/;websocket的请求路径末尾未添加/,但是转发路径末尾添加了/
  3. 严格注意Nginx的路径配置;
坚持原创技术分享,您的支持将鼓励我继续创作!