matomo dockerized hinter apache proxy
matomo
Ein Teil meines letzten Projektes war die Erstellung einer internen Statistik über die Webzugriffe.
Der Platzhirsch im Open Source Bereich ist hier zweifelsohne Matomo.
Um unabhängig von äußeren Umständen wie PHP-Version oder Datenbank zu sein, haben wir uns entschieden, das Ganze mit Docker umzusetzen.
Der Server, auf dem Matomo laufen soll, ist ein aktuelles Ubuntu.
Allerdings befindet sich bereits eine Website auf dem Rechner, die mit einem Apache Webserver und php 8.2 ausgeliefert wird.
Der Webserver soll also für folgende Domains zuständig sein
- www.domain.de
- matomo.domain.de
Die erste Domain wird standardmäßig mit Apache ausgeliefert. Die Zugriffe auf matomo werden jedoch über einen Proxy auf die Docker-Instanz umgeleitet.
Als erstes sieht man die Docker-Konfiguration und die Einstellungen für matomo
Dann folgt die Apache-Konfiguration. Diese habe ich selbst nach langem Suchen irgendwo im Netz gefunden. Leider habe ich vergessen die Quelle zu notieren.
Damit der security-check im matomo Backend beruhigt ist, muss am force_ssl auf 1 setzen obwohl das matomo kein Zertikat hat. Siehe hier.
[General]
force_ssl = 1 ;please add this as well
assume_secure_protocol = 1 ;if you add this
proxy_uri_header = 1
reverse_proxy = 0
proxy_client_headers[] = "HTTP_X_FORWARDED_FOR"
proxy_host_headers[] = "HTTP_X_FORWARDED_HOST"
apache
Nun folgt die Apache-Konfiguration. Wie oben schon kurz erwähnt, läuft die matomo Instanz ohne Zertifikat. Das ist nicht weiter schlimm, da die Instanz nur unter localhost:8080 erreichbar ist.
Um matomo auch für andere und über SSL erreichbar zu machen, benötigen wir an dieser Stelle den Apache als Proxy-Server.
Ich gebe zu, dass Apache als Proxy-Server nicht optimal ist.
Angeblich ist nginx hier wesentlich performanter. Mein Favorit wäre hier aber haproxy. Der ist zwar etwas komisch zu konfigurieren, aber von der Geschwindigkeit her der Hammer.
Allerdings ist das ein laufendes Projekt und kann nicht einfach so umgestellt werden.
Wenn die matomo-Instanz unter www.domain.de/matomo erreichbar sein soll, ist diese Konfiguration zu wählen:
<VirtualHost *:443>
ServerName www.domain.de
ServerAlias www.domaain.de
DocumentRoot /var/www/html/production/releases/current/public
SSLEngine On
SSLCertificateKeyFile /etc/ssl/private/wildcard.domain.de.key
SSLCertificateFile /etc/ssl/private/domain.pem
<Directory "/var/www/html/production/releases/current/public">
AllowOverride All
</Directory>
<Location "/matomo">
ProxyPreserveHost On
# Rewrite rule to remove /matomo prefix
RewriteEngine On
RewriteRule ^/matomo/(.*)$ /$1 [PT]
# Proxy settings
ProxyPass "http://127.0.0.1:8080/"
ProxyPassReverse "http://127.0.0.1:8080/"
# Forward client IP and other headers
RequestHeader set WAF-Forwarded-For %{REMOTE_ADDR}s
RequestHeader set LB-Forwarded-For %{REMOTE_ADDR}s
RequestHeader set X-Forwarded-For %{REMOTE_ADDR}s
SetEnvIf Host "^(.*)$" THE_HOST=$1
RequestHeader setifempty X-Forwarded-Proto https
RequestHeader setifempty X-Forwarded-Host %{THE_HOST}e
RequestHeader edit X-Forwarded-Host (.*) $1/matomo
ProxyAddHeaders Off
</Location>
</VirtualHost>
Möchte man der Matomo Instanz jedoch eine komplett eigene Subdomain geben, kann dies so konfiguriert werden:
<VirtualHost *:443>
ServerName matomo.domain.de
ServerAlias matomo.domain.de
# SSL Configuration
SSLEngine On
SSLCertificateKeyFile /etc/ssl/private/wildcard.dgbrs.de.key
SSLCertificateFile /etc/ssl/private/dgbrs.pem
# Proxy Einstellungen
ProxyPreserveHost On
ProxyPass / http://127.0.0.1:8080/
ProxyPassReverse / http://127.0.0.1:8080/
# Logging
ErrorLog ${APACHE_LOG_DIR}/matomo.dgbrs.de_error.log
CustomLog ${APACHE_LOG_DIR}/matomo.dgbrs.de_access.log combined
# Optional: Zusätzliche Sicherheitsheader
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"
Header always set X-Frame-Options "SAMEORIGIN"
Header always set X-Content-Type-Options "nosniff"
</VirtualHost>
Zusammenfassung
Wie immer bin ich von Docker begeistert. Diese Technologie macht es so einfach, mit verschiedenen Tools zu arbeiten.
Man braucht nicht immer einen neuen Server, um Dinge nebeneinander laufen zu lassen.
An dieser Stelle möchte ich mich auch bei den unermüdlichen Containerbastlern bedanken, die uns einfach so ein fertiges matomo zusammengebaut haben.
Comments
No Comments