mqtt 代理

1.功能描述

能够满足mqtt 客户端的所有请求,代理跟mqtt server之间的通信对mqtt 客户端无感知,支持mqtt明文以及ssl加密两种方式;非mqtt连接,断开连接;客户端同代理的一次session过程中,代理要保证同server端的正确通信,包括server端无感知切换;提供 mqtt_proxy_clientid 变量,upstream可使用该变量做hash路由;心跳,同server不中断时做转发,但是切换server时,代理要回应client 心跳,然后恢复对新server连接后,重新转发

stream mqtt代理模块采用静态编译,不再编译动态模块

2.依赖模块

load_module modules/njt_stream_mqtt_proxy_module.so; #加载mqtt代理模块

3.指令说明

mqtt_proxy_pass

Syntax: mqtt_proxy_pass address;
Default:
Context: server

mqtt代理

mqtt_proxy_next_upstream

Syntax: mqtt_proxy_next_upstream on | off;
Default: mqtt_proxy_next_upstream on;
Context: stream, server

当前server不可用时,是否自动尝试下一个server连接开关

mqtt_proxy_next_upstream_timeout

Syntax: mqtt_proxy_next_upstream_timeout time;
Default: mqtt_proxy_next_upstream_timeout 0;
Context: stream, server

尝试连接新server的超时时间,0表示不受此时间限制

mqtt_proxy_next_upstream_tries

Syntax: mqtt_proxy_next_upstream_tries number;
Default: mqtt_proxy_next_upstream_tries 0;
Context: stream, server

尝试连接新server的次数,0表示不尝试连接新server。该次数内 server仍不可用,则关闭客户端连接,同时如果upstream中所有server都已经尝试连接过,则也会直接关闭客户端连接

mqtt_proxy_ssl

Syntax: mqtt_proxy_ssl on | off;
Default: mqtt_proxy_ssl off;
Context: stream, server

代理连接server是否开启TLS/SSL 协议

mqtt_proxy_ssl_certificate

Syntax: mqtt_proxy_ssl_certificate file;
Default:
Context: stream, server

代理连接server 配置ssl证书

mqtt_proxy_ssl_certificate_key

Syntax: mqtt_proxy_ssl_certificate_key file;
Default:
Context: stream, server

代理连接server 配置ssl key证书

ssl_certificate

Syntax: ssl_certificate file;
Default:
Context: stream, server

代理作为ssl server, 配置ssl证书,标准stream模块证书配置

ssl_certificate_key

Syntax: ssl_certificate_key file;
Default:
Context: stream, server

代理作为ssl server, 配置ssl key证书,标准stream模块 key证书配置

4.配置样例

njet.conf

load_module modules/njt_stream_mqtt_proxy_module.so; 
stream {
        #配置mqtt upstream
        
        upstream  mqtt_upstream{
                #如果需要使用clientid做hash 路由,使用如下指令
                #hash $mqtt_proxy_clientid;

                server 127.0.0.1:1884 max_fails=3 fail_timeout=30s;
                server 127.0.0.1:1885 max_fails=3 fail_timeout=30s;
                server 127.0.0.1:1886 max_fails=3 fail_timeout=30s;
        }

        # 示例配置
        server {
                listen 8101;
                mqtt_pass mqtt_upstream;
                mqtt_proxy_next_upstream on;
                mqtt_proxy_next_upstream_tries 3;
        }

        #代理非ssl, server ssl 示例配置
        server {
                listen 8101;
                mqtt_pass mqtt_upstream;
                mqtt_proxy_next_upstream on;
                mqtt_proxy_next_upstream_tries 3;

                mqtt_proxy_ssl on;
                mqtt_proxy_ssl_certificate /root/bug/njet1.0/cert/mqtt_client.crt;
                mqtt_proxy_ssl_certificate_key /root/bug/njet1.0/cert/mqtt_client.key;
        }

        #代理ssl, server 非ssl 示例配置
        server {
                listen 8101 ssl;
                mqtt_pass mqtt_upstream;
                mqtt_proxy_next_upstream on;
                mqtt_proxy_next_upstream_tries 3;

                ssl_certificate /root/bug/njet1.0/cert/mqtt_client.crt;
                ssl_certificate_key /root/bug/njet1.0/cert/mqtt_client.key;
        }

        #代理ssl, server ssl 示例配置
        server {
                listen 8101 ssl;
                mqtt_pass mqtt_upstream;
                mqtt_proxy_next_upstream on;
                mqtt_proxy_next_upstream_tries 3;

                ssl_certificate /root/bug/njet1.0/cert/mqtt_client.crt;
                ssl_certificate_key /root/bug/njet1.0/cert/mqtt_client.key;

                mqtt_proxy_ssl on;
                mqtt_proxy_ssl_certificate /root/bug/njet1.0/cert/mqtt_client.crt;
                mqtt_proxy_ssl_certificate_key /root/bug/njet1.0/cert/mqtt_client.key;
        }
}

5.调用样例

使用mosquitto相关工具进行测试

匿名不带用户名密码

allow_anonymous true

Mosquito broker启动

mosquitto -c /etc/mosquitto/mosquitto.conf -p 1884

生产者发向mqtt 代理发送消息:

mosquitto_pub -h localhost -t "topic2"  -p 8101  -m "Hello 1" 

订阅者收到生产者发送的消息:

mosquitto_sub -p 1884  -F '%t : %p' -t "topic2" -i client 3

带用户名密码

ssl证书配置(不配置下面几项,则为非ssl)

cafile /root/bug/njet1.0/cert/mqtt_ca.crt

# Path to the PEM encoded server certificate.
certfile /root/bug/njet1.0/cert/mqtt_client.crt

# Path to the PEM encoded keyfile.
keyfile /root/bug/njet1.0/cert/mqtt_client.key
allow_anonymous false

#关于密码文件的配置,参考http2mqtt资料里相关介绍
password_file /etc/mosquitto/password_file

Mosquito broker启动

mosquitto -c /etc/mosquitto/mosquitto.conf -p 1884

生产者发向mqtt 代理发送消息:

mosquitto_pub -h localhost -t "topic2"  -p 8101  -m "Hello 1"  -u admin -P 123456  -i client2

订阅者收到生产者发送的消息:

 mosquitto_sub -p 1884  -F '%t : %p' -t "#"  -u admin -P 123456  --cafile /home/njet/mqtt/cert/mqtt_ca.crt --cert /home/njet/mqtt/cert/mqtt_client.crt --key /home/njet/mqtt/cert/mqtt_client.key --insecure

logo logo