小前端用了这么久WSS,还是头一次自己搭,折腾一下午才弄好,记录一下吧
后台服务用的是之前装的‘EMQX’,用于多端的Mqtt通信,这个就不多介绍了,安装方式见‘EMQX下载安装’
WS
要用websocket的话比较简单,因为EMQX提供的有ws端口,默认的8083端口,可以通过配置文件修改,改成0.0.0.0:8083
,支持外部访问,并且服务器安全组要开放8083端口
这里要提一点就是有时候修改配置文件restart不生效,后台查了一下发现是emqx有个守护进程需要关掉,正确姿势就是先stop,然后ps -aux | grep emq
找到守护进程kill掉,再start启动
前端使用的是‘MQTT’ ,因为是老项目,发现最近版本有不兼容的语法,于是找了个使用最多的老版本npm i mqtt@2.18.8 --save
1 | import { connect } from 'mqtt' |
本来到这里就以为可以愉快的结束了,部署上线之后才想起来ssl,含泪上WSS
WSS
我干的第一件事是百度了一下WSS跟https的ssl证书是用同一个,省了点事
跟上面一样,先改下WSS的8084端口,支持外部访问
然后改一下emqx配置文件,把证书配上,因为不知道是哪个所以都改了
1 | ## Path to the file containing the user's private PEM-encoded key. |
需要确保emqx是有访问权限的
然后是nginx的配置,一种方法是反向代理,如果不想把端口暴露给外部,可以配置一下代理到内部8084端口,我是单独写了个配置文件把wss端口给出来了1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18server {
listen 8084 ssl;
server_name server.com;
ssl_certificate your certfile.pem;
ssl_certificate_key your certfile.key;
location /mqtt {
proxy_redirect off;
proxy_pass http://server.com:8084;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_connect_timeout 1800s;
proxy_send_timeout 1800s;
proxy_read_timeout 1800s;
}
}
前端对接1
2
3
4
5
6
7import { connect } from 'mqtt'
// 建立连接
const client = connect('wss://xxx.com:8084/mqtt', {
username,
password
})
完结撒花