作者:xiaoyan
场景:在前端加载iServer服务时,如遇到需要同时加载多个REST地图服务,可能会出现加载性能不理想的情况,但此时查看iServer所在服务器,并未达到性能瓶颈。
排查:将前端加载的地图服务,作为Web数据源,在iDesktop或者iDesktopX打开,缩放浏览,查看加载效率,若加载效率与浏览器端有不同,则可以采用下文中提到的解决方案。
原因:浏览器端针对同一个域名下的请求有限制,同一时间针对同一域名下的地址,请求不会超过六个,而在实际应用场景中,加载多个地图服务,每张地图瓦片都需要构建一个请求,这时候针对iServer的请求数量会增多,且受浏览器限制不会同时到达iServer,导致加载速度缓慢。
解决:
方案A:通过iServer开启多进程功能,不同地图服务会放置到不同端口下,如果是不同端口的话就等于是不同域名,从而解决该问题。
实现:查阅iServer帮助文档单机多进程功能开启
帮助文档地址:iServer帮助文档
搜索关键词:配置使用单机多进程
方案B:通过Nginx做反向代理,在Nginx上开启多个端口,同时将多个端口下的请求合并转发到iServer端,同样能实现加载时不同域名的效果。
工具:nginx(安装教程)
openssl (通常Linux发行版都会自带openssl命令,也可使用openssl for windows)
非https 配置方式:利用 Nginx 服务搭建子域环境提升二维地图加载性能
https配置方式:
第一部分:
为iServer与Nginx获取ssl证书,可从腾讯云,阿里云等服务提供商处获取,从服务商处获取相关使用说明,部分为付费服务,若内网使用可采用本文方法自建CA,生成自签名证书,内部使用。
步骤1:首先我们生成CA证书与秘钥
openssl genrsa -des3 -out ca.key 4096
genrsa:生成RSA私钥
-des3:通过des3的方式对私钥进行加密,如果省略这个参数,就不需要输入密码了。
-out ca.key 输出文件与文件路径,只写文件名会输出到执行openssl命令的目录下,下同
4096:生成key的长度
该步骤执行后需要设置key密码,根据提示输入
openssl req -new -x509 -days 365 -key ca.key -out ca.crt
req:请求创建证书
-new:创建新的证书
-x509:直接使用 x509 产生新的自签名证书,如果不加这个参数,会产生一个“证书签名请求”而不是一个证书。
-days 365:证书过期时间,单位为天,可根据需要修改
-key 文件名:使用哪份私钥创建证书,输入上文中 -out 参数填入的内容,会被提示输入私钥设置的密码;
-out 输出证书的名称与路径
这一步需要填写证书信息,Organization Name和Common Name需要留意,之后还有需要创建证书的步骤,请确认这一步不要与接下来步骤中输入的信息重复,信息的真实性是不会被验证的。
步骤2:
之后为iServer创建证书,iServer证书需要pem格式,若iServer已经通过JSSE方式keytool命令配置为https加密通信,请通过openssl重新配置。
openssl genrsa -out server.key 4096
命令同上,这一步可选-des3参数,考虑需不需要密码。
接下来根据该key生成一个证书请求
openssl req -new -key server.key -out server.csr
请注意该步骤中填写信息时Organization Name不要与上一步中一致,Common Name为必填项,可以任意填写域名。
之后通过CA对server证书进行签名
openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -set_serial 01 -out server.crt
x509:证书格式
-in server.csr 使用上文生成的证书请求进行签名
-CA:使用CA进行签名
-Cakey: 上文中创建的ca.key文件路径
-set_serial 01:签发的序列号,如果证书有过期时间的话,过期之后,可以直接用这个 .csr 修改序列号重新签一个,不需要重新生成 .csr 文件;
以下命令用于验证生成的证书
openssl verify -verbose -CAfile ca.crt server.crt
之后利用相同的步骤为nginx生成证书请求,key,对证书进行签名。
openssl genrsa -out client.key 4096
openssl req -new -key client.key -out client.csr
openssl x509 -req -in client.csr -CA ca.crt -CAkey ca.key -set_serial 01 -out client.crt
此时我们一共拥有8个文件
确认无误后进行第二部分配置
第二部分:
iServer配置部分:
找到iServer根目录/conf/server.xml
配置Connector节点
<Connector port="443" protocol="HTTP/1.1"
relaxedQueryChars="[]|{}"
relaxedPathChars="[]|{}"
SSLEnabled="true"
maxThreads="150"
scheme="https"
secure="true"
URIEncoding="utf-8"
clientAuth="false"
SSLCertificateFile="/opt/Web/server.crt"
SSLCertificateKeyFile="/opt/Web/server.key"
SSLPassword="xiaoyan"
sslProtocol="TLS"
sslEnabledProtocols="TLSv1.2"/>
port输入期望iServer开放的端口号
SSLCertificateFile与SSLCertificateKeyFile节点填入第一部分中生成的server.crt、server.key文件绝对路径,SSLPassword输入key的密码
之后重启iServer,确认iServer正常启动。
Nginx配置部分:
找到nginx根目录/conf/nginx.conf
编辑server
server {
listen 8443 ssl;
listen 8444 ssl;
listen 8445 ssl;
server_name 127.0.0.1 47.107.237.127;
ssl_certificate /opt/Web/client.crt;
ssl_certificate_key /opt/Web/client.key;
ssl_client_certificate /opt/Web/ca.crt;
ssl_verify_client off;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
proxy_pass https://47.107.237.127;
proxy_ssl_certificate /opt/Web/server.crt;
proxy_ssl_certificate_key /opt/Web/server.key;
proxy_ssl_trusted_certificate /opt/Web/ca.crt;
proxy_ssl_verify on;
proxy_ssl_verify_depth 2;
proxy_ssl_session_reuse on;
proxy_ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
proxy_ssl_ciphers HIGH:!aNULL:!MD5;
# root html;
# index index.html index.htm;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
listen : nginx监听端口,根据需求开放多个端口请写入多个listen。
ssl_certificate
ssl_certificate_key
ssl_client_certificate 对应上文中生成的文件
proxy_pass iServer地址
proxy_ssl_certificate
proxy_ssl_certificate_key
proxy_ssl_trusted_certificate 对应上文中生成的文件 填入绝对路径
之后访问Nginx开放端口,查看是否能正常访问到反向代理的iServer,查看地图服务等是否能够正常预览。
参考阅读:
iClient for WebGL中如何加载多子域服务
iClient for Leaflet&Openlayers&Classic&MapboxGL中如何加载多子域服务
Nginx proxy_pass代理https服务请求原理拆解