PHP in Docker einrichten

Da aktuell vom Webserver nginx nur statische Dateien ausgeliefert werden können, soll jetzt PHP installiert werden, damit auch Scripts möglich sind. Im Artikel Docker auf dem Raspberry PI installieren wurde dafür Docker eingerichtet, das in dieser Anleitung für die Einrichtung von PHP verwendet wird. Mit Docker hast du die Möglichkeit mehrere unterschiedliche Version von PHP […]

Da aktuell vom Webserver nginx nur statische Dateien ausgeliefert werden können, soll jetzt PHP installiert werden, damit auch Scripts möglich sind. Im Artikel Docker auf dem Raspberry PI installieren wurde dafür Docker eingerichtet, das in dieser Anleitung für die Einrichtung von PHP verwendet wird.

Mit Docker hast du die Möglichkeit mehrere unterschiedliche Version von PHP gleichzeitig verwenden zu können. Dies ist z.B. notwendig, wenn alte Software noch nicht mit neueren Versionen funktionieren oder auch um Scripte mit neueren Versionen testen zu können, ohne durch eine Umstellung die noch nicht getestet wurde den Betrieb anderer Software zu stören.

Ausserdem kann über Docker der Zugriff von PHP auf das jeweilige Verzeichnis des VHosts eingeschränkt werden, damit Scripte keine Möglichkeit haben auf Dateien ausserhalb des Docker-Containers zuzugreifen.

Swarm erstellen

Es wird zwar zu diesem Zeitpunkt noch kein Swarm von Docker verwendet, jedoch funktioniert ein docker stack deploy nur, wenn sich Docker in einem Swarm befindet. Das Swarm-Token braucht du dir hier nicht merken, da wir dies später wieder anzeigen können, wenn dies benötigt wird.

docker swarm init
Swarm initialized: current node (lvv9icxk3se4awoxvjmmik1rq) is now a manager.

To add a worker to this swarm, run the following command:

    docker swarm join \
    --token SWMTKN-1-1swcitm3ngz5k0a0mklolktzvmgbruhnbwb6agnvxr2hpijp52-8wjwpjf7iiguhmchn9vknlu16 \
    10.0.1.124:2377

To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

PHP 7.0 installieren

Für den PHP-Stack wird eine neue YAML-Datei für die Konfiguration von PHP angelegt. Es soll das Docker-Image blar/php-arm:7.0-fpm verwendet werden, der Port 9000 vom Docker-Container soll auch auf dem Raspberry PI unter dem Port 9000 erreichbar sein und in den Volumes wird angegeben, dass das Verzeichnis /var/www/html vom Raspberry PI auch im Docker-Image unter dem gleichen Pfad zu erreichen ist.

Da hier PHP nur im Docker-Container läuft und hier das Verzeichnis /var/www/html vom Host (Raspberry PI) auf den Container gemappt wurde, kann PHP nur auf Dateien in diesem Verzeichnis zugreifen. Dies ist gut für die Sicherheit, PHP bei Sicherheitsproblemen in den verwendeten Skripten nur Dateien in diesem Verzeichnis ändern kann.

Wie die Docker-Images auf Dockerhub blar/php-arm erstellt wurden, ist auf Github.com im Repository blar/php-arm zu sehen.

docker-compose.yml
version: "3"

services:
    php:
        image: "blar/php-arm:7.0-fpm"
        ports:
            - "9000:9000"
        volumes:
            - "/var/www/html:/var/www/html"
        deploy:
            restart_policy:
                condition: on-failure
                delay: 5s

nginx konfigurieren

Nun muss im VHost noch konfiguriert werden, dass alle Anfragen auf PHP-Dateien zu PHP-FPM (der auf Port 9000 läuft) weitergeleitet werden sollen. Da für PHP-FPM noch einige Variablen von nginx benötigt werden, wird doch an dieser Stelle die Datei snippets/fastcgi-php.conf eingebunden, in der die benötigen Werte definiert werden.

sudo vim /etc/nginx/sites-enabled/blar-test.spdns.de.conf
location ~ \.php$ {
    fastcgi_pass 127.0.0.1:9000;
    include "snippets/fastcgi-php.conf";
}

Die komplette Konfigurationsdatei für den VHost sieht dann wie folgt aus:

sudo cat /etc/nginx/sites-enabled/blar-test.spdns.de.conf
server {
    server_name blar-test.spdns.de;

    listen 80;
    listen [::]:80;

    rewrite ^ https://$server_name$request_uri? permanent;
}

server {
    include "snippets/letsencrypt.conf";

    server_name blar-test.spdns.de;

    listen 443 ssl;
    listen [::]:443 ssl;

    ssl_certificate /etc/letsencrypt/live/blar-test.spdns.de/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/blar-test.spdns.de/privkey.pem;

    root /var/www/html;
    index index.html;

    location / {
        try_files $uri $uri/ =404;
    }

    location ~ \.php$ {
        fastcgi_pass 127.0.0.1:9000;
        include "snippets/fastcgi-php.conf";
    }

}

Konfiguration von nginx testen

sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

Konfiguration von nginx neuladen

sudo systemctl reload nginx

phpinfo erstellen

Sollte der Zugriff per SFTP im Artikel Dateien mit FileZilla hochladen schon durchgeführt worden sein, kannst du die Datei info.php auch per FileZilla hochladen. Der fehlende schliessende PHP-Tag ist in diesem Beispiel Absicht, da der Tag auch durch das Dateiende korrekt geschlossen wird und es sonst nur zu ungewollten Fehlern kommen könnte.

vim /var/www/html/info.php
<?php phpinfo();

PHP testen

Jetzt kannst du das Script in deinem Browser z.B. über https://blar-test.spdns.de/info.php aufrufen. Der Hostname muss natürlich durch den Hostnamen deines Raspberry PI eigenen werden.

Phpinfo

In der ersten Zeile System ist jetzt dein verwendeter Kernel zu sehen. Die Id nach „Linux“ ist die Id des Docker-Containers in dem PHP läuft

Kommentare sind geschlossen.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.