背景
使用iServer发布服务的时候经常会涉及到nginx代理,负载集群或者反向代理,都是常见的使用场景,下面就nginx代理iServer服务的一些问题做个简单总结。
代理iServer服务之基本配置
①配置upstream,负载集群配置
upstream iserver {
#ip_hash;
#hash $request_uri;
server 192.168.16.20.9:8090; #Apache
server 192.168.16.31:8090; #Apache
server 192.168.16.32:8090; #Apache
}
②配置location
location /iserver/{
proxy_pass http://iserver/;
proxy_set_header Host $host:$server_port;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
代理iServer服务之二级域名
iServer通过nginx代理后,地址名称一般都是iServer,那能否随意指定这个名称呢?答案是可以的,配合相关的替换规则即可
域名
location /iserver_3d/ {
proxy_pass http://iserver_3d/iserver/;
#Proxy Settings
proxy_redirect off;
proxy_set_header Host $host:8088;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
proxy_max_temp_file_size 0;
proxy_connect_timeout 300;
proxy_send_timeout 300;
proxy_read_timeout 600;
proxy_buffer_size 256k;
proxy_buffers 4 256k;
proxy_busy_buffers_size 256k;
proxy_temp_file_write_size 256k;
sub_filter_once off;
sub_filter_types *;
sub_filter 'http://localhost:8088/iserver/' 'http://localhost:8088/iserver_3d/';
}
代理iServer服务之三维场景服务
当使用iServer代理三维场景服务时,请求三维场景集合时,返回结果中会返回iServer内部地址,此时需要通过过滤配置来实现地址的替换
location /mapservices/{
proxy_pass http://192.168.16.151:8100;
proxy_set_header Host $host:$server_port;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_connect_timeout 60s;
proxy_send_timeout 60s;
proxy_read_timeout 60s;
client_max_body_size 100m;
#三维场景服务过滤配置
sub_filter_once off;
sub_filter_types *;
sub_filter 'http://192.168.16.151:8100/iserver/' 'http://www.supermap.com:8100/mapservices/iserver/';
}
代理iServer服务之会话保持(三维login)
当使用iServer代理三维场景服务时,且有多个iServer节点时,客户端加载场景服务会执行两次login请求,获得场景配置信息,两次login请求必须负载到同一个节点,否则会报错造成场景无法加载
nginx配置如下,增加一个login请求判断,login请求负载到会话保持配置,否则执行默认负载
upstream iserver {
#ip_hash;
#hash $request_uri;
server 192.168.16.20.9:8090; #Apache
server 192.168.16.31:8090; #Apache
server 192.168.16.32:8090; #Apache
}
upstream iserver_session {
#会话保持
ip_hash;
server 192.168.16.20.9:8090; #Apache
server 192.168.16.31:8090; #Apache
server 192.168.16.32:8090; #Apache
}
location /iserver/{
if ($request_uri ~ realspace/login.json) {
proxy_pass http://iserver_session;
break;
}
proxy_pass http://iserver;
proxy_ssl_session_reuse 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_connect_timeout 5s;
proxy_send_timeout 5s;
proxy_read_timeout 5s;
client_max_body_size 100m;
proxy_redirect default;
}
代理iServer服务之标绘服务
与三维场景服务一样,标绘服务代理时请求标号库也会遇到内部iServer地址暴露信息,与三维场景服务区别在于,标绘服务返回结果进行了压缩处理,配置替换规则时需要增加压缩配置,避免替换失败。
标绘服务
location /server/{
proxy_pass http://server/;
proxy_set_header Host $host:$server_port;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
#服务过滤配置,gzip压缩格式支持
proxy_set_header Accept-Encoding deflate;
#服务过滤配置
sub_filter_once off;
sub_filter_types *;
sub_filter 'http://www.test.com:80/iserver/output/SymbolIcon/' 'https://www.test.com:65533/server/iserver/output/SymbolIcon/';
sub_filter 'http://192.168.16.11:443/iserver/output/SymbolIcon/' 'https://192.168.16.11/server/iserver/output/SymbolIcon/';
}
代理iServer服务之负载IP显示
nginx代理iServer服务进行多节点负载时,前端调试过程中需要观察具体是哪个节点响应了请求,可在nginx中做如下配置
location /iserver/{
proxy_pass http://iserver;
proxy_ssl_session_reuse 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 X-Forwarded-Proto $https;
proxy_connect_timeout 5s;
proxy_send_timeout 5s;
proxy_read_timeout 5s;
client_max_body_size 100m;
proxy_redirect default;
# 显示具体负载的机器的ip,X-Route-Ip随便命名
add_header X-Route-Ip $upstream_addr;
add_header X-Route-Status $upstream_status;
}
代理iServer至OGC服务,替换xml内容失败
nginx代理iServer发布的OGC服务时,会涉及到替换xml中的内容问题,xml是压缩过的,参考上面步骤开启压缩及替换规则后,仍发现有替换失败现象发生(随机失败)
开启解压缩:gunzip on;
禁用压缩:gzip_disable ".";
location /mapservices/{
proxy_pass http://jetty;
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 X-Forwarded-Proto $scheme;
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
proxy_max_temp_file_size 0;
proxy_connect_timeout 3;
proxy_send_timeout 3;
proxy_read_timeout 3;
proxy_buffer_size 128k;
proxy_buffers 2 256k;
proxy_busy_buffers_size 256k;
index index.html index.htm;
#服务过滤配置,gzip压缩格式支持
#proxy_set_header Accept-Encoding deflate;
gunzip on;
gzip_disable ".";
#服务过滤配置
sub_filter_once off;
sub_filter_types *;
sub_filter 'http://127.0.0.1/iserver' 'http://127.0.0.1/mapservices/iserver';
}