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协议)。