Table of Contents
The “PHP-FastCGI Process Manager” (short PHP-FPM) is an alternative FastCGI Implementation for PHP in a web-server.
Here we always have (at least) one PHP-FPM process parallel to the web-server process which handles PHP interpretation.
FPM processes group up into different “pools”. In these pools there will usually be several proccess created which handle PHP interpretation for a specific web page.
The amount of these processes and many more settings can be set in the FPM configuration (see bellow).
Installation (Debian based Distros)
sudo apt install php7.2 php7.2-common php7.2-cli php7.2-fpm
FPM Configuration
This is located in “/etc/php/7.2/fpm/pool.d/”.
Here we should create one file per socket/website.
[<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
The “listen” defines where the linux socket should be placed in the file system. This socket will be created after the PHP-FPM process has been restarted.
Via this socket the web-server can redirect PHP interpretation to the FPM process (see bellow)
Web-Server Configuration (NGINX)
The web-server has to know how and where it should send PHP-Files to the corresponding PHP process.
This is an example for: /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
}
The following line is responsible for the “redirection” to the FPM process:
fastcgi_pass unix:/run/php/<fpm-socket-name>.sock;
When you change something in the PHP-FPM config or the NGINX config you should always restart both services:
sudo systemctl restart php7.2-fpm.service nginx