刘勇虎的官方网站
网站内容包含大前端、服务器开发、Python开发、iOS开发、Android开发、网站维护等技术文章。专注于分享技术经验,职业心得体会,IT优秀文章与教程创作。
Stay hungry,Stay foolish,Stay young
前几天朋友让我帮忙部署一个mqtt服务器,要支持ssl加密的。初步了解了下mqtt协议是啥,然后选择了 mosquitto
搭建mqtt服务器。mqtt协议我就不多介绍了,百度谷歌一下一大堆资料。mosquitto说白了就是mqtt协议的一个服务端实现。
废话不多说,下面直接上我搭建的过程:
操作系统:linux。本人用的是centos7。不过centos6.5也试过,也ok。
yum install gcc -c++
yum install cmake
yum install openssl-devel //mosquitto默认支持openssl
wget http://mosquitto.org/files/source/mosquitto-1.4.4.tar.gz
tar -xzvf mosquitto-1.4.4.tar.gz
cd mosquitto-1.4.4
vim config.mk
因为我们需要websocket支持,所以找到 WITH_WEBSOCKETS 将值设置为 yes
wget http ://c-ares.haxx.se/download/c-ares-1.10.0.tar.gz
tar xvf c-ares-1.10.0.tar.gz
cd c-ares-1.10.0
./configure
make
make install
yum install libuuid-devel
6. **安装libwebcoket**
wget https://github.com/warmcat/libwebsockets/archive/v1.3-chrome37-firefox30.tar.gz
tar zxvf v1.3-chrome37-firefox30.tar.gz
cd libwebsockets-1.3-chrome37-firefox30
mkdir build; cd build;
cmake .. -DLIB_SUFFIX=64
make install
make
make install
最后程序会安装在 /etc/mosquitto 下面。
//添加路径
vim /etc/ld.so.conf.d/liblocal.conf
/usr/local/lib64
/usr/local/lib
//刷新
ldconfig
mv /etc/mosquitto/mosquitto.conf.example /etc/mosquitto/mosquitto.conf
mosquitto默认以mosquitto用户启动,可以通过配置文件修改启动用户为root。
vim /etc/mosquitto/mosquitto.conf
user root
或者 也可以添加mosquitto 用户启动程序
groupadd mosquitto
useradd -g mosquitto mosquitto
vim /etc/mosquitto/mosquitto.conf
去掉port注释,并添加以下内容
port 1883
listener 8080
protocol websockets
接着启动mosquitto
mosquitto -c /etc/mosquitto/mosquitto.conf -d
这样,我们就同时开启了1883端口支持mqtt协议,8080端口支持websocket了。
vim /etc/mosquitto/mosquitto.conf
port 1883
listener 8883
cafile /home/yangjb/apache/1_root_bundle.crt
certfile /home/yangjb/apache/2_www.qilv.group.crt
keyfile /home/yangjb/apache/3_www.qilv.group.key
listener 8080
protocol websockets
listener 8081
protocol websockets
cafile /home/yangjb/apache/1_root_bundle.crt
certfile /home/yangjb/apache/2_www.qilv.group.crt
keyfile /home/yangjb/apache/3_www.qilv.group.key
配完重启mosquitto服务器就生效了
我这边测试都通过了,但是朋友的小程序一直连不上websocket。(ws+wss都连不上)
用微信自带的websocket库连接是可以的。但是他用的是Patho.Client库连接,就是死活连不上。
后来网上找了半天,发现一篇文章。说禁用Sec-WebSocket-Protocol头就可以了。然后我配了下nginx,转发请求的时候去掉Sec-
WebSocket-Protocol头,竟然真的可以了。也不知道什么原理- -。下面附上部分主要的配置
location /mqtt {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Sec-WebSocket-Protocol mqtt;
# 这行就是去除 Sec-WebSocket-Protocol
more_clear_headers Sec-WebSocket-Protocol;
proxy_http_version 1.1;
proxy_set_header Upgrade websocket;
proxy_set_header Connection "upgrade";
proxy_set_header X-real-ip $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
}
上面的配置有个问题,就是我们正常的websockt反而连不上了。然后注解more_clear_headers Sec-WebSocket-
Protocol;这行又连上了。但是同时朋友的小程序那边又连不上了。。。
具体原因现在也没搞明白,想来可能和那个js库有关系。