服务代理与 Nginx 反向代理配合使用 |
在 iPortal 中,您可以将服务代理和反向代理配合使用,为门户和服务的安全提供双重保障。其中,反向代理机制用于保障 iPortal 门户平台的安全,Nginx 代理服务器作为客户端与 iPortal 门户服务器间的屏障,负责接收并转发来自客户端的请求。代理服务器对外表现为一个服务器,客户端不知道内部网络其他服务器的存在,因此对内网服务器可以起到保护作用。iPortal 服务代理机制则提供门户级别的服务访问控制,在原始服务地址和代理服务地址间建立映射,使授权用户只能访问代理服务地址,隐藏原始服务地址,保护您注册服务的安全。
下面将详细介绍如何将服务代理与 Nginx 反向代理配合使用。首先,请确保您的 iPortal 开启了服务代理功能,具体配置信息请参见:服务代理配置。
接下来需要对 Nginx 反向代理服务器进行配置。
以 Windows 系统为例:
start nginx
退出 nginx 命令如下:
nginx -s quit
打开【nginx 安装路径】\conf\nginx.conf 文件,修改 http 节点下的 server 节点内容如下:
server {
listen 80;
server_name www.myiportal.com;
location /{
proxy_pass http://192.168.120.52:8190/;
proxy_set_header Host $host:80;
proxy_set_header X-Read-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
location /portalproxy/{
proxy_pass http://192.168.120.52:8195;
proxy_set_header Host $host:80;
proxy_set_header X-Read-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
保存上述修改,重启 nginx 使其生效。重启命令如下所示:
nginx -s reload
如果需要配置多个 iPortal 的反向代理,或需要同时配置多个 iServer 的反向代理,您可以通过在 nginx.conf 中配置多个 server 节点实现。
注意:如果 Nginx 代理后的 iServer 服务注册到 iPortal 门户中,该服务又经过了 iPortal 的服务代理,为了保证经过两次代理后的 iServer 服务能够正常访问,建议以上 Host 参数设置为:Host $http_host。
如果需要匹配多个服务地址,您可以通过在 nginx.conf 中配置多个 location 实现。
Nginx 默认允许客户端请求的最大单文件字节数为 1m,如果用户访问经过 Nginx 代理后的 iPortal,上传大的数据文件到门户中,此时 1m是远远不够的,建议修改为 1024m,即允许一次最大上传 1024m 大小的数据文件,您也可以根据具体的业务需求进行配置,具体做法如下:
打开【nginx 安装路径】\conf\nginx.conf 文件,在 http 节点下增加如下一行代码:
client_max_body_size 1024m;
client_max_body_size:表示客户端请求服务器最大允许大小,单位是兆。如果请求的数据量大于 client_max_body_size 中设置的值,HTTP协议会报错413: "Request Entity Too Large",因此当您上传的数据量较大时,需要将参数值改大。
注意:如果在完成以上配置后, iPortal 上传数据量较大的文件时仍卡顿,您需要继续修改 http 节点下 client_max_body_size 和 keepalive_timeout 的内容,设置更大的值,具体请参见:FAQ
要实现启用服务代理后的服务地址也被反向代理,同时隐藏代理服务端口,还需对 iportal.xml 文件进行配置,位于【SuperMap iPortal 安装目录】\webapps\iportal\WEB-INF 文件夹下。在 iportal.xml 配置文件中的<serviceProxy>节点下增加<proxyServerRootUrl>节点,设置反向代理服务的根地址。由于代理服务地址中 Host 主机有两种显示方式:域名或 IP,因此,<proxyServerRootUrl>节点有两种配置方式:
方式一:域名形式
<serviceProxy>
<enable>true</enable>
<port>8195</port>
<proxyServerRootUrl>http://www.myiportal.com[:port]</proxyServerRootUrl>
<httpConnPoolInfo>
<maxTotal>20</maxTotal>
<defaultMaxPerRoute>2</defaultMaxPerRoute>
</httpConnPoolInfo>
</serviceProxy>
方式二:IP 形式,此配置会使代理服务地址根据用户当前的网络环境,动态显示 ip 地址。
<serviceProxy>
<enable>true</enable>
<port>8195</port>
<proxyServerRootUrl>http://{ProxyHost}[:port]</proxyServerRootUrl>
<httpConnPoolInfo>
<maxTotal>20</maxTotal>
<defaultMaxPerRoute>2</defaultMaxPerRoute>
</httpConnPoolInfo>
</serviceProxy>
配置完成后,重启 iPortal 服务。
注意:以上两种配置方式中,[:port]变量表示端口,填写代理后的服务监听端口即可,可以为空,为空默认为 80 端口。
在完成以上配置后,您通过访问 Nginx 反向代理服务器的 ip 即可获得与访问原 iPortal 门户相同的内容,例如:http://192.168.120.40:80,其中,默认的 80 端口可以隐藏。启用服务代理后的服务根地址也将变成:http://192.168.120.40:80,从而也隐藏了服务代理端口“8195”。
在实际的业务应用中,如果您想使用域名访问 iPortal 门户和服务,那么您需要将 Nginx 反向代理服务器的 ip 绑定为域名,然后通过该域名访问反向代理后的门户,即 http://www.myiportal.com:80,同时,启用服务代理后的服务根地址也将变成:http://www.myiportal.com:80。