nginxPlus配置上遊emq服務器負載均衡及SSL Termination
阿新 • • 發佈:2019-04-01
版本 cin shared pst 分別是 clust github項目 pid ash
公司業務訪問量大,因此需要對後端emq服務器進行性能調優,在前端配置,以提高服務的健壯性。同時,由於mqtts傳輸方式中加解密的操作較占資源,所以需要把這部分操作讓nginx服務器完成,讓後端通信均為mqtt方式,減少服務器壓力。
本文所有配置基於nginx-plus R17版本。
nginx的安裝和簡單配置參考其他網頁。
- 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
以上配置已經可以實現在nginx端進行mqtts的ssl加解密操作。測試時使用一個加密的pub端發送消息,一個加密的sub端,一個不加密的sub端接收消息。結果不論加密或不加密的sub端都可以收到消息。
- 負載均衡。是通過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
nginxPlus配置上遊emq服務器負載均衡及SSL Termination