https下如何配置iServer子域提升前端加载服务速度

作者: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个文件

  • ca.key
  • ca.crt
  • server.key
  • server.csr
  • server.crt
  • client.key
  • client.csr
  • client.crt

确认无误后进行第二部分配置

第二部分:
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服务请求原理拆解

你可能感兴趣的:(WebGIS,云GIS,三维GIS,https,前端,服务器)