Safety first: Konfiguration von Apache & PHP-FPM

Vorwort


Ich setze in diesem Tutorial auf die Serverversion von Ubuntu 16.04, die ich den liebevollen Hostname Misaki gegeben habe. Unter anderen verwende ich in diesem Tutorial eine SSH-Verbindung zum Server, dessen Einrichtung ich hier allerdings nicht erklären werde. Hier wird es nur um die Konfiguration von Apache und PHP-FPM gehen.

Im Tutorial werden die folgenden FQHNs verwendet:

  • example.net
  • www.example.net

Diese müssen natürlich für die Verwendung auf dem eigenen Server angepasst werden, da die Konfigurationen ansonsten aus unerfindlichen Gründen nicht funktionieren können. Logisch oder?

Vorbereitung


Für eine erfolgreiche Konfiguration ist es erst einmal wichtig, dass das verwendete System auch über die aktuellsten Updates verfügt. Dies wird wie folgt erreicht:

apt update
apt upgrade -y

Nach dem das erledigt, können wir auch gleich durchstarten.

Installation der benötigten Programme


In diesem Abschnitt wollen wir erst einmal die Programme an sich installieren, bevor wir uns später mit ihnen auseinander setzen und diese konfigurieren.

apt install -y apache2 php php-fpm

Das installiert den Webserver Apache in der Version 2, PHPs FPM und die dazu benötigten weiteren Programme, u. a.  apache2-utils.

Konfiguration


PHP-FPM

Wir wollen uns erstmal PHP vornehmen und erstellen einen sogenannten Pool wie folgt:

nano /etc/php/7.0/fpm/pool.d/meinewebsite.conf

Und fügen dann dort den folgenden Inhalt ein:

[meinewebsite]

listen                                  = /var/run/php/meinewebsite.sock
listen.backlog                          = -1
listen.owner                            = www-data
listen.group                            = www-data
listen.mode                             = 0660

user                                    = meinewebsite
group                                   = meinewebsite

request_slowlog_timeout                 = 5s
request_terminate_timeout               = 120s
slowlog                                 = /var/log/meinewebsite/php-slowlog.log

pm                                      = dynamic
pm.max_children                         = 5
pm.start_servers                        = 3
pm.min_spare_servers                    = 2
pm.max_spare_servers                    = 4
pm.max_requests                         = 200
pm.status_path                          = /status

rlimit_files                            = 131072
rlimit_core                             = unlimited
catch_workers_output                    = yes


env[HOSTNAME]                           = $HOSTNAME
env[TMP]                                = /tmp
env[TMPDIR]                             = /tmp
env[TEMP]                               = /tmp

Als nächstes führen wir die folgenden Befehle aus:

mkdir -p /var/log/meinewebsite/
adduser --disabled-password 
    --disabled-login 
    --home /var/www/meinewebsite 
     meinewebsite
systemctl restart php7.0-fpm

Die Befehlskette erstellt zum einen im /var liegenden log-Verzeichnis einen Order für die Logs der Website, legt einen Benutzer an, unter dem später PHP ausgeführt wird und startet den FastCGI Process Manager (FPM) neu.

Damit wäre die Konfiguration von PHP auch schon abgeschlossen. So schnell kann’s gehen!

Apache

Weiter geht es mit der Konfiguration von unseren geliebten Webserver Apache. Und was machen wir am besten, in dem wir die folgenden Befehle ausführen:

mkdir -p /var/log/meinewebsite/www
mkdir -p /var/www/meinewebsite/www
chown -Rc meinewebsite:meinewebsite /var/www/meinewebsite
find /var/www/meinewebsite -type d -exec chmod 2770 {} +
nano /etc/apache2/sites-available/meinewebsite.conf

Und dann in die Datei „/etc/apache2/sites-available/meinewebsite.conf“, die folgende Magie einfügen:

<VirtualHost *:80>
        ServerName                                              example.net
        ServerAdmin                                             [email protected]
        Redirect                                                "/"     "https://www.example.net/"
</VirtualHost>

<VirtualHost *:80>
        ServerName                                              www.example.net
        ServerAdmin                                             [email protected]
        DocumentRoot                                            /var/www/meinewebsite/www

        ErrorLog                                                /var/log/meinewebsite/www/apache2_error.log
        CustomLog                                               /var/log/meinewebsite/www/apache2_access.log combined
        LogLevel                                                warn

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

                        <FilesMatch ".+.ph(p[3457]?|t|tml)$">
                                SetHandler "proxy:unix:/run/php/meinewebsite.sock|fcgi://localhost"
                        </FilesMatch>

                        <FilesMatch ".+.phps$">
                                Require all denied
                        </FilesMatch>

                        <FilesMatch "^.ph(p[3457]?|t|tml|ps)$">
                                Require all denied
                        </FilesMatch>
                </IfModule>
        </IfModule>

    <Directory /var/www/meinewebsite/www>
        Options                                         +FollowSymLinks -Indexes -MultiViews +ExecCGI
        AllowOverride                                   all
        Order                                           allow,deny
        Allow                                           from all
    </Directory>
    
</VirtualHost>

Und noch einmal geben wir weitere komplexe Befehle ein:

a2enmod proxy_fcgi
a2ensite meinewebsite
systemctl restart apache2

Außerdem erstellen wir noch die Datei /var/www/meinewebsite/www/phpinfo.php und fügen das folgende ein:

<?php
    phpinfo()
?>

Lasst uns einmal zusammenfassen: Wir haben für www.example.net im Log-Order der Website einen Unterordner, www, angelegt. Dort werden sich dann der Error- sowie der Access.log der Subdomain finden. Zusätzlich haben wir den Webroot für www.example.net unter /var/www/meinewebsite/www angelegt und diesen für den PHP-Benutzer beschreibbar gemacht. Außerdem haben wir Apache soweit konfiguriert, dass example.net auf www.example.net weiterleitet und haben Apache angewiesen sämtliche PHP-Scripte an PHP-FPM weiterzugeben.

Wofür das Ganze?


Das ist sogar eine relativ berechtige Frage. Für eine einfache Installation tut es auch Apache und dessen PHP-Module. Problematisch an der ganzen Sache ist jedoch, dass beim PHP-Module alle Scripte mit dem Benutzer des Webservers, www-data, ausgeführt werden. Hat man jetzt also unterschiedliche Websiten, die unterschiedlichen Personen gehören, kann der www-data-Benutzer auf alle Websiten zu greifen. Das ist ein ziemliches Sicherheitsproblem, besonders wenn man es bei den Besitzern der Website nicht mit den engsten Freunden zu tun hat.

Abschließend hab ich hier noch ein paar Links für Dich:

Neueste Beiträge

Neueste Kommentare

Archive

Kategorien

Meta

Javik Verfasst von:

Schreibe den ersten Kommentar

Kommentar verfassen