Zum Inhalt springen

Tutorial: Apache 2 mit PHP-FPM auf Ubuntu 19.04

Last updated on 19. Juni 2019

Vorwort

Im Tutorial wird ein Ubuntu 19.04 welches auf Basis von Virtualbox 6.0.8 virtualisiert wurde. Abseits von der im Tutorial verwendeten Software und einem SSH-Server ist das System blank. Jedoch kann es immer mal zu kleineren Abweichungen zwischen der im Tutorial beschriebenen Situation und der Realität kommen. Angaben wie example.com oder IP-Adressen im Generellen sind natürlich immer als Platzhalter zu verstehen. Eine Konfiguration muss schließlich immer auf die jeweilige Situation angepasst werden. Wäre ja sonst zu leicht. 🙂

Das System updaten

Zum Anfang gilt, wie zum Beginn jeder Installation auf Linux-Systemen, dass das System erst einmal geupdated wird. Dazu führt man einfach die folgenden beiden Befehle in einer Linux-Shell aus.

sudo apt update
sudo apt upgrade -y

Das “apt update” führt dazu, dass Ubuntu erst einmal die im System hinterlegten Repositories, welche in /etc/apt/sources.list bzw. in /etc/apt/sources.list.d liegen, geupdated. Dadurch stellt Ubuntu fest, welche Packages geupgraded werden können. Der -y Parameter sorgt einfach nur dafür, dass die Frage, ob das System wirklich geupgraded werden soll automatisch bejaht wird.

Apache und PHP-FPM installieren

Weiter im Text fangen wir damit an, Apache und PHP-FPM überhaupt mal zu installieren. Dazu wird in der Shell einfach der folgende Befehl ausgeführt.

sudo apt install -y apache2 php-fpm

Ubuntu beginnt automatisch damit, die von den Packages benötigten Abhängigkeiten zu installieren. Dementsprechend nicht wundern, dass er “etwas” mehr als diese zwei Packages installiert. Zudem sollte automatisch die vom php-fpm-Package mitgebrachte Standard-FPM-Konfiguration für Apache 2 aktiviert wurden seien. Heißt, für alle, die nur PHP haben wollen, ohne dass man es so einrichtet, dass jede Website beispielsweise ihren eigenen Benutzer bekommt, so kann man hier bereits aufhören. Für alle anderen geht’s etwas weiter unten weiter.

Der Inhalt der Datei sollte im Übrigen so aussehen und unter /etc/apache2/conf-available/php7.2-fpm.conf vorhanden sein. Sollte das nicht der Fall sein, kann man die Datei wie folgt erstellen.

sudo nano /etc/apache2/conf-available/php7.2-fpm.conf

Es wird dann ganz einfach der unten verlinkte Inhalt in die Datei kopiert.

# Redirect to local php-fpm if mod_php is not available
<IfModule !mod_php7.c>
<IfModule proxy_fcgi_module>
    # Enable http authorization headers
    <IfModule setenvif_module>
    SetEnvIfNoCase ^Authorization$ "(.+)" HTTP_AUTHORIZATION=$1
    </IfModule>

    <FilesMatch ".+\.ph(ar|p|tml)$">
        SetHandler "proxy:unix:/run/php/php7.2-fpm.sock|fcgi://localhost"
    </FilesMatch>
    <FilesMatch ".+\.phps$">
        # Deny access to raw php sources by default
        # To re-enable it's recommended to enable access to the files
        # only in specific virtual host or directory
        Require all denied
    </FilesMatch>
    # Deny access to files without filename (e.g. '.php')
    <FilesMatch "^\.ph(ar|p|ps|tml)$">
        Require all denied
    </FilesMatch>
</IfModule>
</IfModule>

Und aktivieren kann man das Ganze dann einfach in der Konsole über die folgenden Befehle.

sudo a2enconf php7.2-fpm
sudo a2enmod proxy_fcgi
sudo systemctl restart apache2

PHP-FPM per VHost

Eine andere Konfiguration, welche mit Sicherheitsvorteilen verbunden ist, ist die Möglichkeit anstelle PHP-FPM global für alles zu aktivieren, das Ganze per VHost zu konfigurieren. Dazu einmal wird die globale PHP-FPM-Konfiguration deaktiviert.

sudo a2disconf php7.2-fpm

Danach können wir damit beginnen, einen Virtual Host für unsere Beispiel-Domain example.com anzulegen. Das wird wie folgt gemacht:

sudo nano /etc/apache2/sites-available/example.com.conf

Und der folgende Inhalt wird in die Datei kopiert.

<VirtualHost *:80>
    ServerAdmin webmaster@example.com
    ServerName example.com
    ServerAlias www.example.com
    DocumentRoot /var/www/example.com
    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined

    <IfModule !mod_php7.c>
        <IfModule proxy_fcgi_module>
            # Enable http authorization headers
            <IfModule setenvif_module>
                SetEnvIfNoCase ^Authorization$ "(.+)" HTTP_AUTHORIZATION=$1
            </IfModule>

            <FilesMatch ".+\.ph(ar|p|tml)$">
                SetHandler "proxy:unix:/run/php/example.com.sock|fcgi://localhost"
            </FilesMatch>
            <FilesMatch ".+\.phps$">
                # Deny access to raw php sources by default
                # To re-enable it's recommended to enable access to the files
                # only in specific virtual host or directory
                Require all denied
            </FilesMatch>
            # Deny access to files without filename (e.g. '.php')
            <FilesMatch "^\.ph(ar|p|ps|tml)$">
                Require all denied
            </FilesMatch>
        </IfModule>
    </IfModule>

    <Directory /var/www/example.com>
        AllowOverride All
    </Directory>

</VirtualHost>

Wir speichern dann die Datei und verlassen Nano wieder. Dann aktivieren wir die Website in Apache und erstellen für die Website einen eigenen Benutzer. Zusätzlich muss der Apache-User www-data noch in die Gruppe des neuen Benutzers aufgenommen werden, damit er auf das Verzeichnis zugreifen darf. Zudem passen wir die Dateiberechtigungen an.

sudo a2ensite example.com
sudo addgroup --gid 5000 --force-badname example.com
sudo adduser --force-badname --home /var/www/example.com --uid 5000 --gid 5000 --disabled-login example.com
sudo a2enmod proxy_fcgi
sudo systemctl restart apache2
sudo adduser www-data example.com
sudo find /var/www/example.com -type d -exec chmod -v 2770 {} +
sudo find /var/www/example.com -type f -exec chmod -v 660 {} +

Zur Erklärung der Dateirechte: Das wird hier jeweils zweimal gemacht, einmal nur für Ordner “-type d” und einmal nur für Dateien “-type f”. Ich bezwecke damit, dass alle möglichen vorhandenen Ordner innerhalb des Verzeichnisses für Besitzer und Gruppenmitglieder lesbar, beschreibbar und das Programme darin ausgeführt werden können. Zusätzlich wird das SGID-Bit gesetzt, das dafür sorgt, dass alle im Verzeichnis zukünftig angelegten Dateien und Ordner immer die Benutzergruppe example.com haben. Auch wenn die Dateien und Ordner nicht vom example.com-Benutzer angelegt werden. Die Berechtigungen für die möglicherweise vorhanden Dateien werden so eingestellt, dass Benutzer und Gruppe lesen und schreiben dürfen. Jedoch nichts ausführen und Dritte sollten sowieso keinen Zugriff haben.

PHP-FPM Konfiguration

Wenden wir uns einmal dem spaßigen Teil des Tutorials zu. Der Konfiguration von PHP-FPM. Keine Angst, ist nicht schwerer als Apache. Wir haben es hier schließlich nicht mit nginx zu tun. 🙂

Die Konfigurationsdateien befinden sich bei PHP-FPM unter /etc/php/7.2/fpm. Jedoch interessiert uns hier jeglich das Pool-Verzeichnis unter /etc/php/7.2/fpm/pool.d. Dort erstellen wir uns eine example.com.conf, die wir wie folgt konfigurieren.

sudo nano /etc/php/7.2/fpm/pool.d/example.com.conf
[example_com]

user                    = example.com
group                   = example.com

listen                  = /run/php/example.com.sock
listen.backlog          = 511
listen.owner            = www-data
listen.group            = www-data
listen.mode             = 0660

request_terminate_timeout = 7200

pm                      = dynamic
pm.max_children         = 120
pm.start_servers        = 12
pm.min_spare_servers    = 6
pm.max_spare_servers    = 18

env[HOSTNAME] = $HOSTNAME
env[PATH] = /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin
env[TMP] = /tmp
env[TMPDIR] = /tmp
env[TEMP] = /tmp

Wir speichern, überraschend, die Datei und verlassen wieder den Editor. Um die neue Konfiguration zu übernehmen, muss PHP-FPM noch neugestartet werden.

Testen wir’s!

Um unsere neue PHP-Umgebung zu testen, erstellen wir einfach eine index.php mit dem Aufruf der phpinfo()-Funktion im Webverzeichnisses unserer Beispieldomain.

sudo -uexample.com nano /var/www/example.com/index.php
<?php
phpinfo();

Nach dem das getan ist, öffnen wir example.com in einem beliebigen Browser. Sollte dann keine weiße Seite dort erscheinen, sondern viel Text, dann hat es funktioniert. Viel Spaß!

Hilfreiche Links

https://www.ubuntu.com/download
https://www.php.net/manual/de/install.fpm.php
https://httpd.apache.org/docs/2.4/

Published inApache 2PHPTutorialsUbuntu

Hinterlasse einen Kommentar

avatar
  Abonnieren  
Benachrichtige mich bei