Ubuntu环境QGIS Server部署指南
1 简介
QGIS是开源GIS软件,有桌面版(QGIS Desktop)和服务端(QGIS Server)两个版本,桌面版可用于GIS数据的可视化以及生产加工,QGIS Server用于地图服务器,发布标准WMS、WFS等协议的地图数据,本文记录了Ubuntu操作系统下QGIS Server的配置流程。
2 QGIS安装与配置
Ubuntu默认仓库中的QGIS版本比较老,为安装最新版本,要将QGIS仓库加入到Ubuntu镜像源列表中。
wget -qO - https://qgis.org/downloads/qgis-2021.gpg.key | sudo gpg --no-default-keyring --keyring gnupg-ring:/etc/apt/trusted.gpg.d/qgis-archive.gpg --import
sudo chmod a+r /etc/apt/trusted.gpg.d/qgis-archive.gpg
sudo add-apt-repository "deb https://qgis.org/ubuntu $(lsb_release -c -s) main"
更新镜像源
sudo apt update
安装QGIS-Server
sudo apt install qgis
安装完后用下面命令测试一下
/usr/lib/cgi-bin/qgis_mapserv.fcgi
有以下输出表示安装成功(不同版本的QGIS Server输出略微不同,有一些版本可能输出状态码为400)
3 Nginx安装与配置
要输出WMS、WFS等OGC标准服务,我们还要在QGIS Server之上搭建Web服务器,用来和前端交互。有两种选择:Apache和Nginx,这里选择了Nginx的部署方式。
3.1 Nginx安装
首先安装Nginx
sudo apt install nginx
3.2 systemd配置
QGIS Server进程的管理需要使用FastCGI,Nginx本身并不直接使用FastCGI。有三种解决方法:
- spawn-fcgi
- fcgiwrap
- systemd
这里我们采用systemd的方式,优点是无需安装其它组件,同时具有较好的效率和稳定性。
基于systemd部署依靠两个单元:Socket单元和Service单元。Nginx用Scoket单元和QGIS Server交互,Serbvice单元定义了QGIS Server进程属性。先新建一个Socket单元:
vim /etc/systemd/system/qgis-server@.socket
文本内容如下:
[Unit]
Description=QGIS Server Listen Socket (instance %i)
[Socket]
Accept=false
ListenStream=/var/run/qgis-server-%i.sock
SocketUser=www-data
SocketGroup=www-data
SocketMode=0600
[Install]
WantedBy=sockets.target
注意上面的SocketUser和SocketGroup要和Nginx的用户保持一致(默认是www-data),如果改成root,那么Nginx子进程将无法使用socket和QGIS Server通信了,会提示Permission Denied。
接着创建Service单元:
vim /etc/systemd/system/qgis-server@.service
内容如下:
[Unit]
Description=QGIS Server Service (instance %i)
[Service]
User=www-data
Group=www-data
StandardOutput=null
StandardError=journal
StandardInput=socket
ExecStart=/usr/lib/cgi-bin/qgis_mapserv.fcgi
EnvironmentFile=/etc/qgis-server/env
[Install]
WantedBy=multi-user.target
同样要注意User和Group是www-data,以及StandardInput是socket。同时定义了环境变量文件为/etc/qgis-server/env
,env文件模板如下:
QGIS_PROJECT_FILE=/etc/qgis/myproject.qgs
QGIS_SERVER_LOG_STDERR=1
QGIS_SERVER_LOG_LEVEL=3
其中QGIS_PROJECT_FILE指定了默认的地图文件,后续请求时如果不指定MAP参数,将自动请求这里的默认数据。QGIS_SERVER_LOG_STDERR和QGIS_SERVER_LOG_LEVEL分别指定了输出标准错误和输出日志。
Socket和Service都配置好之后就可以启动了,进程数可以按实际CPU数量来分配,这里配置为2个进程。在shell终端输入以下命令:
for i in 1 2; do systemctl start --now qgis-server@$i.socket; done
for i in 1 2; do systemctl start --now qgis-server@$i.service; done
3.3 更新Nginx配置文件
将以下内容添加到Nginx的配置文件中:
upstream qgis-server_backend {
server unix:/var/run/qgis-server-1.sock;
server unix:/var/run/qgis-server-2.sock;
}
server {
…
location /qgisserver {
gzip off;
include fastcgi_params;
fastcgi_pass qgis-server_backend;
}
}
重启Nginx使配置生效
systemctl restart nginx
3 数据验证
下载QGIS官方提供的样例数据
mkdir /home/qgis/projects/
cd /home/qgis/projects/
wget https://github.com/qgis/QGIS-Training-Data/archive/release_3.22.zip
unzip release_3.22.zip
mv QGIS-Training-Data-release_3.22/exercise_data/qgis-server-tutorial-data/world.qgs .
mv QGIS-Training-Data-release_3.22/exercise_data/qgis-server-tutorial-data/naturalearth.sqlite .
发送WMS服务请求(127.0.0.1可替换为实际的domain或者host IP):
http://127.0.0.1/qgisserver?
MAP=/home/qgis/projects/world.qgs&
LAYERS=countries&
SERVICE=WMS&
VERSION=1.3.0&
REQUEST=GetMap&
CRS=EPSG:4326&
WIDTH=400&
HEIGHT=200&
BBOX=-90,-180,90,180
如果能在浏览器中看到以下内容,说明QGIS Server配置成功了!
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
· 上周热点回顾(2.17-2.23)