国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

用 docker 部署 mosquitto 并編譯 mosquitto-auth-plug

maybe_009 / 2581人閱讀

摘要:再運(yùn)行一次它往發(fā)送了一個(gè)消息我們可以看到就已經(jīng)收到了總結(jié)我們成功地搭建了一個(gè)的消息代理服務(wù)并為它編譯了可以供后續(xù)后端消息業(yè)務(wù)的開(kāi)發(fā)詳細(xì)代碼也可以參考已經(jīng)上傳到的

mosquitto 的簡(jiǎn)介

mosquitto 是一個(gè)開(kāi)源的輕量級(jí)消息代理服務(wù), 支持 MQTT-3.1 和 MQTT-3.1.1, 采用發(fā)布訂閱模式. mosquitto 目前廣泛用于手機(jī)設(shè)備, 底端傳感器, 嵌入式計(jì)算機(jī)的消息通信, 是一個(gè)成熟的物聯(lián)網(wǎng)通信服務(wù)方案. 作為一個(gè)用 C 編寫(xiě)的應(yīng)用服務(wù), mosquiitto 項(xiàng)目同樣提供了 C library 便于 MQTT 服務(wù)的拓展, 比如有名的 mosquitto-auth-plug.

mosquitto 的部署

這里我們打算部署在 docker 容器內(nèi).

在 docker 內(nèi)構(gòu)建

參考 eclipse-mosquitto docker hub
構(gòu)建目錄 /mosquitto
目錄結(jié)構(gòu)是:

- mosquitto
    - config
        - mosquitto.conf
    - data
    - log

其中 mosquitto.conf 的內(nèi)容是:

persistence true
persistence_location /mosquitto/data/
log_dest file /mosquitto/log/mosquitto.log
在 docker 內(nèi)啟動(dòng)

啟動(dòng)命令:

$ docker run -d -p 1883:1883 -p 9001:9001 -v mosquitto/:/mosquitto/ eclipse-mosquitto
編譯 mosquitto-auth-plug

參考: https://www.loraserver.io/gui...

準(zhǔn)備工作

注意: 在 docker 內(nèi)部構(gòu)建編譯環(huán)境的時(shí)候(尤其是在 alpine 環(huán)境中)會(huì)經(jīng)常出現(xiàn):

temporary error (try again later)

這是因?yàn)樵讷@取像openssl,build-base之類包的時(shí)候, 需要從一些官方的鏡像庫(kù)中獲取, 而由于國(guó)內(nèi)的"某些"網(wǎng)絡(luò)原因, DNS 往往不能直接解析到官方鏡像庫(kù). 參考這篇文章:徹底解決docker build時(shí)安裝軟件失敗問(wèn)題, 可以用tcpdump觀察這一現(xiàn)象. 所以我們最好先安排一下宿主機(jī)的 DNS.

查看本機(jī) nameserver

根據(jù)阿里云ECS啟動(dòng)Docker容器無(wú)法訪問(wèn)外網(wǎng)這篇文章, 我們可以這樣來(lái)獲取本機(jī) nameserver:

$ cat /etc/resolv.conf
nameserver 10.143.xx.xxx
nameserver 10.143.xx.xxy
options timeout:2 attempts:3 rotate single-request-reopen

這里我們可以看到有可能有多個(gè)域名解析服務(wù)地址, 這是一種容災(zāi)措施, 如果其中一個(gè)解析失敗了, 在若干次嘗試后會(huì)使用另外一個(gè)服務(wù)器去解析. 我們選取其中一個(gè)就好.

然后修改/etc/docker/daemon.json, 添加:

"dns": ["10.143.xx.xxx"]

重啟守護(hù)進(jìn)程:

$ sudo systemctl daemon-reload
// 最好也重啟一下docker
$ sudo systemctl restart docker

當(dāng)然, 如果網(wǎng)絡(luò)環(huán)境足夠好(比如在國(guó)外), 可以不需要配置 DNS. 即使不配置 DNS, 也有一定的幾率安裝軟件都成功.

修改軟件源為國(guó)內(nèi)加速鏡像

現(xiàn)在發(fā)現(xiàn)單純改 DNS 還是經(jīng)常會(huì)下載軟件失敗, 只好修改容器的軟件源了. 在 Dockerfile 中將 aliyun 的軟件源寫(xiě)入 /etc/apk/repositores:

RUN echo "http://mirrors.aliyun.com/alpine/v3.4/main/" > /etc/apk/repositories
創(chuàng)建宿主機(jī)文件目錄結(jié)構(gòu)

目錄結(jié)構(gòu)如下:

- mosquitto
    - Dockerfile
    - config
        - mosquitto.conf
        - config.mk
    - data
    - log
    - src
- postgres
    - Dockerfile
- docker-compose.yml

其中config放置 mosquitto 的啟動(dòng)配置mosquitto.conf和 mosquitto-auth-plug 的編譯配置config.mk. data, log分別作為 mosquitto 的數(shù)據(jù)存儲(chǔ)目錄和日志存儲(chǔ)目錄, src用于放置編譯需要的源文件.

配置 mosquitto.conf

mosquitto.conf 應(yīng)該聲明 mosquitto-auth-plug 插件編譯之后生產(chǎn)的 auth-plug.so的位置, 并說(shuō)明 postgres 數(shù)據(jù)庫(kù)的連接用戶, 連接端口, 連接密碼, 以及處理權(quán)限和讀寫(xiě)的 sql 語(yǔ)句. 參考:
Setting up ACL in Mosquitto using Postgres, 和MQTT authentication & authorization, 和mosquitto-auth-plug 在 github 上的 README.下面是一個(gè)可供參考和使用的 mosquitto.conf:

persistence true
persistence_location /mosquitto/data/
log_dest file /mosquitto/log/mosquitto.log

allow_anonymous false

auth_plugin /mosquitto/src/mosquitto-auth-plug/auth-plug.so
auth_opt_backends postgres

auth_opt_host pgsql_db
auth_opt_port 5432
auth_opt_dbname mosquitto
auth_opt_user root
auth_opt_pass root_password

auth_opt_userquery SELECT password FROM account WHERE username = $1 limit 1
auth_opt_superquery SELECT COALESCE(COUNT(*), 0) FROM account WHERE username = $1 AND super = 1
auth_opt_aclquery SELECT topic FROM acls WHERE (username = $1) AND rw >= $2
配置 config.mk

這里我們打算將 postgres 作為驗(yàn)證后端, 因此 config.mk 應(yīng)該是這樣的:

BACKEND_CDB ?= no
BACKEND_MYSQL ?= no
BACKEND_SQLITE ?= no
BACKEND_REDIS ?= no
BACKEND_POSTGRES ?= yes 
BACKEND_LDAP ?= no
BACKEND_HTTP ?= no
BACKEND_JWT ?= no
BACKEND_MONGO ?= no
BACKEND_FILES ?= no
BACKEND_MEMCACHED ?= no

# MOSQUITTO_SRC = /mosquitto/src/mosquitto
MOSQUITTO_SRC = 

OPENSSLDIR = /usr/lib
SUPPORT_DJANGO_HASHERS ?= no
CFG_LDFLAGS =
CFG_CFLAGS =

OPENSSLDIR 指定為 /usr/lib,
MOSQUITTO_SRC 指定為/mosquitto/src/mosquitto/src, 也可以不需要指定, 因?yàn)樵谌萜髦幸呀?jīng)安裝了 mosquitto, 編輯腳本可以從環(huán)境中獲取源碼地址, 這樣甚至后面我們都不需要用 git 從 github 上拉取 mosquitto 的源碼了, 注意: 這里最好不要指定, 因?yàn)樵趯?shí)際編譯的時(shí)候經(jīng)常會(huì)發(fā)生報(bào)錯(cuò), 直接使用環(huán)境中即可.

編寫(xiě) Dockerfile

鏡像的源來(lái)自 eclipse mosquitto 的 Docker Hub, 基于 alpine linux.
這是我根據(jù)編譯經(jīng)驗(yàn)寫(xiě)的Dockerfile:

FROM eclipse-mosquitto
WORKDIR /mosquitto
ADD mosquitto/config /mosquitto/config

RUN apk update && 
    apk add wget && 
    apk add mosquitto-dev && 
    apk add postgresql-dev && 
    apk add openssl && 
    apk add build-base && 
    mkdir /mosquitto/src && 
    wget https://github.com/jpmens/mosquitto-auth-plug/archive/0.1.2.tar.gz 
        -O /mosquitto/src/mosquitto-auth-plug.tar.gz && 
    tar zxf /mosquitto/src/mosquitto-auth-plug.tar.gz -C /mosquitto/src && 
    mv /mosquitto/src/mosquitto-auth-plug-0.1.2 /mosquitto/src/mosquitto-auth-plug && 
    rm -rf /mosquitto/src/mosquitto_auth_plug.tar.gz && 
    mv /mosquitto/config/config.mk /mosquitto/src/mosquitto-auth-plug/config.mk && 
    cd /mosquitto/src/mosquitto-auth-plug && 
    make clean && make

EXPOSE 1881 9001

可以看到這里我們安裝了以 postgresql 為后端編譯 auth-plug 需要的依賴: mosquitto-dev, postgresql-dev, openssl, 和 C 語(yǔ)言的 GCC 編譯環(huán)境build-base. 用 git 拉取了 mosquitto 和 mosqtuitto-auth-plug 的源碼, 最好還是直接從mosquitto-auth-plug/release中獲取發(fā)布的穩(wěn)定版本, 最后使用自定義的 config.mk 進(jìn)行 make 編譯.

編寫(xiě) docker-compose.yml

打算用容器編排工具 docker-compose 運(yùn)行編譯了 mosquitto-auth-plug 的 mosquitto 容器, 下面是一個(gè)可供使用和參考的 docker-compose.yml:

version: "3"
services:
  mosquitto:
    build: ./Dockerfile_mosquitto
    volumes:
      - ./mosquitto/config/mosquitto.conf:/mosquitto/config/mosquitto.conf
    command: ["mosquitto", "-c", "/mosquitto/config/mosquitto.conf"]
    ports:
      - "1881:1881"
      - "9001:9001"
部署 postgres 后端

前面已經(jīng)把 mosquitto 部署成功, 但是由于這里我們打算讓 mosquitto 的權(quán)限認(rèn)證和讀寫(xiě)認(rèn)證交給 postgres(不然為什么我們要花那么費(fèi)勁去編譯 mosquitto-auth-plug?), 所以我們還要部署一個(gè) mosquitto 可以訪問(wèn)的 postgres 后端或者在已有的 postgres 上創(chuàng)建相關(guān)的表結(jié)構(gòu). 注意 postgres 后端的用戶, 密碼等應(yīng)該和 mosquitto.conf 上配置的一致.

編寫(xiě) postgres 的 docker-compose.yml

直接在原有的 docker-compose.yml 上加一個(gè) service:

services:
  ...
  postgres_db:
    image: postgres
    environment:
      POSTGRES_DB: mosquitto
      POSTGRES_USER: root
      POSTGRES_PASSWORD: root_password

這里我們不暴露 postgres 的 5432 端口, 因?yàn)?docker 內(nèi)部的同一個(gè)網(wǎng)絡(luò)可以直接通過(guò)容器名字來(lái)訪問(wèn)對(duì)應(yīng)的容器, 而且我們不希望容器外的其他人可以訪問(wèn)數(shù)據(jù)庫(kù). 注意這里的POSTGERS_USER應(yīng)該和 mosquitto.conf 中的auth_opt_user對(duì)應(yīng), 類似的也有POSTGRES_DB, POSTGRES_PASSWORD. 而容器名字postgres_db可以成為auth_opt_host的值, docker 會(huì)為這個(gè) host 做 DNS 解析.

然后我們就可以直接運(yùn)行 postgres 容器:

$ docker-compose up -d
初始化 postgres

為了滿足 mosquitto-auth-plug 的業(yè)務(wù)需求, 需要為 postgres 生成對(duì)應(yīng)的表, 可以參考mosquitto-auth-plug/examples/mysql.sql

CREATE TABLE account(
id SERIAL,
username TEXT NOT NULL,
password TEXT,
super smallint DEFAULT 0 NOT NULL,
PRIMARY KEY (id)
);

CREATE INDEX account_username ON account (username);

CREATE TABLE acls (
id SERIAL,
username TEXT NOT NULL,
topic TEXT NOT NULL,
rw INTEGER NOT NULL DEFAULT 0,
PRIMARY KEY (id)
);

CREATE UNIQUE INDEX acls_user_topic ON acls (username, topic);

這些 SQL 語(yǔ)句也可以寫(xiě)在 Dockerfile 里面作為第一次構(gòu)建時(shí)就執(zhí)行的.
接著就可以插入幾條測(cè)試數(shù)據(jù)了. 用戶的密碼生成需要使用 mosquitto-auth-plug 提供的密碼生成器, 它是以 PBKDF2 的形式儲(chǔ)存在數(shù)據(jù)庫(kù)后端的.

比如我們 進(jìn)入 mosquitto 容器內(nèi):

$ docker exec -it  /bin/sh

為用戶生成一個(gè)明文為123456的密碼:

$ /mosquitto/src/mosquitto-auth-plug/np
Enter password:
Re-enter same password:
PBKDF2$sha256$901$Yf1FSeMi1j7OjWdW$u1MqFR7iIZj+m6P7vKDvuMx+oDDJW4ub

之后為 account 表內(nèi)為test_user添加一條記錄:

> INSERT INTO account(username, pasword, super) values (
    "test_user", 
    "PBKDF2$sha256$901$Yf1FSeMi1j7OjWdW$u1MqFR7iIZj+m6P7vKDvuMx+oDDJW4ub",
    0)

并設(shè)定test_user對(duì)于 topic /topic1為可讀可寫(xiě):

> INSERT INTO acls(username, topic, rw) values (
    "test_user",
    "/topic1",
    2)

現(xiàn)在數(shù)據(jù)庫(kù)內(nèi)的記錄是:

 id | username |                              password                               | super 
----+----------+---------------------------------------------------------------------+-------
  1 | test_user | PBKDF2$sha256$901$S55aebUoogFy6XSf$E6PbQWDFQ06KLFlqqR3x+NBjg6ixjwez |     0


 id | username |   topic    | rw 
----+----------+------------+----
  1 | test_user| /topic1    | 2

意味著用戶 test_user 可以用密碼123456向 topic topic1 發(fā)布主題和訂閱主題.

搭建應(yīng)用環(huán)境進(jìn)行測(cè)試

我們這里用 python 中同樣實(shí)現(xiàn)了 mqtt 協(xié)議的 paho-mqtt 進(jìn)行測(cè)試, 如果生產(chǎn)環(huán)境是使用 python 的話, 也可以直接使用這個(gè)庫(kù)作為連接庫(kù).
安裝很簡(jiǎn)單的:

$ pip install paho-mqtt
搭建一個(gè) python-alpine 容器:

應(yīng)用程序代碼就放在 python-alpine 容器里好了. 下面是一個(gè)可供參考和使用的 docker-compose.yml:

services:
  mqtt_server:
    image: python-alpine
    command: ["tail"]

docker-compose up mqtt_server -d 使得該容器掛起, 然后用docker exec -it /bin/sh黑魔法進(jìn)入容器. 編寫(xiě)一個(gè)測(cè)試用的訂閱者(client.py):

import paho.mqtt.client as mqtt
import time

HOST = "mosquitto"
PORT = 1883

def client_loop():
    client_id = time.strftime("%Y%m%d%H%M%S", time.localtime(time.time()))
    client = mqtt.Client(
        client_id=client_id, clean_session=True)
    client.username_pw_set("test_user", "123456")
    client.on_connect = on_connect 
    client.on_message = on_message
    client.connect(HOST, PORT, 60)
    client.loop_forever()

def on_connect(client, userdata, flags, rc):
    print("Connected with result code " + str(rc))
    client.subscribe("/topic1")

def on_message(client, userdata, msg):
    print(msg.topic + " " + msg.payload.decode("utf-8"))

if __name__ == "__main__":
    client_loop()

然后編寫(xiě)一個(gè)測(cè)試用的發(fā)布者(publish.py):

import paho.mqtt.publish as publish
import time

HOST = "mosquitto"
PORT = 1883

if __name__ == "__main__":
    client_id = time.strftime("%Y%m%d%H%M%S", time.localtime(time.time()))
    publish.single("topic1", "hello mqtt", qos=2, hostname=HOST, port=PORT,
            client_id=client_id, auth={"username": "test_user", "password": "123456"})

當(dāng)運(yùn)行 client.py 之后, client 陷入監(jiān)聽(tīng) mosquitto 的狀態(tài), 等待收到發(fā)送在 topic topic1 的消息。 再運(yùn)行一次 publish.py, 它往 topic1發(fā)送了一個(gè)消息, 我們可以看到 client.py 就已經(jīng)收到了.

總結(jié)

我們成功地搭建了一個(gè) mosquitto 的消息代理服務(wù), 并為它編譯了 mosquitto-auth-plug, 可以供后續(xù)后端消息業(yè)務(wù)的開(kāi)發(fā). 詳細(xì)代碼也可以參考已經(jīng)上傳到 github 的 example.

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/27476.html

相關(guān)文章

  • mosquitto 與 websocket 的結(jié)合

    摘要:前言作為一個(gè)消息代理客戶端與服務(wù)端的通信時(shí)基于協(xié)議的而現(xiàn)在的主流應(yīng)用時(shí)呈現(xiàn)在瀏覽器中這意味著用戶與服務(wù)端只能通過(guò)或者這類瀏覽器能理解的協(xié)議傳輸所以后端還要建立一個(gè)代理層將協(xié)議傳輸?shù)膬?nèi)容解析一下以協(xié)議發(fā)送到最后再由發(fā)送到硬件端在瀏覽器支持的協(xié) 前言 mosquitto 作為一個(gè)消息代理, 客戶端與 mosquitto 服務(wù)端的通信時(shí)基于 MQTT 協(xié)議的, 而現(xiàn)在的主流 web 應(yīng)用時(shí)呈...

    joy968 評(píng)論0 收藏0
  • mosquitto 與 websocket 的結(jié)合

    摘要:前言作為一個(gè)消息代理客戶端與服務(wù)端的通信時(shí)基于協(xié)議的而現(xiàn)在的主流應(yīng)用時(shí)呈現(xiàn)在瀏覽器中這意味著用戶與服務(wù)端只能通過(guò)或者這類瀏覽器能理解的協(xié)議傳輸所以后端還要建立一個(gè)代理層將協(xié)議傳輸?shù)膬?nèi)容解析一下以協(xié)議發(fā)送到最后再由發(fā)送到硬件端在瀏覽器支持的協(xié) 前言 mosquitto 作為一個(gè)消息代理, 客戶端與 mosquitto 服務(wù)端的通信時(shí)基于 MQTT 協(xié)議的, 而現(xiàn)在的主流 web 應(yīng)用時(shí)呈...

    tomener 評(píng)論0 收藏0
  • 基于MQTT的物聯(lián)網(wǎng)云測(cè)量解決方案

    摘要:本文是其中的一個(gè)解決方案。地址客戶端服務(wù)端前端網(wǎng)頁(yè)介紹,消息隊(duì)列遙測(cè)傳輸是開(kāi)發(fā)的一個(gè)即時(shí)通訊協(xié)議,有可能成為物聯(lián)網(wǎng)的重要組成部分。必須用于在頂層分隔符之后,除了當(dāng)自己指定時(shí)。 1. 問(wèn)題描述 最近,本實(shí)驗(yàn)室大量上馬云測(cè)量,云監(jiān)控方面的項(xiàng)目,大概是屬于物聯(lián)網(wǎng)應(yīng)用的一個(gè)分支。老板也有將舊有儀器改造的想法,所以要實(shí)現(xiàn)儀器設(shè)備的云控制。本文是其中的一個(gè)解決方案。 2. 技術(shù)選型 消息隊(duì)列:M...

    張金寶 評(píng)論0 收藏0
  • PHP 使mosquiito

    摘要:近期業(yè)務(wù)需要,調(diào)研和使用基于協(xié)議的,開(kāi)發(fā)一個(gè)消息推送系統(tǒng)。環(huán)境安裝安裝的擴(kuò)展然后把加到重啟編寫(xiě)代碼,訂閱為的消息想為,發(fā)布消息運(yùn)行腳本發(fā)布消息腳本接受到消息并且打印出來(lái)腳本中,在收到消息后,會(huì)發(fā)布一個(gè)消息到為中,后臺(tái)會(huì)接收消息 近期業(yè)務(wù)需要,調(diào)研和使用基于mqtt協(xié)議的mosquitto,開(kāi)發(fā)一個(gè)消息推送系統(tǒng)。 環(huán)境:ubuntu 14.04,php7.1,mosquitto 安裝mo...

    Developer 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<