反饋已提交

網絡繁忙

叢集配置WebSocket埠

1. 概述

1.1 版本

報表伺服器版本
10.0

1.2 應用場景

本文將介紹在叢集環境下,如何配置 WebSocket 埠。

注:11.0.2 及之後版本的報表工程,新增了一個容器Websocket方案。推薦優先查看是否可使用該方案:容器Websocket方案

無需任何使用者操作,無需任何手動配置,無需額外開啟埠,系統可自動使用Web容器自帶的WebSocket進行連結,埠複用http埠。

2. 範例

2.1 修改欄位值

超級管理者可透過「fine_conf_entity視覺化配置插件」修改 WebSocket 埠。重啟伺服器後設定生效。

注:修改 FineDB 資料庫表欄位值的方法請參考 FineDB常用表欄位修改 。

JAR 包ID預設值設定範圍

是否支援

設定多個值

Websocket 埠-WebSocketConfig.port["38888", "39888"]

參數值為埠陣列["port1","port2"]

port均屬於區間(1024,65535]

支援
Websocket 轉發埠2019-11-08 之前WebSocketConfig.requestPort38889支援
2019-11-08 及之後WebSocketConfig.requestPorts38889支援

設定埠號時有一些注意事項:

1)埠號可設定範圍:1024~65535,若為多個值,設定格式為:[埠號1,埠號2,埠號3]。

2)建議「WebSocket轉發埠」的值要多於叢集節點數,保證每個節點都會選擇當前可用的埠,不會因為埠佔用而導致伺服器無法啟動。

3)建議「WebSocket埠」設定多個值,作為備用,防止一台伺服器部署了多個工程,埠被佔用。

4)不要設定埠號為伺服器遠端連結埠 3389。

5)如果工程和 nginx 負載均衡在一個環境下,不要重複設定某個埠號既是 WebSocket 埠,又是 WebSocket 轉發埠。

6)若 WebSocketConfig.port、WebSocketConfig.requestPort、WebSocketConfig.requestPorts 欄位後面有空格,配置不生效。

7)若 WebSocketConfig.port、WebSocketConfig.requestPort、WebSocketConfig.requestPorts 大小寫錯誤,配置不生效。

8)WebSocketConfig.requestPort 和 WebSocketConfig.requestPorts 不能同時存在於 fine_conf_entity 表中,否則會出錯。

2.2 修改叢集轉發策略

在負載均衡層面配置 Websocket 的轉發策略為粘滯,詳情請參見:負載均衡配置指導 

2.3 修改叢集監聽埠

nginx.conf 檔案中,server 的 listen 埠需要與「WebSocket 轉發埠」配置一致,詳情請參見:Linux 系統安裝配置 Nginx 4.1 節

例如用設定的 Websocket 轉發埠(WebSocketConfig.requestPort預設38889)轉發 Websocket 埠(WebSocketConfig.port預設 38888 )

以下範例為工程伺服器 IP 為 192.168.6.171,Nginx 伺服器 IP 為 192.168.6.181,如下圖所示:

#使用者或者使用者組 預設為nobody
#user  root;
#允許進程數量,建議設定為cpu核心數或者auto自動檢查,注意Windows伺服器上雖然可以啟動多個processes,但是實際只會用其中一個
worker_processes  auto;
#自動根據CPU數目綁定CPU親緣性,nginx1.9.10及以上版本才能用
#worker_cpu_affinity  auto;
#error日誌存放位置
error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;
#PID存放位置
#pid        logs/nginx.pid;
#工作模式及連結數上限
events {
    #每個worker_processes的最大連結數,Windows伺服器無論這裏設定多大實際都只有1024
    #併發數是 worker_processes 和 worker_connections 的乘積
    worker_connections  1024;
}
http {
    #設定mime類型,類型由mime.type檔案定義
    include       mime.types;
    #預設檔案類型,預設為text/plain
    default_type  application/octet-stream;
    #日誌格式
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for" $upstream_addr';
    #access_log確定了Nginx是否儲存存取日誌,將這個設定為關閉可以降低磁碟IO而提升速度
    access_log  off;
    #access_log  logs/access.log  main;
    #sendfile 指令指定 nginx 是否呼叫 sendfile 函式(zero copy 方式)來匯出檔案,
    #對於普通應用,必須設為 on,
    #如果用來進行下載等應用磁碟IO重負載應用,可設定為 off,
    #以平衡磁碟與網路I/O處理速度,降低系統的uptime.
    sendfile        on;
    #tcp_nopush     on;
    #http長連結(client <-> nginx)逾時時間,請求完成之後連結保持的時間
    keepalive_timeout  65s;
    #types_hash_max_size越小,消耗的記憶體就越小,但散列key的衝突率可能上升
    types_hash_max_size 2048;
    #開啟gzip壓縮
    #gzip  on;
    #gzip_disable "MSIE [1-6].";
    #設定請求緩衝
    client_header_buffer_size    512k;
    large_client_header_buffers  4 512k;
    #允許使用者最大上傳資料大小,根據業務需求調整上傳檔案大小限制
    client_max_body_size 100M;
     
    upstream FR.com {
        #max_fails=n fail_timeout=m 表示m時間內逾時n次失敗嘗試,將會在接下來m時間內標記此節點不可用(m時間過後無論此節點是否啟動都會被重新標記為可用狀態)
        #其中fails為“失敗嘗試”,失敗嘗試由下面server配置中,proxy_next_upstream指令定義
        server 192.168.6.171:8080 max_fails=15 fail_timeout=300s;

        keepalive 300; 
        #其他server參數說明:
        #down 標記伺服器掛掉
        #backup 備份伺服器,當主伺服器(例如上面的95和96)不可用時才加入伺服器;
        #weight=number 權重,預設為1
        #內建負載均衡策略有ip hash、輪詢、加權輪詢(設定server的weight值)
        #ip_hash;
        #↓====================主動健康檢查模組配置====================↓#
        ## interval:向後端傳送的健康檢查包的間隔,單位ms。
        ## fall(fall_count): 如果連續失敗次數達到fall_count,伺服器就被認為是down
        ## rise(rise_count): 如果連續成功次數達到rise_count,伺服器就被認為是up。
        ## timeout: 後端健康請求的逾時時間,單位ms。
        ## type:健康檢查包的類型,現在支援tcp、udp、http類型
        #check interval=2000 rise=5 fall=10 timeout=10000 type=http;
        # 檢查請求, 7-16之前的persist版本,只能使用 /webroot/decision/system/info HTTP;
        #check_http_send "GET /webroot/decision/system/health HTTP/1.0 "; # 檢查請求
        #check_http_expect_alive http_2xx http_3xx; #該指令指定HTTP答覆的成功狀態,預設認為2XX和3XX的狀態是健康的。
        #↑====================主動健康檢查模組配置====================↑#
    }
    upstream WBS.com { 
        server 192.168.6.171:38888 max_fails=15 fail_timeout=300s;
        #這裏必須使用ip_hash
    ip_hash;
    }
    server {
        listen       8123; 
        server_name  192.168.6.181;
        #nginx預設不轉發帶底線的header,比如請求的header中有_device_這個header,轉發到負載伺服器時預設會丟棄
        #可以在http或者http -> server這兩個上下文中加入一條屬性
        underscores_in_headers on;
        #charset koi8-r;
        #access_log  logs/host.access.log  main;
        #↓====================主動健康檢查模組監測頁面====================↓#
        #location /status {
        #    healthcheck_status html;
        #}
        #↑====================主動健康檢查模組監測頁面====================↑#
        #根/下的請求預設轉發到的位置,即埠後面跟的請求全部轉發到如下反向代理
        location / {
            #對於HTTP代理,proxy_http_version指令應該設定為“1.1”,同時“Connection”頭的值也應被清空(如下proxy_set_header Connection "")
            proxy_http_version 1.1;
            #定義轉發到的伺服器(組)
            proxy_pass http://FR.com;
            #設定nginx轉發時轉發到下一個伺服器的條件,此處設定將未成功請求(proxy_next_upstream定義的40x, 50x等)傳遞到下一步進行處理
            # 失敗嘗試說明:50x和429在此配置會被當作fail,error,timeout並 invalid_header無論配置與否都被認為fail,http_403 and http_404配置與否都不是fail。
            # error:與後端伺服器建立連結、傳遞請求、讀取請求頭髮生的錯誤
            # timeout:與後端伺服器建立連結、傳遞請求、讀取請求頭逾時,設定在proxy_next_upstream_timeout和proxy_next_upstream_tries(預設值都是0)
            # invalid_header:伺服器傳回非法或者為空
            proxy_next_upstream http_500 http_502 http_503 http_504 http_403 http_404 http_429 error timeout invalid_header non_idempotent;
            #proxy_next_upstream_timeout 0;
            #proxy_next_upstream_tries 0;
            #重定向,參數off將在這個欄位中禁止所有的proxy_redirect指令
            proxy_redirect off;
            #請求頭的一些設定,文法proxy_set_header [field] [value];
            #$host為請求的主機名稱(即nginx代理伺服器), $server_port為主機埠(即nginx埠),如果有外網映射,這裏應改寫 外網地址:外網埠 形式(不要帶協定)
            proxy_set_header Host $host:$server_port;
            #這裏$remote_addr用戶端ip地址
            proxy_set_header X-Real-IP $remote_addr;
            #這裏$proxy_add_x_forwarded_for是代理層級,如果由多層代理,這裏就寫client,proxy1,proxy2,這裏應該是client即用戶端ip
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            #與後端伺服器的連結不需要保持
        proxy_set_header Connection "";
            #NGINX會緩衝來自代理伺服器的回应。回应儲存在內部緩衝區中,並且在收到整個回应之前不會傳送到用戶端。
            #緩衝有助於優化慢用戶端的效能,如果回应從NGINX同步傳遞到用戶端,則會浪費代理伺服器時間。
            #但是,當啟動緩衝時,NGINX允許代理伺服器快速處理回应,而NGINX將回应儲存的時間與用戶端下載它們所需的時間相同
            #是否開啟緩衝,預設開啟
            #proxy_buffering off;
            #設定緩衝區的大小為size
            #proxy_buffer_size     64k;
            #每個連結設定緩衝區的數量和大小,proxy_buffers [number] [size];
            #proxy_buffers         32 64k;
            #當開啟緩衝回应的功能以後,在沒有讀到全部回应的情況下,寫緩衝到達一定大小時,nginx一定會向用戶端傳送回应,直到緩衝小於此值
            #proxy_busy_buffers_size 64k;
            #連結到代理伺服器逾時時間,預設60s,不能超過75s
            #不宜太長或者太短,配合max_fails和fail_timeout設定
            #併發量高的情況下,伺服器壓力過大時容易出現逾時,可以考慮max_fails和fail_timeout設定大一點,減少nginx錯誤踢出節點的機率
            proxy_connect_timeout    75;
            #讀取逾時,預設60s,如果在逾時時間內伺服器未傳回任何資料,視為逾時。如果沒有大數據量計算或匯出的範本,則建議配置不超過100s,如果有大數據量計算或匯出的範本,則根據最長耗時的範本時間進行配置。
            proxy_read_timeout       400;
            #寫入逾時,預設60s,如果在逾時時間內伺服器未收到資料表示逾時,視為逾時。如果沒有大數據量計算或匯出的範本,則建議配置不超過100s,如果有大數據量計算或匯出的範本,則根據最長耗時的範本時間進行配置。
            proxy_send_timeout       400;
        }
        #定義404頁面
        #error_page  404              /404.html;
        # redirect server error pages to the static page /50x.html
        #定義50x頁面
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
    server {  
        #此處為websocket埠,如果是叢集部署,FineReport工程為38889,FineBI工程為48889
        listen 38889;              
    server_name 192.168.6.181;
        location / { 
             proxy_http_version 1.1;
             proxy_pass http://WBS.com;
             proxy_connect_timeout 75;
             proxy_read_timeout 400;
             proxy_send_timeout 400;
             
             #升級目標為$http_upgrade 值實際為websocket
     proxy_set_header Upgrade $http_upgrade;
             #Connection設定升級
     proxy_set_header Connection "upgrade";
             }
        }

2.4 開放埠

  • 若防火牆開啟,可關閉防火牆,或者單獨開放埠。

  • 若雲伺服器有安全組或者類似的內容,需要設定埠對外開放。

2.5 重啟工程

重啟 nginx 和 FineReport 工程。

重啟工程時,需要殺死工程下運作的進程,等待 2 分鐘埠釋放後,再重啟工程,否則有可能重啟失敗。

2.6 效果預覽

按照WebSocket轉發埠>>WebSocket埠的順序,即如果使用預設值埠,按照「38889,38888,39888」的順序依次嘗試監聽。

  • 如果有一個埠建立監聽成功,則不再嘗試其他埠。


  • 如果所有埠都無法與系統伺服器建立監聽,會進入部署精靈頁面,引導修改監聽埠列表,相關功能會受到影響。



附件列表


主題: 數據決策系統
已經是第一篇
已經是最後一篇
  • 有幫助
  • 沒幫助
  • 只是瀏覽
  • 圖片不清晰
  • 用語看不懂
  • 功能說明看不懂
  • 操作說明太簡單
  • 內容有錯誤
中文(繁體)

滑鼠選中內容,快速回饋問題

滑鼠選中存在疑惑的內容,即可快速回饋問題,我們將會跟進處理。

不再提示

10s後關閉

獲取幫助
線上支援
獲取專業技術支援,快速幫助您解決問題
工作日9:00-12:00,13:30-17:30在线
頁面反饋
針對當前網頁的建議、問題反饋
售前咨詢
業務咨詢
電話:0933-790886或 0989-092892
郵箱:taiwan@fanruan.com
頁面反饋
*問題分類
不能為空
問題描述
0/1000
不能為空

反馈已提交

网络繁忙