Aplicațiile web scrise în PHP (WordPress, Laravel, Symfony) sunt executate de Nginx prin protocolul binar FastCGI comunicând cu daemonul PHP-FPM (FastCGI Process Manager). O configurare defectuoasă a acestei punți de legătură este responsabilă pentru 99% din aparițiile erorilor frustrante 502 Bad Gateway (PHP-FPM s-a oprit sau a atins limita de procese) și 504 Gateway Timeout (un script PHP a depășit timpul maxim de execuție blocând Nginx).
1. UNIX Domain Sockets vs TCP: Câștig Imediat de 20% Viteză
Dacă Nginx și PHP-FPM rulează pe același server fizic sau în același container, nu folosiți niciodată conexiuni TCP pe loopback (127.0.0.1:9000). Conexiunile TCP implică un overhead masiv de încapsulare a pachetelor de rețea, calcul de sume de control (checksums) și riscul epuizării porturilor efemere (port exhaustion). Folosiți întotdeauna un UNIX Domain Socket:
# În blocul server:
location ~ \.php$ {
# Previne executarea de scripturi malițioase injectate în folderele de upload:
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
# Comunicare prin socket UNIX de mare viteză:
fastcgi_pass unix:/run/php/php8.4-fpm.sock;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
# 1. OPTIMIZARE BUFFERE FASTCGI (Previne scrierile temporare pe disc pentru pagini mari):
fastcgi_buffer_size 32k;
fastcgi_buffers 16 16k;
fastcgi_busy_buffers_size 64k;
fastcgi_temp_file_write_size 64k;
# 2. TIMEOUT-URI SINCRONIZATE (Previne erorile 504 Gateway Timeout):
fastcgi_connect_timeout 60s;
fastcgi_send_timeout 60s;
fastcgi_read_timeout 120s; # Oferă scripturilor complexe până la 2 minute
}
2. FastCGI Microcaching: Preluarea a 90% din Încărcare de către Nginx
Prin adăugarea câtorva linii de configurare, Nginx poate memora răspunsul HTML generat de PHP timp de 10-30 de secunde, servind mii de vizitatori simultani direct din RAM fără ca PHP să execute nicio interogare în MySQL:
# În contextul http:
fastcgi_cache_path /var/cache/nginx/fastcgi levels=1:2 keys_zone=PHP_CACHE:50m max_size=500m inactive=60m;
fastcgi_cache_key "$scheme$request_method$host$request_uri";
# În blocul location ~ \.php$:
fastcgi_cache PHP_CACHE;
fastcgi_cache_valid 200 301 302 10s;
fastcgi_cache_use_stale error timeout updating invalid_header http_500;
add_header X-FastCGI-Cache $upstream_cache_status;
3. Formula Matematică pentru Dimensionarea pm.max_children în PHP-FPM
Dacă setați pm.max_children prea mic, vizitatorii vor primi erori 502 Bad Gateway. Dacă îl setați prea mare, serverul va rămâne fără memorie RAM și va intra în swap (blocaj total). Iată formula exactă de calcul pentru fișierul /etc/php/8.4/fpm/pool.d/www.conf:
# Exemplu pentru un server cu 8 GB RAM:
# 1. Rezervăm 2 GB pentru Sistemul de Operare, Nginx și MySQL: RAM disponibil = 6 GB (6144 MB)
# 2. Măsurăm consumul mediu al unui proces PHP: ~60 MB
# 3. Calcul: 6144 MB / 60 MB = ~100 de procese
pm = dynamic
pm.max_children = 100
pm.start_servers = 20
pm.min_spare_servers = 10
pm.max_spare_servers = 30
pm.max_requests = 1000 # Repornește procesul după 1000 de cereri pentru a elimina memory leaks!