==============
Py-QGIS-Server
==============
`Py-QGIS-Server `_ has been designed to manage QGIS Server map processes.
Pre-requirements
================
We supposed, you already have installed QGIS Server packages, as explain in the
`QGIS Server documentation `_.
.. note::
You do not need to read the web server configuration about Nginx/Apache in the documentation from QGIS.
Because Py-QGIS-Server has its **own** web server.
Install in a Python venv
========================
We add needed packages not provided with QGIS Server :
.. code-block:: bash
apt install python3-venv python3-psutil
Then, we create the Py-QGIS-Server virtual environment and install ``py-qgis-server`` with pip :
.. code-block:: bash
set -e
python3 -m venv /opt/local/py-qgis-server --system-site-packages
/opt/local/py-qgis-server/bin/pip install -U pip setuptools wheel pysocks typing py-qgis-server
Py-QGIS-Server is installed.
Configuration and associated files
===================================
Folders used below
------------------
.. code-block:: bash
mkdir -p /srv/qgis/plugins /srv/qgis/config /var/log/qgis /var/lib/py-qgis-server /var/data
The file to watch for restarting workers
----------------------------------------
We create an empty file that will be watch by Py-QGIS-Server to check when to restart QGIS Server map workers.
.. code-block:: bash
touch /var/lib/py-qgis-server/py-qgis-restartmon
chmod 664 /var/lib/py-qgis-server/py-qgis-restartmon
The bash file to restart workers
--------------------------------
We create the executable file :file:`/usr/bin/qgis-reload` to restart QGIS Server map workers. It will contain:
.. code-block:: bash
#!/bin/bash
touch /var/lib/py-qgis-server/py-qgis-restartmon
Then we when change its mod :
.. code-block:: bash
chmod 750 /usr/bin/qgis-reload
The configuration file
----------------------
We create the Py-QGIS-Server configuration file :file:`/srv/qgis/server.conf`. It will contain:
.. code-block:: bash
#
# Py-QGIS-Server configuration
# https://docs.3liz.org/py-qgis-server/
#
[server]
port = 7200
interfaces = 127.0.0.1
workers = 4
pluginpath = /srv/qgis/plugins
timeout = 200
restartmon = /var/lib/py-qgis-server/py-qgis-restartmon
[logging]
level = info
[projects.cache]
strict_check = false
rootdir = /srv/data
size = 50
advanced_report = no
[monitor:amqp]
routing_key =
default_routing_key=
host =
[api.endpoints]
lizmap_api=/lizmap
[api.enabled]
lizmap_api=yes
In this example:
* QGIS Server will be available at ``http://127.0.0.1:7200/ows/``
* the plugins are installed in :file`/srv/qgis/plugins` (``pluginpath``). See :ref:`qgis-server-plugins`.
* the file to watch for restarting workers is :file:`/var/lib/py-qgis-server/py-qgis-restartmon` (``restartmon``).
* the directory containing the projects to be published :file:`/srv/data` (``rootdir``). The projects must be in sub-folders.
* Lizmap QGIS Server API is enabled
Manage it with systemd
----------------------
First of all, we create an environment file :file:`/srv/qgis/config/qgis-service.env` with
.. code-block:: bash
LC_ALL=en_US.UTF-8
LANG=en_US.UTF-8
DISPLAY=:99
QGIS_OPTIONS_PATH=/srv/qgis/
QGIS_AUTH_DB_DIR_PATH=/srv/qgis/
GDAL_CACHEMAX=2048
QGIS_SERVER_CACHE_SIZE=2048
QGIS_SERVER_LIZMAP_REVEAL_SETTINGS=TRUE
QGIS_SERVER_FORCE_READONLY_LAYERS=TRUE
QGIS_SERVER_TRUST_LAYER_METADATA=TRUE
QGIS_SERVER_APPLICATION_NAME=qgis-server
In this file, we defined:
* The lang
* The Xvfb display port, needed to print PDF
* The QGIS options and ``authDB`` path (needed for HTTPS, when used in remote layers such as OSM tiles)
* Lizmap environment variable to reveal settings
* Other QGIS Server variables, from the `documentation `_.
Then we can create the QGIS `service systemd file `_ :file:`/etc/systemd/system/qgis.service` with
.. code-block:: bash
[Unit]
Description=QGIS server
After=network.target
[Service]
Type=simple
ExecStart=/opt/local/py-qgis-server/bin/qgisserver -c /srv/qgis/server.conf
# FIXME it is recommended to have a script *synchronous*, which is not the case here
ExecReload=/usr/bin/qgis-reload
KillMode=control-group
KillSignal=SIGTERM
TimeoutStopSec=10
Restart=always
StandardOutput=append:/var/log/qgis/qgis-server.log
StandardError=inherit
SyslogIdentifier=qgis
EnvironmentFile=/srv/qgis/config/qgis-service.env
User=root
LimitNOFILE=4096
[Install]
WantedBy=multi-user.target
Finally, we enable the QGIS Server service to start it and to be sure it is started at system launch :
.. code-block:: bash
systemctl enable qgis
service qgis start
Debug and check
---------------
.. tip::
1. We can check that QGIS Server with Py-QGIS-Server is working with :
``curl http://127.0.0.1:7200/ows/``
2. After the installation of **Lizmap Server** QGIS plugin, we can check with :
``curl http://127.0.0.1:7200/lizmap/server.json | jq '.'``
Read :ref:`qgis-server-plugins` with the use of QGIS-Plugin-Manager.
Adapt the Lizmap Web Client configuration
-----------------------------------------
Either by editing manually the file :file:`lizmap/var/config/lizmapConfig.ini.php` or by changing in Lizmap Web Client GUI :
.. code-block:: bash
[services]
;URL to QGIS Server for OGC web services
wmsServerURL="http://127.0.0.1:7200/ows/"
;URL to the API exposed by the Lizmap plugin for QGIS Server
lizmapPluginAPIURL="http://127.0.0.1:7200/lizmap/"
; path to find repositories
rootRepositories="/var/data"
Your :guilabel:`Server information` panel must show you the QGIS Server version and installed plugins.