微信小程序使用mqtt連接及配置nginx的https

原生小程序開發中需求使用mqtt進行即使通訊,下面介紹小程序中使用mqttjs 進行網絡通訊連接 在華爲雲中部署nginx使用https/wss方式連接Apache-activemq。

1、雲服務域名

1、在雲服務中部署項目首先要有個域名,domain 映射到雲服務機子的ip,這樣訪問http://domaintest 纔會訪問到 部署服務的機子。

2、部署mqtt 服務

​ 官網下載地址:http://activemq.apache.org/activemq-5140-release.html

​ 下載 linux 版:apache-activemq-5.15.10-bin.tar.gz

2.1 部署mqtt 服務

​ 1、gz文件拷貝到linux目錄

​ 2、解壓啓動

​ 解壓 tar -zxvf apache-activemq-5.14.0-bin.tar.gz

​ 進入apache-activemq-5.15.10/bin 目錄 啓動服務 ./activemq start

​ 啓動完成 打開管理界面 http://ip:8161/admin 默認用戶名密碼 admin/admin,在管理界面中可看到服務中有哪些topic/subscriber 相關信息。

​ 3.mqtt配置文件

​ 在conf 目錄下的 activemq.xml 文件中可以 查看tcp/amqp/stomp/mqtt/ws等的mqtt 連接地址端口

<transportConnectors>
            <transportConnector name="openwire" uri="tcp://0.0.0.0:61616?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
            <transportConnector name="amqp" uri="amqp://0.0.0.0:5672?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
            <transportConnector name="stomp" uri="stomp://0.0.0.0:61613?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
            <transportConnector name="mqtt" uri="mqtt://0.0.0.0:1883?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
   <transportConnector name="ws" uri="ws://0.0.0.0:61614?		maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
</transportConnectors>

​ 4.測試部署

這裏使用node.js 進行測試。node server.js /client.js

連接mqtt的端口地址根據mqtt的配置文件選擇

server端發佈
var mqtt = require('mqtt')//nodejs 中導入mqtt包
var client  = mqtt.connect('mqtt://domaintest:1883')
client.publish('test1', '{"message":"message1"}')

client端接收messages
var mqtt = require('mqtt')
var client  = mqtt.connect('mqtt://domaintest:1883')
client.on('connect', function () {
	// 訂閱發佈的主題test1
  client.subscribe('test1', function (err) {
  })
})
client.on('message', function (topic, message) {
  // message is Buffer
  console.log(message.toString())
  client.end()
})

3.部署nginx 及配置https

3.1 nginx的部署

​ 1、ubuntu 下 命令安裝 apt install nginx

​ 安裝完成後位置 /etc/nginx

​ 2、啓動命令 systemctl start nginx.service/systemctl start nginx

​ 設置開機自啓動 systemctl enable nginx.service

​ 停止服務命令 systemctl stop nginx.service/nginx

3.2 nginx的配置

​ 這裏配置主要配置爲/etc/nginx/nginx.conf 文件

這裏配置位置爲
http{}中配置 server,這裏可以配置多個server[http、https],一個server中也可以監聽多個端口
http {
	#http server
	server { 
		listen 8080;   
    	server_name  domaintest;
	    location /mqtt {
	        proxy_set_header Host $http_host;
			proxy_pass http://localhost:61614;
		    proxy_http_version 1.1;
			proxy_read_timeout 300s; # 默認是60秒,可設置
	    }   
	}
    
    #https server 需要配置htts的證書 ,想強制跳轉https,只監聽443端口
	server {
		listen 443 ssl;#https默認監聽443端口 
		ssl on;
	    ssl_certificate /etc/letsencrypt/live/domaintest/fullchain.pem;  #配置證書 
	    ssl_certificate_key /etc/letsencrypt/live/domaintest/privkey.pem; #配置證書
	    ssl_session_timeout 5m;
	    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
	    ssl_ciphers ECDH:AESGCM:HIGH:!RC4:!DH:!MD5:!aNULL:!eNULL;
	    ssl_prefer_server_ciphers on;	
	    
	    listen       61615;
    	server_name  domaintest; #配置服務域名
    	#訪問地址對應http://domain:ip/mqtt
	    location /mqtt {
	        proxy_set_header Host $http_host;
			proxy_pass http://localhost:61614; #服務端部署的服務訪問路徑(mqtt中的配置路徑)
		    proxy_http_version 1.1;
			proxy_set_header X-Client-IP $remote_addr;
			proxy_set_header Upgrade $http_upgrade;
			proxy_set_header Connection "upgrade";
			proxy_read_timeout 300s; # 默認是60秒,可設置
	    }   
	}
    
}


3.3 生成域名domaintest的證書

通過Certbot獲取免費https證書,爲網站配置https訪問

安裝
wget https://dl.eff.org/certbot-auto

授權
chmod a+x certbot-auto
    
爲域名生成證書 主要這時將nginx服務停止
./certbot-auto certonly --standalone -d  domiantest   #domiantest爲你想要配置https的域名
或./certbot-auto certonly --standalone --email xxxmail@qq.com --agree-tos -d domiantest
安裝提示進行操作生成證書

生成後查看證書命令及證書位置
ls /etc/letsencrypt/live/ 將證書配置到https的server中
    
注意免費申請的證書時效只有90天,我們需要設置自動更新的功能,幫我們自動更新證書的時效。

crontab -e    #編輯crontab
添加腳本
30 2 * * 1 安裝目錄/certbot-auto renew --pre-hook "systemctl stop nginx" --post-hook "systemctl start nginx" >> /安裝目錄/le-renew.log 2>&1 &

4、原生微信小程序中配置mqtt連接

這裏我們首先需要將mqtt.js文件下載保持到項目中。

https://unpkg.com/[email protected]/dist/mqtt.min.js 複製保存文件爲mqtt2.18.8.min.js。

在項目中使用

var mqtt = require('../../utils/mqtt2.18.8.min.js')
/**小程序中只能用wxs://開頭請求地址
* 在調試時可以在項目開發工具 中 詳情->本地設置-> 勾選 不校驗合法域名,這樣可以方便調試。
* 當進行域名合法性校驗時,下面domaintest域名必須是該小程序對應appID的賬號下的開發中配置的域名,這樣纔不 * 會出現 不合法的域名不在服務中
*/
var client = mqtt.connect('wxs://domaintest/mqtt', {
  clientId: "clientUserId"
});
Page({
  data: {
    "exectors": []
  },
  initMqtt: function () {  
    client.on('connect', function () {
      console.log('連接成功');
      //訂閱
      client.subscribe('test1');
    })
	// 接收消息
    client.on('message', function (topic, payload) {
      console.log(payload)
    })
  },
  /**
   * 生命週期函數--監聽頁面加載
   */
  onLoad: function(options) {
    this.initMqtt()
  },
  /**
   * 生命週期函數--監聽頁面卸載
   */
  onUnload: function () {
    // 關閉連接
    client.end();
  },
  onPub:function(){
    client.publish("test2", "返回");
  } 
})
注意:
當進行域名合法性校驗時,下面domaintest域名必須是該小程序對應appID的賬號下的開發中配置的域名,這樣纔不會出現不合法的域名不在服務中的錯誤。

ion () {
// 關閉連接
client.end();
},
onPub:function(){
client.publish(“test2”, “返回”);
}
})


注意:
當進行域名合法性校驗時,下面domaintest域名必須是該小程序對應appID的賬號下的開發中配置的域名,這樣纔不會出現不合法的域名不在服務中的錯誤。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章