1. 程式人生 > >nginxPlus配置上遊emq服務器負載均衡及SSL Termination

nginxPlus配置上遊emq服務器負載均衡及SSL Termination

版本 cin shared pst 分別是 clust github項目 pid ash

公司業務訪問量大,因此需要對後端emq服務器進行性能調優,在前端配置,以提高服務的健壯性。同時,由於mqtts傳輸方式中加解密的操作較占資源,所以需要把這部分操作讓nginx服務器完成,讓後端通信均為mqtt方式,減少服務器壓力。

本文所有配置基於nginx-plus R17版本。

nginx的安裝和簡單配置參考其他網頁。

  1. SSL Termination,翻譯中文大概意思為ssl卸載(?),目的就是要在nginx端進行加解密操作。首先需要在emq的安裝目錄使用OpenSSL生成證書。以下為測試時使用的nginx配置文件,由於mqtt協議屬於TCP/UDP協議集,因此使用stream模塊。配置上遊服務器188和190,監聽mqtt協議的1883端口。nginx監聽9993的加密協議端口,使用ssl_certificate命令指定證書路徑(必須PEM格式),使用ssl_certificate_key指定私鑰地址,此外,ssl_protocols和ssl_ciphers指令可用於限制連接,並僅包含SSL / TLS的強版本和密碼。
    user  nginx;
    worker_processes  auto;
    
    error_log  /var/log/nginx/error.log debug;
    pid        /var/run/nginx.pid;
    
    events {
        worker_connections  
    1024; } # TCP/UDP proxy and load balancing block # stream { upstream mqtt_cluster {   server 192.168.100.188:1883;   server 192.168.100.190:1883; } server { listen 9993 ssl; proxy_pass mqtt_cluster; ssl_certificate /etc/ssl/certs/cert.crt; ssl_certificate_key /etc/ssl/certs/key.key; ssl_protocols TLSv1 TLSV1.
    1 TLSv1.2; ssl_session_cache shared:SSL:10m; ssl_session_timeout 10m; } }

    以上配置已經可以實現在nginx端進行mqtts的ssl加解密操作。測試時使用一個加密的pub端發送消息,一個加密的sub端,一個不加密的sub端接收消息。結果不論加密或不加密的sub端都可以收到消息。

  2. 負載均衡。是通過upstream模塊來實現的,內置實現了五種負載策略,分別是輪詢、最少連接、最少時間(僅nginxPlus支持)、hash和random。由於業務需求,負載均衡的同時必須保證用戶進行訂閱時,同一個clientID必須始終是同一臺服務器進行處理,除非該服務器宕機不可用,即要保證會話持久性。所以使用hash算法配置負載均衡。使用的配置文件在上文的基礎上添加了一行hash 192.168.100.187 consistent;,即從187這個ip發送的mqtt消息始終有同一個上遊服務器處理,但這種方式並不符合業務需求,因為無法在配置文件中寫出所有客戶的IP。因此需要通過mqtt客戶端的唯一標識clientID來做hash算法,但由於時間關系沒有深入研究,在此記錄github項目連接以便空閑的時候繼續。github連接:https://gist.github.com/nginx-gists/0e93fe7813ec131fed8329d10ead70ea 資料參考:https://www.nginx.com/blog/nginx-plus-iot-load-balancing-mqtt/
    user  nginx;
    worker_processes  auto;
    
    error_log  /var/log/nginx/error.log debug;
    pid        /var/run/nginx.pid;
    
    events {
        worker_connections  
    1024; } # TCP/UDP proxy and load balancing block # stream { upstream mqtt_cluster { hash 192.168.100.187 consistent; server 192.168.100.188:1883; server 192.168.100.190:1883; } server { listen 9993 ssl; proxy_pass mqtt_cluster; ssl_certificate /etc/ssl/certs/cert.crt; ssl_certificate_key /etc/ssl/certs/key.key; ssl_protocols TLSv1 TLSV1.1 TLSv1.2; ssl_session_cache shared:SSL:10m; ssl_session_timeout 10m; } }

nginxPlus配置上遊emq服務器負載均衡及SSL Termination