反饋已提交
網絡繁忙
HTTP 是超文本传输协议,信息是明文传输的。HTTPS 协议是由 SSL+HTTP 协议构建的可进行加密传输、身份认证的网络协议,比 HTTP 协议安全。
可以通过两种方法在 HTTPS 环境中配置 WebSocket,下面将详细介绍。
方法一:如果没用 Nginx,可以直接在 Web 服务器上配置 SSL。
方法二:如果用了 Nginx 反向代理服务器,那么可以在 Nginx 上配置 SSL,而应用服务器如 Tomcat 不配置 SSL。这样客户端和 Nginx 之间走 https 通讯,Nginx 和 Tomcat 之间通过 proxy_pass 走 http 通讯。
注:JAR 包时间在 2019-12-05 之后的报表工程,支持在数据决策系统中,通过可视化界面设置 WebSocket 。详情请参见:常规 第三章
以 Windows 系统下使用方法一配置 WebSocket 为例。
搭建 HTTPS 环境的详细内容参见:配置SSL证书实现HTTPS访问。
在 FineDB 的 fine_conf_entity 表中添加以下 4 个参数项,参数信息如下表所示:
新增步骤请参见:报表内置HSQL数据库FineDB
WebSocketConfig.keyStore 和 WebSocketConfig.keyStorePassword 的配置如下图所示:
注:fine_conf_entity 表中的WebSocketConfig.keyStore的值必须是绝对路径,不可以是相对路径。
数据库表中新增信息如下图所示:
配置完成之后,重启报表服务器即可生效。
注:Https 配置 WebSocket 后,Http下 WebSocket 会请求不到。
以 Linux+Nginx+Tomcat 下使用方法二配置 WebSocket 为例。
注:非必要请勿使用自签名证书,使用自签名证书有可能会导致部分记录丢失,详情请参见 4.1 节。
注:已有证书的可以跳过该步骤。
1)安装 OpenSSL 并验证。
# yum install openssl openssl-devel
# openssl version -a
2)生成密钥文件 server.key。
# openssl genrsa -des3 -out server.key 2048
生成密钥文件时会要求设置密码,设置好密码后需要记住这个密码。
这样就生成了 server.key 文件。此后用到了该文件会经常要求输入密码。如 Nginx 加载了该 server.key,启动时会要求输入密码。
如果嫌麻烦,可以用以下命令生成 server.key,这样就不再需要输入密码。
# openssl rsa -in server.key -out server.key
3)生成服务器证书的申请文件 server.csr。
# openssl req -new -key server.key -out server.csr
Country Name 填 CN,Common Name 填主机名,不填的话浏览器会提示不安全,其余均可为空。
4)生成 CA 证书 ca.crt。
# openssl req -new -x509 -key server.key -out ca.crt -days 3650
CA证书用于给自己的证书签名。
5)生成服务器证书 server.crt。
# openssl x509 -req -days 3650 -in server.csr -CA ca.crt -CAkey server.key -CAcreateserial -out server.crt
6)查看生成的5个文件,其中 server.crt 和 server.key 就是 Nginx 需要的证书文件。
HTTP 默认端口是 80,HTTPS 默认端口是 443。
Nginx配置完整版:nginx-demo .conf
注意:修改 nginx.conf 后,重启 Nginx 时不要用 reload,要用 stop 和 start,否则配置可能不生效。
1)配置443端口
server { listen 443 ssl; server_name 192.168.5.232; ssl_certificate /mnt/hgfs/share/keys/server.crt; #证书绝对路径 ssl_certificate_key /mnt/hgfs/share/keys/server.key; #key绝对路径 ssl_session_cache shared:SSL:1m; #储存SSL会话的缓存类型和大小 ssl_session_timeout 5m; #会话过期时间 ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP; #为建立安全连接,服务器所允许的密码格式列表 ssl_prefer_server_ciphers on; #依赖SSLv3和TLSv1协议的服务器密码将优先于客户端密码 #禁止在header中出现服务器版本,防止黑客利用版本漏洞攻击 #server_tokens off; #如果是全站 HTTPS 并且不考虑 HTTP 的话,可以加入 HSTS 告诉浏览器本网站全站加密,并且强制用 HTTPS 访问 #fastcgi_param HTTPS on; #fastcgi_param HTTP_SCHEME https; location / { proxy_http_version 1.1; proxy_set_header Connection ""; proxy_buffering off; proxy_next_upstream http_500 http_502 http_503 error timeout invalid_header non_idempotent; proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 把 HTTPS 的协议告知容器(如tomcat),否则容器可能认为是 HTTP 的请求 proxy_set_header X-Forwarded-Proto $scheme; proxy_connect_timeout 20; proxy_read_timeout 1000; proxy_send_timeout 300; proxy_pass http://FR.com; }
2)配置 WebSocket 端口
WebSocket 配置 HTPPS 很容易出问题,集群启动后,可在智能运维>内存管理中,看实时内存图是否显示。
server { listen 38889 ssl; server_name 192.168.5.232; ssl_certificate /mnt/hgfs/share/keys/server.crt; ssl_certificate_key /mnt/hgfs/share/keys/server.key; ssl_session_cache shared:SSL:1m; ssl_session_timeout 5m; ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP; ssl_prefer_server_ciphers on; location / { proxy_request_buffering off; proxy_buffering off; proxy_connect_timeout 20; proxy_read_timeout 1000; proxy_send_timeout 300; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_pass http://WBS.com; } }
Nginx 转发默认监听38889端口,节点的 WebSocket默认监听38888端口,可自行修改。转发端口是fine_conf_entity表中的字段WebSocketConfig.requestPorts,且支持配置多个端口进行多次转发,如下所示:
id
value
转发端口可直接在前台进行配置,可参考文档:常规 第三章
注:2019-09-27 及之前版本的 JAR 包,转发端口生效字段是 WebSocketConfig.requestPort 且只支持一个端口。如下所示:
3)配置 HTTP 强转 HTPPS
rewrite ^(.*)$ https://$server_name$1 permanent;
4)Nginx 跨域设置
add_header access-control-allow-Headers X-Requested-With;add_header access-control-allow-Methods GET,POST,OPTIONS;
注:Nginx 跨域配置不能加上「add_header access-control-allow-Origin *;」这个前端应该是已经有过配置,增加会导致前端无法选择跨域配置,而导致错误。
1)问题描述
使用方法二进行配置后,火狐浏览器访问还是空白,IE 浏览器访问模板没有记录。
这是因为自签名的证书不被浏览器信任,页面能访问是因为手动添加了例外,但是38888端口没有,所以浏览器拦截了 Socket 请求。
2)解决方案
F12看一下拦截的请求,复制下来,直接访问一下38888端口添加安全例外或者手动添加。
这样浏览器就可以查看实时内存了,如下图所示:
采用方法二配置 WebSocket,由于现在 WebSocket 采用的是 netty-socketio,它有一个问题就是需要另开一个新的端口,在一些特定情况下,客户出于安全考虑或者其他原因,不能为工程多开一个端口,这种情况下后台的 Socket 服务不能成功启动,造成 Socket 连接失败,从而导致平台的部分功能使用有问题。
那么如何在只开放一个端口的情况下解决上述问题呢?
在 FineDB 的 fine_conf_entity 表中添加一个参数项:
注:2019-09-27及之前版本的JAR包,转发端口生效字段是WebSocketConfig.requestPort且只支持一个端口,如下所示:
Nginx 监听 server 下加上如下内容:
...server { listen 80;#监听端口,这个要和上面的WebSocketConfig.requestPort一致 server_name _; underscores_in_headers on; location / { proxy_http_version 1.1; proxy_pass http://FR.com; proxy_next_upstream http_500 http_502 http_503 http_504 error timeout invalid_header non_idempotent; proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Connection ""; #proxy_set_header X-Forwarded-Proto "https"; proxy_connect_timeout 20; proxy_read_timeout 1000; proxy_send_timeout 300; } #这里匹配/socket.io/转发给websocket的upstream location ^~ /socket.io/ { proxy_pass http://WBS.com; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_connect_timeout 20; proxy_read_timeout 1000; proxy_send_timeout 300; } ...}...
最后重启 Nginx 和报表工程即可。
10.0下 HTTPS 环境若不配置 WebSocket,那么智能运维的实时内存图表空白,而且平台会登录信息失效,如下图所示:
按照上述方法配置 WebSocket 后,重启 Tomcat 服务器,智能运维的实时内存就可以正常显示了,如下图所示:
文 檔回 饋
滑鼠選中內容,快速回饋問題
滑鼠選中存在疑惑的內容,即可快速回饋問題,我們將會跟進處理。
不再提示
10s後關閉