Apache im Docker mit Reverse Proxy
Wenn der Apache hinter dem Reverse Proxy Container (z.B. Traefik🖹) läuft, ist seine Konfiguration einerseits einfach: man muss nichts machen und er läuft direkt.
Andererseits gibt es aber Dinge, die dadurch nicht so richtig toll sind, so dass man doch etwas konfigurieren sollte.
Die Logs enthalten nämlich nur die IP des Proxy und nicht etwa des Besuchers.
Deshalb gilt es zu erst die httpd.conf des Images zu bekommen 1:
1docker run --rm httpd:2-alpine cat /usr/local/apache2/conf/httpd.conf >httpd.conf
Damit haben wir dann die für das Image relevante httpd.conf des Apachen. Statt httpd:2-alpine ggf. das passende Image wählen.
In dem httpd.conf gilt es nun etwas aufzuräumen, z.B. Module entfernen oder auch zu aktivieren. Vor allem muss das Modul remoteip_module aktiviert werden:
1LoadModule remoteip_module modules/mod_remoteip.so
Weiter untem in dem File gibt es zudem das Logformat zu ändern, d.h. 3 Zeilen sind zu ändern (die stehen so nicht direkt untereinander) von:
1LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
2LogFormat "%h %l %u %t \"%r\" %>s %b" common
3CustomLog /proc/self/fd/1 common
ändern in:
1LogFormat "%a %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
2LogFormat "%a %l %u %t \"%r\" %>s %b" common
3CustomLog /proc/self/fd/1 combined
Dies bewirkt, dass nicht mehr die IP des Proxis sondern der Clients im Log landet (%h
wurde gegen %a
getauscht) und das auch etwas mehr im Log steht (combined
statt nur common
).
Am Ende des Files muss dann noch folgendes geschrieben werden 2:
1RemoteIPHeader X-Forwarded-For
2RemoteIPTrustedProxy 172.20.0.0/16
Hier wird es tricky. Die IP-Adressen des lokalen bridged Docker Netzes, das Proxy und Apachen verbindet, wird von Docker bei jedem Start neu vergeben - außer man setzt sie fest, hier also 172.20.0.0/16.
Dazu am besten im Compose File für das Netzwerk diese Zeilen aufnehmen:
1networks:
2 web:
3 driver: bridge
4 name: web
5 ipam:
6 driver: default
7 config:
8 - subnet: 172.20.0.0/16
Und in den Services selbst natürlich dieses Netwerk nutzen, also z.B.
1 proxy:
2 image: traefik:v2.8
3 ...
4 networks:
5 - www
Wo ich gerade beim httpd.conf bin: Diese Zeile ist für Hugo auch ganz sinnvoll:
1ErrorDocument 404 /404.html
-
HTTPD Docker Image: https://hub.docker.com/_/httpd/🖹 ↩︎
-
Apache Mod RemoteIP: https://httpd.apache.org/docs/2.4/mod/mod_remoteip.html🖹 ↩︎