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

siehe auch