PHP-FPM

Der „PHP-FastCGI Process Manager“ (kurz PHP-FPM) ist eine alternative zur FastCGI Implementation von PHP in einem Webserver.

Hier besteht immer parallel zum Web-Server Prozess (zu mindest) ein PHP-FPM Prozess, an den PHP-Anfragen vom Web-Server weitergeleitet werden.

FPM-Prozesse unterteilen sich in unterschiedliche „Pools“. In diesen Pools werden typischerweise mehrere Prozesse für eine gewissen Seite gestartet werden damit diese bei Anfragen über den Web-Server gleich zur Verfügung stehen.

Die Anzahl dieser Prozesse und diverse anderen Einstellungen für den Pool können in der FPM Konfiguration (wie weiter unten zu sehen) eingestellt werden.

Installation (Debian basierte Distros)

sudo apt install php7.2 php7.2-common php7.2-cli php7.2-fpm

FPM Konfiguration

Diese befinden sich unter „/etc/php/7.2/fpm/pool.d/“.
Hier wird pro Socket eine Datei erstellt.

[<pool-name>]
user = <username>
group = <groupname>
listen = /run/php/<socket-name>.sock
listen.owner = www-data
listen.group = www-data
pm = dynamic
pm.max_children = 5
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3
env[HOSTNAME] = $HOSTNAME
env[PATH] = /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
chroot = <docroot-path>
php_admin_value[openssl.capath] = /etc/ssl/certs

Beim eingetragenen Pfad bei „listen“ wird nach neustarten des PHP-FPM-Prozesses ein Socket erstellt.

Über diesen kann dann der jeweilige Web-Server die Anfragen weiterleiten (siehe unten)

Web-Server Konfiguration (NGINX)

Der Web-Server muss dafür so konfiguriert werden, dass PHP-Files an den jeweiligen PHP-Prozess (typischerweise über einen Socket) weitergeleitet werden.

Am Beispiel vom NGINX-Web-Server: /etc/nginx/sites-available/<domain-name>.conf

server {
    listen 443 ssl http2; # managed by Certbot
    listen [::]:443 ssl http2;

    ssl_certificate /etc/letsencrypt/live/<domain-name>/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/<domain-name>/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot

    root <path-to-docroot>;
    server_name <domain-name>;

    index index.html index.htm index.php;

    location / {
        try_files $uri $uri/ /index.php?$args;
    }	

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
	fastcgi_pass unix:/run/php/<fpm-socket-name>.sock;
    }
	
    error_log <path-to-logs>/error.log warn;
    access_log <path-to-logs>/access.log apm;
}

server {
    if ($host = <domain-name>) {
        return 301 https://$host$request_uri;
    } # managed by Certbot
	
    listen 80;
    listen [::]:80;

    server_name <domain-name>;
    return 404; # managed by Certbot
}

Die folgende Zeile ist für die „Weiterleitung“ an den FPM-Prozess verantwortlich

fastcgi_pass unix:/run/php/<fpm-socket-name>.sock;

Der PHP-FPM Prozess muss bei jeder neu erstellten oder geändert Konfiguration neu gestartet werden um den Socket zu erstellen, zu dem sich dann der Webserver verbindet. In dem gleichen Zug kann der Webserver auch gleich neugestartet werden.

sudo systemctl restart php7.2-fpm.service nginx
Share this post

Schreibe einen Kommentar

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

This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

The reCAPTCHA verification period has expired. Please reload the page.