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配置成功了!

posted @   g2012  阅读(1426)  评论(3编辑  收藏  举报
相关博文:
阅读排行:
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
· 上周热点回顾(2.17-2.23)
点击右上角即可分享
微信分享提示