mqtt websocket 配置实践

mqtt websocket 配置方法

(1)、如客户端使用场景为终端网络设备或APP,使用的是TCP协议的情景。

我们可以使用云产品的负载均衡来实现。

如华为云ELB
实例规格 "网络型(TCP/UDP)"
创建一个"侦听器" , 前端协议 TCP , 前端端口例如 18083 , 后端 ECS主机 TCP协议,端口 8083
可以把域名解析到该ELB IP上。
例如 ws://abc-mqtt.abc.com:18083
华为云 网络型TCP ELB不支持SSL证书的配置。

可以使用nginx的TCP四层反向代理来实现配置。

参考配置案例:

以下配置为nginx 四层反向代理, 在nginx.conf文件中平行于http{}部分增加如下配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
 stream {
 
 upstream mqtt_servers {
    server 10.8.10.195:1883;    # 1883 是 mqtt tcp侦听端口
  }

  server {
    listen 8883 ssl;               # 883 是mqtt ssl 侦听端口
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 10m;
    ssl_certificate ssl/8576915__abc.com.pem;
    ssl_certificate_key ssl/8576915__abc.com.key;
    ssl_verify_depth 2;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers HIGH:!aNULL:!MD5;

    # 添加 CA 证书及开启验证客户端证书参数即可启用双向认证
    # ssl_client_certificate /usr/local/nginx/certs/ca.pem;
    # ssl_verify_client on;
    # ssl_verify_depth 1;

    proxy_pass mqtt_servers;

    # 启用此项时,对应后端监听器也需要启用 proxy_protocol
    proxy_protocol on;
    proxy_connect_timeout 10s;  
    # 默认心跳时间为 10 分钟
    proxy_timeout 1800s;
    proxy_buffer_size 3M;
    tcp_nodelay on;
  }
}

配置好后, wss://abc-mqtt.abc.com:8883

(2)、 当需要在web网页中用到mqtt,需要用到http或https协议来调用mqtt消息的时候, 我们推荐使用nginx 的七层
反向代理来实现。
下面介绍 nginx 七层反向代理 websocket案例:
项目走的是HTTPS协议,故前端转发的是https请求到nginx代理服务器,ws协议只能直接访问后端websocket接口调用,但是不能满足前端建立websocket请求,故需要使用wss协议进行调用,wss默认端口与https一致为443端口,故可以与https使用同一套加密证书以及端口,这对后面整合wss协议提供了便利。
可以在nginx vhost 子配置文件中做如下配置(配置包含在http{}内)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
upstream testmqtt {
server 10.8.10.195:8083;
}

server {
    listen  443 ssl;
    server_name test-mqtt.abc.com;
    access_log  logs/test-mqtt-wss.access.log  main;
    error_log   logs/test-mqtt-wss_error.log   error;
        ssl_certificate ssl/8576915__abc.com.pem;
        ssl_certificate_key ssl/8576915__abc.com.key;
        ssl_session_timeout 5m;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
        ssl_prefer_server_ciphers on;

    location /mqtt {
      proxy_pass http://testmqtt;                            
      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 REMOTE-HOST $remote_addr;            
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;          
        proxy_connect_timeout 1d;
        proxy_send_timeout 1d;
        proxy_read_timeout 1d;
        tcp_nodelay on;          
        proxy_buffering off;
    }
 
 }

配置好后 可以使用 https://test-mqtt.abc.com/mqtt 来访问websocket ssl 。

附加:
七层ELB负载均衡的侦听器,如何启用WebSocket支持?
当选用HTTP监听时,默认支持无加密版本WebSocket协议 (WS协议);
当选用HTTPS监听时,默认支持加密版本的Websocket协议 (WSS协议)。

相关新闻

联系我们

全国服务热线

400-033-9553

电子邮件:admin@example.com
工作时间:09:00-17:00 周一至周五

在线客服
关注微信
关注微信
分享本页
返回顶部