什么是服务器集群?
服务器集群就是指将很多服务器集中起来一起进行同一种服务,在客户端看来就像是只有一个服务器,集群可以利用多个计算机进行并行计算从而获得很高的计算速度,也可以用多个计算机做备份,从而使得任何一个机器坏了整个系统还是能正常运行。一旦在服务器上安装并运行了群集服务,该服务器即可加入集群。群集化操作可以减少单点故障数量,并且实现了群集化资源的高可用性。
为什么要实现服务器集群?
实现服务器集群主要是为了负载均衡(有两台以上的服务器或者站点提供服务)服务器服务将来自客户端的请求,基于某种算法,尽量平分请求到集群的机器中,从而避免一台服务器因为负荷太高而出现故障或导致计算缓慢,集群部署GEOSERVER能够提高请求瓦片的响应速度和WFS数据的请求速度。
软件准备
1.apache-tomcat8
2.geoserver.war
3.nginx软件
说明:tomcat需要下载linux版本,下载地址
https://tomcat.apache.org/download-80.cgi
geoserver下载实现包
http://geoserver.org/release/stable/
3.nginx软件可以下载后上传到服务器,也可以直接用linux命令下载。这里推荐使用linux命令下载,稍后将会介绍。
部署说明
生产环境下geoserver集群的部署应该是一个节点一个机器,如nginx服务器,geoserver node1服务器,geoserver node2服务器,geoserver node2服务器,文件服务器,数据库服务器等来组成linux集群。但是在本次讲解中因为只有一台liunx服务器节点,所以我将其都部署在了同一个机器上,用不同的端口号来进行区分,如果你拥有多台机器,则可以不用修改端口号。
在本次部署中我为各个节点分配的端口为:
1.nginx负载均衡服务器-------------9090端口
2.geoserver node1 ------------------9091端口
3.geoserver node2 ------------------9092端口
4.geoserver node3 ------------------9093端口
部署过程
1.准备tomcat,更改服务端口
在linux服务器上适当位置创建目录“geoserver”,下载三个tomcat8服务器软件并解压到目录中,如下图所示
此处我已将三个tomcat服务器的名称重命名为了占用端口的名称
如果不熟悉liunx上tomcat8的部署,参考博客:
Linux系统(Centos)安装tomcat和部署Web项目
https://blog.csdn.net/qq_21077715/article/details/85541685
更改每一个tomcat服务器的服务端口
以tomcat-9091为例
在server.xml中
修改这三处端口即可。
为什么是+1,这是为了区分几个tomcat服务器使用的不同端口,同理,node2是+2,node3是+3。
2.设置tomcat允许跨域
把如下这段,添加在每一个tomcat安装目录下 conf > web.xml中,(我是添加在 589行左右)。
CorsFilter
org.apache.catalina.filters.CorsFilter
cors.allowed.origins
*
CorsFilter
/*
这么做是为了在使用不同源的服务器访问服务时依然可以正常访问,不会出现No ‘Access-Control-Allow-Origin’ 的情况,要不要设置,视具体情况而定。
3.嵌入geoserver
将geoserver.war上传至每个节点下的webapps目录下。
当tomcat服务器启动后,会自动将war包解压为web项目,此处我之前已经解压过了一遍,所以“geoserver”已经存在了。
4.启动三个tomcat服务器
分别在在bin/下执行
sh startup.sh
启动后会自动将geoserver.war包解压为web项目geoserver
5.测试geoserver各个节点是否已经启动
在浏览器中输入 ip:9091/geoserver/,进入如下页面则代表成功:
同理去测试另外两个geoserver子节点。
6.为三个geoserver子节点配置数据同步
虽然我们现在已经启动了三个geoserver服务,但是其服务并没有同步,想要三个子节点同时提供一个服务,还需要去三个geoserver的web管理页面配置三个相同的服务,如果节点数很多,这是非常麻烦且不方便的。
所以我们要将三个geoserver节点的数据目录设置为统一的目录,不再使用各个节点默认的单独的目录。最好的方式是将该目录设置到一台NFS文件服务器上,但此处因为我们只有一台机器,我们就创建一个统一的数据目录,命名为GEOSERVER_DATA_DIR。
我们还需要将每个geoserver的数据目录重新指定一下:
geoserver/tomcat-9091/webapps/geoserver/WEB-INF/web.xml
编辑web.xml
设置统一的数据目录
<--
<context-param>
<param-name>GEOSERVER_DATA_DIR</param-name>
<param-value>C:\eclipse\workspace\geoserver_trunk\cite\confCiteWFSPostGIS</param-value>
</context-param>
-->
<context-param>
<param-name>GEOSERVER_DATA_DIR</param-name>
<param-value>\GEOSERVER_DATA_DIR</param-value>
</context-param>
保存。
重启三个tomcat服务器。
此时在其中一个节点中发布了服务,其他节点也会同步服务,因为他们的数据目录是一致的。
比如说我在9091节点上发布了图层aerial,在9092,9093上都会同步。
至此,三个geoserver节点的配置完成。
7.配置nginx集群
7.1安装依赖包
//一键安装上面四个依赖
yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel
7.2.下载并解压安装包
//创建一个文件夹
cd /usr/local
mkdir nginx
cd nginx
//下载tar包
wget http://nginx.org/download/nginx-1.13.7.tar.gz
tar -xvf nginx-1.13.7.tar.gz
7.3.安装nginx
//进入nginx目录
cd /usr/local/nginx
//进入目录
cd nginx-1.13.7
//执行命令
./configure
//执行make命令
make
//执行make install命令
make install
7.4.配置nginx.conf
# 打开配置文件
vi /usr/local/nginx/conf/nginx.conf
将端口号改成9090
localhost修改为你服务器ip地址。
如下所示,其中server节点指向真实的GeoServer地址
upstream mygeoserver {
ip_hash;
server 服务器ip:9091;
server 服务器ip:9092;
server 服务器ip:9093;
}
server {
listen 9090;
server_name 服务器ip;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
#root html;
#index index.html index.htm;
proxy_pass http://mygeoserver;
}
#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;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}
其中“ip_hash”的作用是支持session,使其能够访问同一个地址,如果您部署的集群服务有多个GeoServer,但始终在各GeoServer登录页跳来跳去,而无法进入管理页面,那么就是缺少“ip_hash”。
设置了“ip_hash”后,会固定该用户访问的节点ip。
然后在http的server节点中添加location配置,如下所示,其中proxy_pass配置路径转发:
location / {
proxy_pass http://mygeoserver;
}
7.5.启动nginx
/usr/local/nginx/sbin/nginx -s reload
或
/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
查看nginx进程是否启动:
ps -ef | grep nginx
进入安装目录中,
命令: cd /usr/local/nginx/sbin
启动,关闭,重启,命令:
./nginx 启动
./nginx -s stop 关闭
./nginx -s reload 重启
7.6检查nginx是否正常占用9090端口
lsof -i:9090
出现如下内容,则表示正常启动
如果什么也没出现,则表示配置文件没有生效,nginx默认占用80端口。检查nginx.conf文件。
7.7用nginx访问geoserver web管理页面
浏览器输入
http://服务器ip:9090/geoserver
进入geoserver web管理页面,刷新几次没有问题,则可以验证用nginx反向代理的geoserver集群配置成功。
8.发布wms服务,并用nginx反向代理服务器的地址提供服务
随机进入一个节点,或者通过nginx进入web管理页面,发布一个wms服务。
在前端页面中编写如下代码(cesium调用wms服务)
var aerial = new Cesium.WebMapServiceImageryProvider({
url: 'http://服务器ip:9090/geoserver/cluster_test/wms',//使用nginx代理
layers: 'cluster_test:aerial',
parameters: {
service: 'WMS',
format: 'image/png',
transparent: true
}
});
viewer.imageryLayers.addImageryProvider(aerial);