Inhaltsverzeichnis

Docker mit NGINX, PHP-FPM und rsyslog

Weiterführende Links:

Stdout to syslog:

sudo docker run \
  --log-driver syslog \
  --log-opt syslog-address=tcp://syslog-host:1514 \
  --log-opt syslog-format=rfc5424micro \
  -d --name php \
  -v /home/urs/docker-www:/usr/share/nginx/html \
  -v /dev/log:/dev/log \
  php:fpm-alpine

Der Skript Pfad muss in beiden Container identisch sein (vgl. -v option)

Reload NGINX aus Container:

kill -s HUP 1

Reload PHP-FPM aus Container:

kill -s USR2 1

NGINX Konfig

default.conf
location ~ \.php$ {
    root           /usr/share/nginx/html;       
    fastcgi_pass   172.17.0.3:9000;
    fastcgi_index  index.php;      
    include        fastcgi_params;                                
    fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
}

Für fasctcgi_pass muss die IP des php containers angegeben sein, wenn sie nicht über docker compose im gleichen Netz sind (fehlende DNS).

PHP-FPM Konfig

/usr/local/etc/php-fpm.conf
error_log=syslog

rsyslog Konfig

Ohne spezielle Anpassung werden aus einem Container weitergeleitete Log-Nachrichten über den unix-socket /dev/log mit dem Namen des Docker Hosts geloggt. Um dies zu umgehen muss ein dedizierter Socket eingerichtet werden. Mittels „HostName“ Parameter kann der Hostname für diesen Socket definiert werden.

/etc/rsyslog.d/10-docker.conf
input(type="imuxsock"
    HostName="docker"
    Socket="/dev/log-docker")

https://www.rsyslog.com/doc/configuration/modules/imuxsock.html#read-log-data-from-jails

Die Container müssen nach Neustart von rsyslog ebenfalls neu gestartet werden, da der Socket sonst ins leere läuft.