Skip to content

NGINX 负载均衡 FMQ 集群 ​

一、功能与优势 ​

  1. 作为反向代理服务器,位于 MQTT 服务器端,代表客户端向 FMQ 集群发起连接请求并处理和返回响应,隐藏集群细节,提高系统可维护性与可扩展性。
  2. 可终结 SSL 加密的 MQTT 连接,减轻 FMQ 集群加密解密负担,提升性能、简化证书管理并增强安全性。
  3. 具备灵活负载均衡策略,如粘性负载平衡等,可根据不同策略将请求分发到 FMQ 节点,分摊流量与请求,提高性能和可靠性。

二、安装和使用 NGINX ​

(一)前置准备 ​

创建由 3 个 FMQ 节点(fmq1-cluster.fmq.io、fmq2-cluster.fmq.io、fmq3-cluster.fmq.io,MQTT TCP 端口 1883,MQTT WebSocket 端口 8083)组成的集群。

(二)安装 NGINX ​

  1. 环境要求

    :安装 GNU C 和 C++ 编译器、PCRE 库、zlib 压缩库、OpenSSL 库

    bash
    sudo apt-get update
    sudo apt-get install build-essential libpcre3-dev zlib1g-dev libssl-dev
  2. 下载源码

    bash
    wget https://nginx.org/download/nginx-1.24.0.tar.gz
  3. 编译配置命名

    bash
    tar -zxvf nginx-1.24.0.tar.gz
    cd nginx-1.24.0
  4. 开始编译:

plaintext
make
  1. 安装

    bash
    sudo make install
    sudo ln -s /usr/local/nginx/sbin/nginx /usr/local/bin/nginx
  2. 开始使用

    • 检查配置文件:

      bash
      sudo nginx -t
    • 启动 NGINX:

      bash
      sudo nginx
    • 重新加载配置:

      bash
      sudo nginx -s reload
    • 停止 NGINX:

      bash
      sudo nginx stop

四、配置 NGINX 的反向代理和负载均衡功能 ​

(一)配置反向代理 MQTT ​

bash
stream {
  upstream mqtt_servers {
    server fmq1-cluster.fmq.io:1883 max_fails=2 fail_timeout=10s;
    server fmq2-cluster.fmq.io:1883 down;
    server fmq3-cluster.fmq.io:1883 backup;
  }

  server {
    listen 1883;
    proxy_pass mqtt_servers;
    proxy_protocol on;
    proxy_connect_timeout 10s;   
    proxy_timeout 1800s;
    proxy_buffer_size 3M;
    tcp_nodelay on;       
  }
}

(二)配置反向代理 MQTT SSL ​

bash
stream {
  upstream mqtt_servers {
    server fmq1-cluster.fmq.io:1883;
    server fmq2-cluster.fmq.io:1883;
  }

  server {
    listen 8883 ssl;
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 10m;
    ssl_certificate /usr/local/NGINX/certs/fmq.pem;
    ssl_certificate_key /usr/local/NGINX/certs/fmq.key;
    ssl_verify_depth 2;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers HIGH:!aNULL:!MD5;
    proxy_pass mqtt_servers;
    proxy_protocol on;
    proxy_connect_timeout 10s;   
    proxy_timeout 1800s;
    proxy_buffer_size 3M;
    tcp_nodelay on;
  }
}

(三)配置反向代理 MQTT WebSocket ​

bash
http {
  upstream mqtt_websocket_servers {
    server fmq1-cluster.fmq.io:8083;
    server fmq2-cluster.fmq.io:8083;
  }

  server {
    listen 80;
    server_name mqtt.example.com;

    location /mqtt {
      proxy_pass http://mqtt_websocket_servers;
      proxy_http_version 1.1;
      proxy_set_header Upgrade $http_upgrade;
      proxy_set_header Connection "Upgrade";
      proxy_buffering off;
      proxy_connect_timeout 10s;        
      proxy_send_timeout 3600s;            
      proxy_read_timeout 3600s;            
      proxy_set_header Host $host;            
      proxy_set_header X-Real-IP $remote_addr;            
      proxy_set_header REMOTE-HOST $remote_addr;            
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
  }
}

(四)配置反向代理 MQTT WebSocket SSL ​

bash
http {
  upstream mqtt_websocket_servers {
    server fmq1-cluster.fmq.io:8083;
    server fmq2-cluster.fmq.io:8083;
  }

  server {
    listen 443 ssl;
    server_name mqtt.example.com;
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 10m;
    ssl_certificate /usr/local/NGINX/certs/fmq.pem;
    ssl_certificate_key /usr/local/NGINX/certs/fmq.key;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers HIGH:!aNULL:!MD5;
    location /mqtt {
      proxy_pass http://mqtt_websocket_servers;
      proxy_http_version 1.1;
      proxy_set_header Upgrade $http_upgrade;
      proxy_set_header Connection "Upgrade";
      proxy_set_header Host $host;            
      proxy_set_header X-Real-IP $remote_addr;            
      proxy_set_header REMOTE-HOST $remote_addr;            
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;      
      proxy_buffering off;
    }
  }
}

(五)配置负载均衡策略 ​

  1. 轮询(Round Robin)

    :默认策略,依次分配请求给后端服务器。

    bash
    upstream backend_servers {
      server fmq1-cluster.fmq.io:1883;
      server fmq2-cluster.fmq.io:1883;
      server fmq3-cluster.fmq.io:1883;
    }
  2. 权重轮询(Weighted Round Robin)

    :为节点分配不同权重影响请求分配比例。

    bash
    upstream backend_servers {
      server fmq1-cluster.fmq.io:1883 weight=3;
      server fmq2-cluster.fmq.io:1883 weight=2;
      server fmq3-cluster.fmq.io:1883 weight=1;
    }
  3. IP 哈希(IP Hash)

    :根据客户端 IP 地址哈希计算分配请求到固定后端服务器。

    bash
    upstream backend_servers {
      ip_hash;
      server fmq1-cluster.fmq.io:1883;
      server fmq2-cluster.fmq.io:1883;
      server fmq3-cluster.fmq.io:1883;
    }
  4. 最少连接数(Least Connections)

    :将请求分发到当前连接数最少的服务器。

    bash
    upstream backend_servers {
      least_conn;
      server fmq1-cluster.fmq.io:1883;
      server fmq2-cluster.fmq.io:1883;
      server fmq3-cluster.fmq.io:1883;
    }

五、使用 NGINX Plus 优化 FMQ 部署 ​

(一)配置 MQTT 粘性(Sticky)会话负载均衡 ​

bash
stream {
  mqtt_preread on;

  upstream backend_servers {
      hash $mqtt_preread_clientid consistent;
      server fmq1-cluster.fmq.io:1883;
      server fmq2-cluster.fmq.io:1883;
      server fmq3-cluster.fmq.io:1883;
  }

  server {
      listen 1883;
      proxy_pass backend_servers;
      proxy_connect_timeout 1s;
  }
}

(二)配置客户端 ID 替换功能 ​

bash
stream {
    mqtt on;

    server {
        listen 1883 ssl;
        ssl_certificate /etc/NGINX/certs/fmq.pem;
        ssl_certificate_key /etc/NGINX/certs/fmq.key;
        ssl_client_certificate /etc/NGINX/certs/ca.crt;      
        ssl_session_cache shared:SSL:10m;
        ssl_verify_client on;
        proxy_pass 10.0.0.113:1883;
        proxy_connect_timeout 1s;  

        mqtt_set_connect clientid $ssl_client_serial;
    }
}

六、优化 NGINX 性能并启用监控 ​

(一)NGINX 基础配置调整 ​

bash
worker_processes auto;

events {
  worker_connections 20480;
}

(二)NGINX 多网卡支持海量连接反向代理 ​

bash
stream {
  split_clients "$remote_addr$remote_port" $multi_ip {        
    20% 10.211.55.5;        
    20% 10.211.55.20;        
    20% 10.211.55.21;        
    20% 10.211.55.22;        
    * 10.211.55.23;    
  }

  upstream mqtt_servers {
    server fmq1-cluster.fmq.io:1883;
    server fmq2-cluster.fmq.io:1883;
  }

  server {
    listen 1883;

    proxy_pass mqtt_servers;
    proxy_bind $multi_ip;
  }
}

(三)NGINX 状态监控 ​

bash
http {
  server {
    listen 8888;
    
    location /status {            
      stub_status on;            
      access_log off;            
    }
  }
}

七、附录:主要参数说明 ​

参数名称说明
proxy_protocol启用 PROXY protocol,使 FMQ 能获取真实客户端 IP
proxy_pass定义后端 MQTT 服务器地址,转发客户端请求到此处
proxy_connect_timeout与后端建立连接超时时间,超时中断连接尝试
proxy_timeout后端服务器超时时间,未响应则关闭连接
proxy_buffer_size存储后端数据的缓冲区大小,处理大数据流
tcp_nodelay启用 TCP_NODELAY,禁用 Nagle 算法,减少延迟
ssl_session_cache配置 SSL 会话缓存,加速握手过程,如 shared:SSL:10m 为 10MB 缓存
ssl_session_timeout设置 SSL 会话超时时间为 10 分钟,未重用则清除
ssl_certificate指定 SSL 证书文件路径,证明服务器身份
ssl_certificate_key指定证书私钥文件路径
ssl_protocols指定允许的 SSL/TLS 协议版本
ssl_ciphers配置允许的加密算法(密码套件),如 HIGH:!aNULL:!MD5 排除不安全选项
ssl_client_certificate指定验证客户端证书的 CA 证书路径
ssl_verify_client启用客户端证书验证,要求客户端提供有效证书
ssl_verify_depth设置客户端证书验证深度,如 1 表示仅验证一层

蜂信物联 | fastbee.cn