为何要配置 WSS 证书
原本用 EMQX 内置的 8083 端口,就可以实现 mqtt over websocket。
例如,地址:
ws://www.sunzhongwei.com:8083/mqtt
但是,由于我又需要在微信小程序里使用 mqtt over websocket,而微信小程序只允许使用 WSS 和 HTTPS 协议。所以不得不配置证书。
WSS 与 WS 的区别
WSS 全称是 Web Socket Secure, 即 WebSocket 的加密版本。类似与 HTTPS 之于 HTTP。
WSS 与 WS 类似于 HTTPS 和 HTTP,不同之处在于是不同的通信协议,都运行在 SSL(Secure Socket Layer,安全套接层)之上。即 TCP -> SSL -> WS / HTTP.
WSS 的默认端口
- WS 的默认端口是 80。跟 HTTP 相同。
- WSS 的默认端口是 443。跟 HTTPS 相同。
我看到 EMQX 官方文档里说:
由于微信小程序 BUG,安卓真机必须使用 TLS/443 端口,否则会连接失败(即连接地址不能带端口)
所以还是不要换端口的好,就用 443 端口。
Nginx 配置
EMQX 官方推荐使用 Nginx 来做反向代理。原理是:
WebSocket 协议和 HTTP 协议虽然不同,但是 WebSocket 协议的握手和HTTP 是兼容的,它使用 HTTP 的 Upgrade 协议头将连接从 HTTP 连接升级到 WebSocket 连接。这个特性使得 WebSocket 应用程序可以很容易地应用到现有的基础设施.
因为,本身我的域名 www.sunzhongwei.com 已经通过 letsencrypt cerbot 安装了 HTTPS 证书。所以,只需要在 443 端口下加个转发规则即可:
server {
listen 443 ssl;
# ... 省略
# 添加反向代理
location /mqtt {
proxy_pass http://127.0.0.1:8083/mqtt;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# client_max_body_size 35m;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
重新加载 Nginx 配置即可:
$ sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
$ sudo nginx -s reload
参考
- https://blog.csdn.net/zl18603543572/article/details/122280758
- https://docs.emqx.com/zh/enterprise/v4.4/development/wechat-miniprogram.html
微信关注我哦 👍
我是来自山东烟台的一名开发者,有感兴趣的话题,或者软件开发需求,欢迎加微信 zhongwei 聊聊, 查看更多联系方式