Installation QGIS Server 3.4 LTR

Lokale Testinstallation unter Windows (erfolgreich getestete Umgebungen: Windows Server 2008 R2, Windows Server 2016), ohne PHP, da der QGIS Server selbst das nicht benötigt.
:t: Basiert auf dieser hervorragenden, englischsprachigen Anleitung: https://opengislab.com/blog/2018/7/7/updated-installing-apache-qgis-server-and-lizmap-on-windows-os [nur Part 1, Part 2, Part 4 2.-4. & Part 5 (verändert)]— Thomas 2019-03-20 08:21

verwendete Software:

  1. Apache 2.4.37 VC15 (2018-11-21) → https://www.apachelounge.com/download/VC15/binaries/httpd-2.4.37-win64-VC15.zip
    1. mod_fcgid 2.3.9 (2017-04-25) → https://www.apachelounge.com/download/VC15/modules/mod_fcgid-2.3.9-win64-VC15.zip
    2. C++ Redistributable Visual Studio 2017 [aka VC15], aktuellste Version (14.16.27027.1): vc_redist_x64https://aka.ms/vs/15/release/VC_redist.x64.exe
  2. QGIS Server 3.4.5 LTR, installiert mittels OSGeo4W-Netzwerkinstallation (64 bit) → http://download.osgeo.org/osgeo4w/osgeo4w-setup-x86_64.exe
  1. Erstellen eines Installations- und Arbeitsverzeichnises auf der lokalen Festplatte der Servermaschine. Der Einfachheit halber nennen wir dieses Verzeichnis webserver, also z.B. C:\webserver.
  2. Herunterladen der Softwarepakete von https://www.apachelounge.com/download/, s.o.
    • :!: Hinweis: das C++ Redistributable Visual Studio 2017 Paket ist notwendig, um den Apache HTTPD als Windows-Dienst laufen zu lassen.
      Die richtige Version hängt vom installierten Binary ab: wenn Apache 2.4 VC15 installiert wird, braucht es das Microsoft Visual Studio C 2017 Redistributable!
  3. Installation des C++ Redistributable Visual Studio 2017 Paktes vc_redist_x64 — falls nicht schon anderweitig geschehen.
  4. Entpacken des Apache24-Ordners aus httpd-2.4.37-win64-VC15.zip, um diesen ins vorbereitete Webserver-Verzeichnis zu schieben (→ z.B. C:\webserver\Apache24)
  5. Entpacken von mod_fcgid-2.3.9-win64-VC15.zip, kopieren der Datei mod_fcgid.so aus dem Verzeichnis mod_fcgid-2.3.9 in das \Apache24\modules-Verzeichnis
  6. Anpassung der Webserverkonfiguration in der Datei \Apache24\conf\httpd.conf (hier: C:\webserver\Apache24\conf\httpd.conf). Öffnen der Datei in einem fähigen Texteditor (ich verwende z.B. notepad++) und folgende Änderungen vornehmen:
    1. SRVROOT: Ersetzen von c:/Apache24 durch c:/webserver/Apache24 überall wo es vorkommt — bzw. entsprechend der getroffenen Voreinstellungen
    2. ServerName weiter unten sollte in unserem Beispiel ServerName localhost:80, sofern der Standardport 80 verwendet wird/werden soll, ansonsten eben eine andere Portnummer (z.B. 90)
      1. die ServerName-Zeile aktivieren („uncomment“), indem das vorstehende #-(Kommentar-)Zeichen entfernt wird
      2. www.example.com:80 durch localhost:80 ersetzen
      3. gegebenenfalls die Portnummer auch in der Zeile anpassen, in der Listen 80 steht. :t: Es ist ein Port zu verwenden, der auf dieser Maschine nicht schon von einem anderen Dienst/service verwendet wird!
      4. Speichern der Änderungen, die Konfigurationsdatei kann im Texteditor geöffnet beliben.
  7. Überprüfen, ob der Apache startet. Um schnell zu sehen, ob Einstellungen funktionieren und der Apache Webserver korrekt startet, kann man httpd.exe ausführen. Entweder verwendet man die Windows Konsole (CMD) dafür, oder man wechselt in das entsprechende Verzeichnis und führt httpd.exe „als Adminsitrator“ aus.
    1. wechseln ins \Apache24\bin-Verzeichnis, Rechtsklick auf httpd.exe → „Als Adminsitrator ausführen“
    2. es erscheint ein schwarzes Konsolenfenster, dieses geöffnet halten, wenn es geschlossen wird, wird der Apache gestoppt/beendet
    3. wenn man nun in einen Webbrowser http://localhost bzw. http://localhost:port eingibt, sollte eine Webseite ercheinen, auf der „It Works!“ steht, was bedeutet, das der Apache korrekt installiert ist.
    4. Um den Apache zu stoppen, schließt man das Konsolenfenster (s.o.)
  8. Apache als Windows-Dienst laufen lassen, statt als Konsolenanwendung. Dies ist zu bevorzugen, da der Apache so alle Operationen sauber beendet. Weitere Infos unter https://httpd.apache.org/docs/2.4/platform/windows.html#winsvc.
    1. optional: Hinzufügen des Apache zur Windows Systempfad-Variable, um auf diese Weise den Apache direkt durch Eingabe von httpd.exe ohne den vollen Verzeichnispfad erreichen zu können.
    2. starten des Apache als Windows-Dienst:
      1. Kommandozeile (CMD) als Administrator öffnen/starten
      2. Apache als Dienst installieren durch Eingabe von httpd.exe -k install
    3. Im Windows Dienste Manager sollte nun der Apache HTTPD Server aufgeführt sein
      1. diesen Dienst auswählen und starten
      2. darauf hin sollte im Webbrowser auf http://localhost bzw. http://localhost:port wieder „It Works!“ gezeigt werden
      3. stoppen des Apache Dienste vorerst, um weitere Konfigurationen vorzunehmen (das Fenster des Dienste Managers kann noch offen bleiben)
      • :t: Wenn man den Dienst lieber mitels CMD starten, stoppen oder neu starten möchte, verwendet man httpd.exe -k restart bzw. httpd.exe -k shutdown
  9. Bearbeiten der Apache Konfiguration (httpd.conf) um benötigte Module einzuschalten (→ C:\webserverApache24\conf\httpd.conf)
    1. Entfernen des #-Zeichens am Zeilenanfang, um die benötigten Module zu aktivieren
      Hinweis: sollte ein Modul noch in der Datei fehlen, kann es einfach dazu geschrieben werden. In unserem Fall ist dies wahrscheinlich notwendig für das Modul mod_fcgid.so (s.u.)
      LoadModule actions_module modules/mod_actions.so
      LoadModule deflate_module modules/mod_deflate.so
      LoadModule expires_module modules/mod_expires.so
      LoadModule ext_filter_module modules/mod_ext_filter.so
      LoadModule fcgid_module modules/mod_fcgid.so
      LoadModule headers_module modules/mod_headers.so
      LoadModule ident_module modules/mod_ident.so
      LoadModule rewrite_module modules/mod_rewrite.so
      LoadModule ssl_module modules/mod_ssl.so
      
      LoadModule fcgid_module modules/mod_fcgid.so

      Hinweis: Wenn ein anderer als der Standardport 80 verwendet wird, müssen auch noch folgende Module aktiviert werden:

      LoadModule cache_module modules/mod_cache.so
      LoadModule cache_disk_module modules/mod_cache_disk.so
      LoadModule proxy_module modules/mod_proxy.so
      LoadModule proxy_connect_module modules/mod_proxy_connect.so
      LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so
      LoadModule proxy_http_module modules/mod_proxy_http.so
    2. Hinzufügen des folgenden Codes an das Ende der httpd-Konfigurationsdatei:
      <IfModule mod_deflate.c>
      SetOutputFilter DEFLATE
      BrowserMatch ^Mozilla/4 gzip-only-text/html
      BrowserMatch ^Mozilla/4\\.0[678] no-gzip
      BrowserMatch \\bMSIE !no-gzip !gzip-only-text/html
      SetEnvIfNoCase Reuqest_URI \\.(?:gif|jpe?g|png|rar|zip)$ no-gzip dont-vary
      Header append Vary User-Agent env=!dont-vary
      </IfModule>
  10. Speichern der Änderungen an der Konfigurationsdatei und neu starten des Apache Dienstes. Prüfen, ob der Webserver immer noch unter localhost (bzw. localhost:port) erreichbar ist. — :t: Wenn man das nach jedem Satz von Änderungen überprüft, ist es einfacher eventuell auftretende Fehler nachzuvollziehen.

Ich bevorzuge die Installation mittels OSGeo4W-Netzwerkinstallation, die nach dem Download im Modus „Fortgeschrittene Installation“ eine übersichtliche Auswahl aller zur Verfügung stehenden Pakete bietet.

:!: Für dieses Beispiel wird QGIS 3.4.5 LTR verwendet (der erste LTR aus dem OSGeo4W-LTR-Repository).

  1. starten des OSGeo4W-Installers als Administrator, Auswahl der „Fortgeschrittenen Installation“
    1. „Aus dem Internet installieren“
    2. (standard) Wurzelverteichnis C:\OSGeo4W64 beibehalten
    3. folgende Pakete auswählen:
      • Kategorie Web: qgis-ltr-server QGIS Server (long term release) → aktuelle Version: 3.4.5-1
    4. „Pakete installieren, um die [angezeigten, nicht erfüllten] Abhängikeiten zu erfüllen (EMPFOHLEN)“
      • ggf. Lizenzvereinbarungen bestätigen
  2. In der Apache Konfigurationsdatei C:\webserver\Apache24\conf\httpd.conf die Zeile Include conf/extra/httpd-vhosts.conf un-kommentieren, also das führende #-Zeichen entfernen.
    1. Konfigurationsdatei speichern.
  3. Die httpd-vhosts.conf-Datei öffnen und editieren (→ C:\webserver\Apache\Conf\extra\httpd-vhosts.conf)
    1. die zwei Beispiele in der Datei löschen und statt dessen den folgenden Code einfügen, um den QGIS Server als Fast-CGI erreichbar zu machen.
      Hinweis: Nicht vergessen den Port anzupassen, falls etwas anderes verwendet wird als der Standard 80!
      <VirtualHost *:80>
        ServerName localhost:80
      
      # qgs-Deployment
      DocumentRoot "C:/webserver/qgis_ows/qgs/"
      <Directory "C:/webserver/qgis_ows/qgs/">
          Options -Indexes +FollowSymLinks +ExecCGI
          AllowOverride All
          Require all granted
      </Directory>
      
      Alias /qgis/ "C:/OSGeo4W64/apps/qgis-ltr/bin/"
      <Directory "C:/OSGeo4W64/apps/qgis-ltr/bin/">
          SetHandler fcgid-script
          Options +ExecCGI
          AllowOverride All
          Require all granted
      </Directory>
      
      # FIXME wofür?
      Alias /document/ "C:/webserver/qgis_ows/document/"
      <Directory "C:/webserver/qgis_ows/document">
          Options -Indexes +FollowSymLinks
          AllowOverride All
          Require all granted
      </Directory>
        
      # Apache logs (different than QGIS Server log)
        CustomLog "logs/qgis-access.log" combined
        ErrorLog "logs/qgis-error.log"
      </VirtualHost>
    2. abschließend speichern.
  4. in die VirtualHost-Konfiguration in httpd-vhosts.conf noch folgende Variablen einfügen und zwar oben zwischen <VirtualHost *:80> und ServerName localhost:80
    FcgidInitialEnv PATH "C:\OSGeo4W64\bin;C:\OSGeo4W64\apps\qgis-ltr\bin;C:\OSGeo4W64\apps\Qt5\bin;C:\OSGeo4W64\apps\grass\grass-6.4.3\lib;C:\OSGeo4W64\apps\grass\grass-6.4.3\bin;C:\Windows\system32;C:\Windows;C:\Windows\System32\WBem"
     FcgidInitialEnv QT_PLUGIN_PATH "C:\OSGeo4W64\apps\qgis-ltr\qtplugins;C:\OSGeo4W64\apps\Qt5\plugins"
     FcgidInitialEnv PYTHONHOME "C:\OSGeo4W64\apps\Python37"
     FcgidInitialEnv PYTHONPATH "C:\OSGeo4W64\apps\qgis-ltr\.\python;C:\OSGeo4W64\apps\qgis-ltr\.\python\plugins;C:\OSGeo4W64\apps\Python37\DLLs;C:\OSGeo4W64\apps\Python37\lib;C:\OSGeo4W64\bin;C:\OSGeo4W64\apps\Python37;C:\OSGeo4W64\apps\Python37\lib\site-packages"
    
    FcgidInitialEnv QGIS_SERVER_LOG_LEVEL 0
    FcgidInitialEnv QGIS_SERVER_LOG_FILE "C:\\webserver\\Apache24\\logs\\qgis_server.log"
    
    FcgidIOTimeout 120
          FcgidInitialEnv LC_ALL "en_US.UTF-8"
          FcgidInitialEnv PYTHONIOENCODING UTF-8
          FcgidInitialEnv LANG "en_US.UTF-8"
          FcgidInitialEnv QGIS_DEBUG 1
          FcgidInitialEnv QGIS_PLUGINPATH "C:\OSGeo4W64\apps\qgis-ltr\python\plugins"
      
    SetEnvIf Request_URI ^/qgis QGIS_PREFIX_PATH "C:\OSGeo4W64\apps\qgis-ltr"
    SetEnvIf Request_URI ^/qgis TEMP "C:\Windows\Temp"
    
    SetEnvIf Request_URI ^/qgis GDAL_DATA "C:\OSGeo4W64\share\gdal"
    SetEnvIf Request_URI ^/qgis GDAL_DRIVER_PATH "C:\OSGeo4W64\bin"
    SetEnvIf Request_URI ^/qgis PDAL_DRIVER_PATH "C:\OSGeo4W64\bin"
    SetEnvIf Request_URI ^/qgis GDAL_SKIP "JP2ECW"
    SetEnvIf Request_URI ^/qgis PROJ_LIB "C:\OSGeo4W64\share\proj"
  5. httpd-vhosts.conf speichern
  6. Apache Dienst neu starten
  7. im Webbrowser prüfen, ob der QGIS Server errichbar ist: die URL-Eingabe
    http://localhost/qgis/qgis_mapserv.fcgi.exe?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetCapabilities
    sollte den Inhalt der mitgelieferten Datei wms_metadata.xml zeigen. Das bedeutet dann, dass QGIS Server richtig installiert worden ist und als fcgi angesprochen wird.

Wenn die Anzeige im Browser so oder so ähnlich aussieht, hat die Installation geklappt. 8-) (Die Hauptsache ist, dass ein beschreibender Text über den WMS erscheint und keine Fehlermeldung.)

  1. Um OpenGIS Web Services (OWS: WMS, WFS, etc.) über den QGIS Server bereit zu stellen, sind nach der obigen Anleitung QGIS-Projketdateien (.qgs) in das Serververzeichnis C:/webserver/qgis_ows/qgs/ abzulegen.
    1. Die in diesen Projektdateien enthalten Layer werden entsprechend der notwendigen Diensteigenschaften, die in den QGIS Projekteigenschaften unter QGIS Server definiert werden1), veröffentlicht.
  2. Ein Dienstaufruf — z.B. über die Datenquellverwaltung (Data Source Manager)2) in QGIS Desktop — erfolgt dann über eine URL wie http://localhost/qgis/qgis_mapserv.fcgi.exe?MAP=C:/webserver/qgis_ows/qgs/test_wms.qgs
QGIS Web Client 2 (QWC2) ist ein modularer, responsiver Web Client für QGIS Server, basierend auf dem ReactJS Framework und OpenLayers.
QWC2 ist eine Javascript Applikation, die in produktiven Umgebungen in kompilierter und optimierter Form als „Applikationsbundle“ installiert wird.