Installation de QGIS Server et Lizmap sur la machine virtuelle

Pour installer Lizmap sur un serveur web, il nous faut installer et configurer un ensemble de logiciels.

  • un serveur web : Apache ou Nginx. Dans le cas de cette machine virtuelle, ce sera Apache.
  • PHP : nécessaire pour le fonctionnement du client web Lizmap. Il existe plusieurs manières d'installer PHP avec Apache : intégré dans Apache avec mod_php (par défaut), ou indépendamment avec PHP-FPM. La société 3Liz recommande la 2nde manière pour un serveur en production, pour des raisons de performances. Pour un serveur de test comme ici, c'est moins important.
  • Certains modules de PHP comme curl, gd, xml, sqlite3, pg ...
  • QGIS Server. Il est recommandé d'utiliser la même version que QGIS Desktop, c'est à dire la 3.28 LTR
  • Des plugins de QGIS Server, et notamment le plugin Lizmap server (ne pas confondre avec le plugin Lizmap, pour QGIS Desktop !). Pour installer et mettre à jour ces plugins, 3Liz propose un utilitaire dédié : qgis-plugin-manager
  • Et bien sûr le client web Lizmap !

Comme cette stack est longue à configurer, 3Liz propose aussi une installation avec docker plus simple et directe ... à condition de connaître docker !

Liens utiles à consulter

Installation QGIS Server LTR

QGIS Server est disponible sous forme de paquet Ubuntu, tout comme QGIS Desktop.

Cf. https://qgis.org/fr/site/forusers/alldownloads.html#debian-ubuntu pour l'installer des paquets QGIS LTR sur Debian et Ubuntu

Créer un fichier /etc/apt/sources.list.d/qgis.sources avec l'URL du dépôt pour QGIS LTR, et le nom de code de la version Ubuntu (ici, jammy):

sudo vim /etc/apt/sources.list.d/qgis.sources
Types: deb deb-src
URIs: https://qgis.org/ubuntu-ltr
Suites: jammy
Architectures: amd64
Components: main
Signed-By: /etc/apt/keyrings/qgis-archive-keyring.gpg

Puis :

sudo wget -O /etc/apt/keyrings/qgis-archive-keyring.gpg https://download.qgis.org/downloads/qgis-archive-keyring.gpg
sudo apt update
sudo apt install qgis qgis-plugin-grass
sudo apt install qgis-server

Pour essayer l'installation, il est possible de lancer l'exécutable depuis un terminal :

/usr/lib/cgi-bin/qgis_mapserv.fcgi

Noms de domaines dans le fichier /etc/hosts

Les noms de domaine suivants : ows.local et lizmap.local seront respectivement utilisés pour QGIS Server et Lizmap. Nous ajoutons ces 2 lignes dans le fichier /etc/hosts :

# Host addresses
127.0.0.2  ows.local
127.0.0.3  lizmap.local

Installation Apache2 et module FastCGI

sudo apt install apache2 libapache2-mod-fcgid
sudo apachectl -v
sudo systemctl status apache2

Configuration de QGIS Server

Nous créons un répertoire où les plugins de QGIS Server seront enregistrés. Nous installons QGIS Plugin Manager avec pip, puis les plugins 'Lizmap server' et 'wfsOutputExtension' dans le répertoire dédié.

mkdir -p /var/www/qgis-server/plugins
chown -R sist /var/www/qgis-server
pip list 
pip install qgis-plugin-manager
export QGIS_PLUGINPATH=/var/www/qgis-server
qgis-plugin-manager init
qgis-plugin-manager update
qgis-plugin-manager install 'Lizmap server'
qgis-plugin-manager install wfsOutputExtension

Remarque : je recommande de tester aussitôt le bon fonctionnement du plugin 'Lizmap server' avec la commande suivante. Vérifier qu'elle retourne bien les caractéristiques au format JSON (version de QGIS Server), et pas une erreur 500 "Internal server error", auquel cas il faut réinstaller QGIS Plugin Manager.

QGIS_PLUGINPATH=/var/www/qgis-server/plugins/ QGIS_SERVER_LOG_FILE=/tmp/bob.txt QGIS_SERVER_LOG_LEVEL=0 QGIS_SERVER_LIZMAP_REVEAL_SETTINGS=True REQUEST_URI=/lizmap/server.json /usr/lib/cgi-bin/qgis_mapserv.fcgi

Maintenant il faut créer dans apache un virtualhost qui permettra d'accéder à QGIS Server. Il est possible (mais pas obligatoire) de configurer un projet par défaut. Par exemple, nous copions dans /var/www/qgis-server/projects le projet Fr_Physique.qgz et ses données. Veillez à ce que le répertoire soit accessible par l'utilisateur www-data.

chown -R www-data /var/www/qgis-server

Créons un fichier /etc/apache2/sites-avalaible/qgis-server.conf. Une bonne pratique pour QGIS Server et de restreindre l'accès à localhost uniquement (seul le client web Lizmap accédera à QGIS Server) ; c'est pourquoi on peut utiliser le port 80, sans certificat.

<VirtualHost 127.0.0.1:80>
  ServerAdmin webmaster@localhost
  ServerName ows.local

  #DocumentRoot /var/www/html

  # Apache logs (different than QGIS Server log)
  ErrorLog ${APACHE_LOG_DIR}/qgis-server.error.log
  CustomLog ${APACHE_LOG_DIR}/qgis-server.access.log combined

  # Longer timeout for WPS... default = 40
  FcgidIOTimeout 120

  FcgidInitialEnv LC_ALL "fr_FR.UTF-8"
  FcgidInitialEnv PYTHONIOENCODING UTF-8
  FcgidInitialEnv LANG "fr_FR.UTF-8"

  # QGIS log
  FcgidInitialEnv QGIS_SERVER_LOG_STDERR 0
  FcgidInitialEnv QGIS_SERVER_LOG_LEVEL 0

  FcgidInitialEnv QGIS_PLUGINPATH "/var/www/qgis-server/plugins"
  FcgidInitialEnv QGIS_SERVER_LIZMAP_REVEAL_SETTINGS True

  # default QGIS project
  # SetEnv QGIS_PROJECT_FILE /var/www/qgis-server/projects/Fr_Physique.qgz
  SetEnv QGIS_PROJECT_FILE /var/www/qgis-server/projects/Fr_Physique.qgz

  # QGIS_AUTH_DB_DIR_PATH must lead to a directory writeable by the Server's FCGI process user
  FcgidInitialEnv QGIS_AUTH_DB_DIR_PATH "/var/www/qgis-server/db/"
  FcgidInitialEnv QGIS_AUTH_PASSWORD_FILE "/var/www/qgis-server/db/qgis-auth.db"

  # Set pg access via pg_service file
  SetEnv PGSERVICEFILE /home/sist/.pg_service.conf
  FcgidInitialEnv PGPASSFILE "/home/sist/.pgpass"

  # if qgis-server is installed from packages in debian based distros this is usually /usr/lib/cgi-bin/
  # run "locate qgis_mapserv.fcgi" if you don't know where qgis_mapserv.fcgi is
  ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
  <Directory "/usr/lib/cgi-bin/">
    AllowOverride None
    Options +ExecCGI -MultiViews -SymLinksIfOwnerMatch
    Require all granted
  </Directory>

  <IfModule mod_fcgid.c>
    FcgidMaxRequestLen 26214400
    FcgidConnectTimeout 60
    # Needed for QGIS HelloServer plugin HTTP BASIC auth
    RewriteEngine on
    RewriteCond %{HTTP:Authorization} .
    RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
  </IfModule>

</VirtualHost>

Activez le virtual host et relancez Apache2

sudo a2ensite qgis-server.conf
sudo systemctl restart apache2

Nous pouvons maintenant tester QGIS Server avec cette requête GetCapabilities : http://ows.local/cgi-bin/qgis_mapserv.fcgi?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetCapabilities

Voir aussi https://docs.qgis.org/3.28/fr/docs/server_manual/getting_started.html#installation-on-debian-based-systems

Installation de PHP7 et PHP-FPM

Nous allons passer à l'installation du client web Lizmap, qui requiert PHP version 7 ou 8 (sur cette machine : PHP 8.1). 3Liz recommande l'utilisation de PHP-FPM pour améliorer la performance (PHP en tant que service distinct d'Apache).

sudo install php8.1-fpm
sudo apt install php8.1-curl php8.1-gd php8.1-imagick php8.1-mbstring php8.1-opcache php8.1-soap php8.1-zip php8.1-intl php8.1-bcmath
sudo apt install curl php8.1-sqlite3 php8.1-gd php8.1-xml php8.1-curl php8.1-pgsql
sudo a2dismod php8.1
sudo a2dismod mpm_prefork
sudo a2enmod mpm_event proxy_fcgi setenvif
sudo a2enconf php8.1-fpm 
sudo systemctl status php8.1-fpm 

Installation du client web Lizmap (3.6)

Installation du client web

Télécharger et dézipper le client web Lizmap : https://github.com/3liz/lizmap-web-client/releases (dernière release stable : 3.6.5, à la date du 28/09/2023)

Le copier dans /var/www/

unzip lizmap-web-client-3.6.5.zip
sudo cp -r lizmap-web-client-3.6.5 /var/www/lizmap-web-client

Copier les fichiers de configuration et lancer l'installation

cd /var/www/lizmap-web-client/lizmap/var/config
sudo cp lizmapConfig.ini.php.dist lizmapConfig.ini.php
sudo cp localconfig.ini.php.dist localconfig.ini.php
sudo cp profiles.ini.php.dist profiles.ini.php
cd /var/www/lizmap-web-client
sudo lizmap/install/set_rights.sh www-data www-data
sudo php lizmap/install/installer.php

Vous devez voir à l'écran :

Installation is starting
All modules dependencies are ok
Installation starts
Module jelix installed
Module jcommunity installed
Module jacl2 installed
Module jacl2db installed
Module jacl2db_admin installed
Module jauthdb_admin installed
Module master_admin installed
Module admin installed
Module lizmap installed
Module view installed
Module action installed
Module dynamicLayers installed
Module proj4php installed
Module dataviz installed
Module filter installed
All modules are installed or upgraded
Installation is finished

Relancer la définition des droits dans un terminal :

cd /var/www/lizmap-web-client
sudo lizmap/install/set_rights.sh www-data www-data

Création d'1 hôte virtuel

Créons un hôte virtuel sur lizmap.local pour la machine virtuelle de TP.

Créer un nouveau fichier /etc/apache2/sites-avalaible/lizmap.conf :

<VirtualHost *:80>
        ServerName lizmap.local
        DocumentRoot /var/www/lizmap-web-client/lizmap/www
        <Directory /var/www/lizmap-web-client>
                AllowOverride All
                Require all granted
        </Directory>
        ErrorLog ${APACHE_LOG_DIR}/error_lizmap.log
        CustomLog ${APACHE_LOG_DIR}/access_lizmap.log combined
        #Include conf-available/serve-cgi-bin.conf
</VirtualHost>

Activer le site et redémarrer apache :

sudo a2ensite lizmap.conf
sudo systemctl restart apache2

Vous pouvez maintenant vous rendre sur le site http://lizmap.local/

Changer le mot de passe en : admin / anf2023

Pour passer le site en https, nous générons un certificat autosigné et configurons le virtual host sur le port 443 dans /etc/apache2/sites-avalaible/lizmap.conf.

Données de test dans Lizmap

Nous créons 2 répertoires qui contiendra les cartes Lizmap. Le premier public sera accessible à tous, y compris les utilisateurs anonymes. Le second prive ne sera accessible qu'aux administrateurs et utilisateurs authentifiés.

cd ~
sudo mkdir -p data/mon_travail/3_lizmap/public
sudo mkdir -p data/mon_travail/3_lizmap/prive

Puis nous copions dans public le projet QGIS qui servira à tester le bon fonctionnement Lizmap (sur la machine virtuelle, les fichiers : fra_physical.qgs et fra_physical.qgs.cfg).

Configuration des données de test dans Lizmap

Aller sur le site http://lizmap.local/

Se connecter en tant qu'admin (rappel : mdp = anf2023)

Aller dans Administration > Lizmap configuration

Créer un nouveau repository (= un répertoire où sont enregistrés des projets QGIS configurés pour Lizmap) avec comme caractéristiques :

  • Id = public
  • Label = ANF SIST Géomatique 2023
  • Local folder path = /home/sist/data/mon_travail/3_lizmap/public
  • View project in this repo = anonymous, admins, users

Nouveau repository

Création d'un lien symbolique pour le TP Leaflet

mkdir -p data/mon_travail/3_leaflet
cd /var/www/html
sudo ln -s /home/sist/data/mon_travail/3_leaflet 3_leaflet

Puis télécharger https://github.com/dhg/Skeleton/releases/download/2.0.4/Skeleton-2.0.4.zip et dézipper le fichier dans /home/sist/public_html. La page index.html est accessible par l'URL http://localhost/3_leaflet/.