多节点直连网络配置
如果每个节点都有公网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客户端:
- 如果Web客户端只支持HTTP,还需要开放每个节点的8083端口。
- 如果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_port
和websocket_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.