背景
虽然目前使用ArcGIS Server发布地图服务既方便又好用,而且公司开发人员也熟悉这个,能避免很多麻烦,但是数字政府的相关项目总是要求使用国产化或者开源的产品。这中间就会存在风险和隐患,没人较真还好,万一有人给你抬杠还真是麻烦大了。所以为保险起见,我就开始找ArcGIS的替代品,于是便想起了GeoServer。之前搞过windows环境的Geoserver,效果还不错,但项目上申请服务器资源都是有限制的而且很抠门,因此还是尽量不要为了发布地图服务而单独申请一台Windows服务器。于是想尝试能不能把GeoServer也搞到Linux环境。
方案
系统环境为Linux,GeoServer部署在Tomcat下,而PostGIS数据库部署在dockers当中。(之前想过把GeoServer也搞到dockers下的,但是没成功。)
GeoServer部署
Java环境部署
GeoServer是基于java开发的,所以无论是Windows还是Linux都需要java环境(dockers下的不清楚需不需要)。
jdk,我用的是jdk8u281这个版本:
大家也可以到oracle官网下载或者去华为云下载:https://repo.huaweicloud.com/java/jdk/
先把jdk放到Linux系统下(winscp,xftp都行),然后再把jdk解压到/usr/local/java下
// 没有这个文件夹就先建一个
mkdir /usr/local/java
//然后解压到该文件夹
tar -zxvf jdk-8u281-linux-x64.tar.gz -C /usr/local/java/
然后添加环境变量:
//打开环境配置文件
vi /etc/ profile
//在最后加入以下内容
#set java environment
JAVA_HOME=/usr/local/java/jdk1.8.0_281/
JRE_HOME=$JAVA_HOME/jre
CLASS_PATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib
PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin
export JAVA_HOME JRE_HOME CLASS_PATH PATH
保存修改并退出,然后更新配置
source /etc/profile
测试jdk是否部署成功:
java -version
看到如下信息即表示JDK装好了:
Tomcat部署
首先到官网下载:http://tomcat.apache.org/download-80.cgi
本文用的版本:
利用工具将安装包传输到Linux中,然后解压到/usr/local下:
//然后解压到该文件夹
tar -zxvf apache-tomcat-8.5.84.tar.gz -C /usr/local/
//修改tomcat文件夹的名称,这步可以不做。这里修改只是为了后面配置环境变量时路径名成能短些。
mv /usr/local/apache-tomcat-8.5.84 /usr/local/tomcat
然后添加如下环境变量(打开环境变量的配置文件参考jdk安装)
#set tomcat enviroment
export CATALINA_HOME=/usr/local/tomcat
export CLASSPATH=.:$JAVA_HOME/lib:$CATALINA_HOME/lib
export PATH=$PATH:$CATALINA_HOME/bin
保存修改并退出,然后更新配置(参考jdk安装)
进入toncat的bin目录:
cd /usr/local/tomcat/bin
启动tomcat:
./startup.sh
//另外若要重启tomcat,则可先关闭再启动,关闭命令如下
./shutdown.sh
在浏览器地址栏输入“ip:8080"即可访问tomcat页面,若能访问则表示安装成功:
若连接不上一般是端口没开或8080端口已经被别的程序用了。对于端口没开,可以利用如下命令打开:
firewall-cmd --zone=public --add-port=8080/tcp --permanent && firewall-cmd --reload && firewall-cmd --list-ports
对于8080端口被占用,可以修改tomcat的配置文件:
vi /usr/local/tomcat/conf/server.xml
修改这两处的端口号即可(有的帖子说只修改上面的那个端口号就行,但为了保险起见,我都改了)
然后保存修改,再用”ip:新端口号“访问即可。
GeoServer部署
可以到该网站下载:https://sourceforge.net/projects/geoserver/files/GeoServer/2.17.5/
注意一定要下载war包,如果想要旧版本的可以点击上方目录中的GeoServer字样,退回上级目录,找到自己想要的版本。
下载好后把文件解压出来,将war后缀的文件放到tomcat目录的webapps文件夹下即可。下图中的geoserver是重启tomcat后自动生成的,所以不要手动创建。(不放心可以把压缩包中的其他文件或文件夹也一起放到该目录下。)
重启tomcat即可:
systemctl restart tomcat
然后访问:ip:6060/geoserver 即可。(tomcat下的geoserver端口无需另外指定,直接用tomcat的即可。)
Postgis数据库部署
目前在国内网络的帖子上一共找到两种dockers的镜像:一是postgis/postgis,二是kartoza/postgis。第一种我安装失败了,装完测试连接成功但打开数据库报错,最后是安装的第二种。(顺便一提kartoza/geoserver是dockers版本的Geoserver,但这个我安装完访问不了。我看整个镜像大小为1.4G左右,应该是包含了依赖环境的,毕竟前面tomcat版的才100多M,所以具体是啥原因没搞成也不得而知。)
假如你的服务器能联网,直接用以下命令即可下载dockers镜像:
//这样子表示安装9.6的postgresql和2.4的postgis,后者算是前者的一个插件,具体知识可以网上搜索postgis,看看科普就知道了。
//根据网上其他帖子的说法我们还可以用:11.0-2.5、10.0-2.4
docker pull kartoza/postgis:9.6-2.4
利用docker images命令查看下载好的镜像
假如服务器不能联网,那么先在能联网的服务器上下载好镜像,然后将镜像导出,用如下命令:
//格式:docker save <repository>:<tag> -o 自定义文件名.tar
docker save kartoza/postgis:9.6-24 -o postgis.tar
导出文件如下:
把tar包拷到你的目标服务器,用如下命令载入即可:
docker load -i postgis.tar
获得镜像后,是进行安装,docker安装很简单,只需要一个命令即可:
// -name:是安装后的容器名,可自定义
// POSTGRES_USER,超管用户名一般是postgres
// POSTGRES_PASSWORD,超管密码,自定义
// ALLOW_IP_RANGE ,这个有啥用不太理解,猜测是允许远程连接的IP范围?
// -p 使用的端口号,前面是映射端口号,后面是postgis原始配置的端口号,默认都是5432
// /opt/postgres_data/data:/var/lib/postgresql/data,表示将postgis在docker内部的数据文件夹路径:/var/lib/postgresql/data,映射到服务器上的/opt/postgres_data/data路径下(后者可自定义,不过得先创建该文件夹)。
// kartoza/postgis:9.6-2.4就是你要安装的镜像名称
docker run -t --name postgresql --restart always -e POSTGRES_USER='postgres' -e POSTGRES_PASSWORD=12345 -e ALLOW_IP_RANGE=0.0.0.0/0 -p 5432:5432 -v /opt/postgres_data/data:/var/lib/postgresql/data -d kartoza/postgis:9.6-2.4
安装好后记得打开5432端口,不然从外部访问不到数据库:
firewall-cmd --zone=public --add-port=5432/tcp --permanent && firewall-cmd --reload && firewall-cmd --list-ports
查看已安装好的postgis:
docker ps -a
结果:
然后可以利用navicat或者pgadmin4连接一下,能连上并打开数据库,然后执行sql也没问题则表示安装成功。
顺便提一句,刚才我安装的是postgresql 9.6和postgis 2.4,经测试用postgresql 10的客户端,也就是pgAdmin 4也是可以连上的,而且用 10对应的postgis的数据导入工具是可以成功将shp文件导入到9.6的库的,栅格文件没有测试过,但大概率是可以的。总结来说就是:postgresql 10的客户端及其对应的空间数据导入工具是可以兼容旧版本数据库的。