多节点直连网络配置

如果每个节点都有公网IP地址还有一个NG入口就是多节点直连,还有中情况是只有一个节点,而且和入口(NG)是分开的,这种情况也算是多节点直连。多节点和单入口的区别就是,客户端是直接连到对应节点还是统一通过NG中转。

1. 配置文件修改

修改IM服务配置文件wildfirechat.conf,其中server.ip配置为对应节点的公网IP地址。端口配置保持默认既可以。如果有Web客户端,需要打开websocket_port的配置。

2. 域名解析

如果授权地址为域名,需要把授权地址域名解析到NG公网地址。

3. NG配置

NG的地址为授权地址,NG需要负载到每个节点的80端口,可以参考专业版IM服务软件包下nginx目录下的imserver.conf文件。

upstream imserver_cluster  {
    server 192.168.2.5;
    server 192.168.2.11;
    server 192.168.2.15;
}

server {
    listen 80;
    server_name  im.wildfirechat.cn;

    root   html;
    index  index.html index.htm index.php;

    proxy_connect_timeout 10s;

    location /route {
        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_pass  http://imserver_cluster;
    }

    location /api {
        proxy_pass  http://imserver_cluster;
    }

    location /im {
        add_header Access-Control-Allow-Origin *;
        add_header Access-Control-Allow-Methods 'POST, OPTIONS';
        add_header Access-Control-Allow-Headers 'p,cid,DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization';

        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_pass  http://imserver_cluster;
        if ($request_method = 'OPTIONS') {
            return 204;
        }
    }

    location /fs {
        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_pass  http://imserver_cluster;
    }

    location /robot {
        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_pass  http://imserver_cluster;
    }

    location /channel {
        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_pass  http://imserver_cluster;
    }
}

如果有Web客户端,且使用HTTPS,还需要在NG加上HTTPS的处理,参考配置如下:

server {
    listen 443 ssl;
    server_name im.wildfirechat.cn;

    proxy_connect_timeout 10s;
    root html;
    index index.html index.htm;
    ssl_certificate   cert/a.pem;
    ssl_certificate_key  cert/a.key;
    ssl_session_timeout 5m;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_prefer_server_ciphers on;

      location /route {
            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_pass  http://imserver_cluster;
      }

      location /api {
            proxy_pass  http://imserver_cluster;
      }

    location /im {
        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_pass  http://imserver_cluster;
    }

      location /fs {
            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_pass  http://imserver_cluster;
      }

    location /robot {
        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_pass  http://imserver_cluster;
    }

    location /channel {
        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_pass  http://imserver_cluster;
    }
}

4. 防火墙

NG放开80端口的入访权限,每个节点的防火墙放开80,1883的入访权限。

如果有web客户端:

  1. 如果Web客户端只支持HTTP,还需要开放每个节点的8083端口。
  2. 如果Web客户端支持HTTPS,还需要NG放开443端口的入访权限。放开NG的每个节点的WSS端口权限(下面会讲),不用放开8083端口。

5. Web HTTPS的处理

如果需要支持HTTPS的JS客户端,还需要额外的配置。首先需要为每个节点分配一个WS和WSS的端口,比如节点1为5017&5020,节点2为5018&5021,节点3为5019&5022依次类推(此处为举例,可以更换为其他端口,不能端口重复)。

然后把每个节点IM服务配置文件中的websocket_proxy_host打开,配置为授权地址,每个节点的websocket_proxy_portwebsocket_proxy_secure_port分别配置为对应端口。

NG需要支持Websocket的代理,需要在nginx.conf文件的http区域添加map代码块

http {
    map $http_upgrade $connection_upgrade {
        default upgrade;
        '' close;
    }
}

然后添加每个节点的ws和wss代理,比如节点1的端口是5017和5202,代理配置为:

upstream ws_node1  {
    server 192.168.2.5:8083;
}

server {
    listen 5017;
    server_name  im.wildfirechat.cn;

    root   html;
    index  index.html index.htm index.php;


    location / {
        proxy_pass http://ws_node1;
        proxy_read_timeout 600s;

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

server {
    listen 5020 ssl;
    server_name im.wildfirechat.cn;

    root html;
    index index.html index.htm;
    ssl_certificate   cert/a.pem;
    ssl_certificate_key  cert/a.key;
    ssl_session_timeout 5m;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_prefer_server_ciphers on;

    location / {
        proxy_pass http://ws_node1;
        proxy_read_timeout 600s;

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

参考节点1的配置,依次添加其他节点,不能有遗漏。

可以参考专业版IM服务软件包下nginx目录下的proxy目录。

6. 验证

所有操作都在外网进行,检查是否可以从外网连入。

6.1. 检查路由

浏览器打开http://授权地址/api/version 看看是否返回json。

6.2. 检查HTTP

针对每个节点,浏览器打开http://节点的公网IP/api/version 看看是否返回json。把所有节点都检查一遍。

6.3. 检查TCP

针对每个节点,使用命令:telnet 节点的公网IP 1883看看是否能够连上,所有节点都检查一遍。

6.4. 检查Web

如果有web客户端,可以用http://docs.wildfirechat.cn/web/wstool/index.html这个连接检查一下websocket。如果是HTTP的站点,每个节点地址为ws://websocket_proxy_host:websocket_proxy_port;如果站点是HTTPS的,地址为wss://websocket_proxy_host:websocket_proxy_secure_port。需要把所有节点都检查一遍。

如果站点是HTTPS的,还需要验证HTTPS的路由是否正确,浏览器打开地址https://授权地址/api/version 看看是否返回json.

powered by GitbookFile Modify: 2025-01-09 19:53:38

results matching ""

    No results matching ""