БпСстСтС 15% ΠΎΡ‚ всички хостинг услуги

ВСствай умСнията си ΠΈ ΠΏΠΎΠ»ΡƒΡ‡ΠΈ ΠžΡ‚ΡΡ‚ΡŠΠΏΠΊΠ° Π·Π° всСки хостинг ΠΏΠ»Π°Π½

Π˜Π·ΠΏΠΎΠ»Π·Π²Π°ΠΉΡ‚Π΅ ΠΊΠΎΠ΄: Skills Π—Π° Π½Π°Ρ‡Π°Π»ΠΎ
Заглавия
Администрация Π’ΠΈΡ€Ρ‚ΡƒΠ°Π»Π½ΠΈ ΡΡŠΡ€Π²ΡŠΡ€ΠΈ

PHP-FPM (FastCGI Process Manager): Пълно Ρ€ΡŠΠΊΠΎΠ²ΠΎΠ΄ΡΡ‚Π²ΠΎ Π·Π° настройка, конфигурация ΠΈ оптимизация

PHP-FPM (PHP FastCGI Process Manager) Π΅ високопроизводитСлна Π°Π»Ρ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π½Π° систСма Π·Π° ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ Π½Π° PHP процСси, която ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚ΠΈΡ€Π° ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π° FastCGI, Π·Π° Π΄Π° ΠΎΡ‚Π΄Π΅Π»ΠΈ ΠΈΠ·ΠΏΡŠΠ»Π½Π΅Π½ΠΈΠ΅Ρ‚ΠΎ Π½Π° PHP ΠΎΡ‚ процСса Π½Π° ΡƒΠ΅Π± ΡΡŠΡ€Π²ΡŠΡ€Π°. ВмСсто Π΄Π° стартира Π½ΠΎΠ² PHP ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€ Π·Π° всяка входяща HTTP заявка β€” ΠΊΠ°ΠΊΡ‚ΠΎ ΠΏΡ€Π°Π²ΠΈ традиционният CGI β€” PHP-FPM ΠΏΠΎΠ΄Π΄ΡŠΡ€ΠΆΠ° постоянСн ΠΏΡƒΠ» ΠΎΡ‚ Ρ€Π°Π±ΠΎΡ‚Π½ΠΈ процСси, ΠΊΠΎΠΈΡ‚ΠΎ ΠΏΡ€ΠΈΠ΅ΠΌΠ°Ρ‚, ΠΈΠ·ΠΏΡŠΠ»Π½ΡΠ²Π°Ρ‚ ΠΈ Π²Ρ€ΡŠΡ‰Π°Ρ‚ PHP ΠΎΡ‚Π³ΠΎΠ²ΠΎΡ€ΠΈ с драстично ΠΏΠΎ-ниски Ρ€Π°Π·Ρ…ΠΎΠ΄ΠΈ.

Π—Π° всСки производствСн ΡƒΠ΅Π± ΡΡŠΡ€Π²ΡŠΡ€, Ρ€Π°Π±ΠΎΡ‚Π΅Ρ‰ с WordPress, Laravel, Symfony ΠΈΠ»ΠΈ пСрсонализирани PHP прилоТСния, PHP-FPM Π΅ стандартният ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ. Π’ΠΎΠΉ позволява ΠΏΡ€Π΅Ρ†ΠΈΠ·Π΅Π½ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ» Π²ΡŠΡ€Ρ…Ρƒ ТизнСния Ρ†ΠΈΠΊΡŠΠ» Π½Π° процСситС, ограничСнията Π½Π° ΠΏΠ°ΠΌΠ΅Ρ‚Ρ‚Π°, ΠΎΠΏΠ°ΡˆΠΊΠ°Ρ‚Π° ΠΎΡ‚ заявки ΠΈ изолацията Π½Π° прилоТСнията β€” Π²ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΠΈ, ΠΊΠΎΠΈΡ‚ΠΎ просто Π½Π΅ са Π½Π°Π»ΠΈΡ‡Π½ΠΈ с mod_php ΠΈΠ»ΠΈ ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ CGI.

Как PHP-FPM сС Ρ€Π°Π·Π»ΠΈΡ‡Π°Π²Π° ΠΎΡ‚ CGI ΠΈ mod_php

Π—Π° Π΄Π° Ρ€Π°Π·Π±Π΅Ρ€Π΅Ρ‚Π΅ Π·Π°Ρ‰ΠΎ PHP-FPM Π΅ Π²Π°ΠΆΠ΅Π½, ΠΏΠΎΠ»Π΅Π·Π½ΠΎ Π΅ Π΄Π° Π²ΠΈΠ΄ΠΈΡ‚Π΅ Ρ‚ΠΎΡ‡Π½ΠΎ ΠΊΠ°ΠΊΠ²ΠΎ замСства ΠΈ Π·Π°Ρ‰ΠΎ Ρ‚Π΅Π·ΠΈ Π°Π»Ρ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²ΠΈ са Π½Π΅Π΄ΠΎΡΡ‚Π°Ρ‚ΡŠΡ‡Π½ΠΈ ΠΏΡ€ΠΈ ΠΌΠ°Ρ‰Π°Π±ΠΈΡ€Π°Π½Π΅.

ЀункцияCGImod_phpPHP-FPM
МодСл Π½Π° процСситСНов процСс Π·Π° всяка заявкаВградСн Π² ApacheΠŸΠΎΡΡ‚ΠΎΡΠ½Π΅Π½ ΠΏΡƒΠ» ΠΎΡ‚ Ρ€Π°Π±ΠΎΡ‚Π½ΠΈ процСси
ЕфСктивност Π½Π° ΠΏΠ°ΠΌΠ΅Ρ‚Ρ‚Π°ΠœΠ½ΠΎΠ³ΠΎ Π½ΠΈΡΠΊΠ°Π£ΠΌΠ΅Ρ€Π΅Π½Π°ΠžΡ‚Π»ΠΈΡ‡Π½Π°
Π‘Π²ΡŠΡ€Π·Π°Π½ΠΎΡΡ‚ с ΡƒΠ΅Π± ΡΡŠΡ€Π²ΡŠΡ€Π°Π’ΡΡΠ½Π°Π’ΡΡΠ½Π° (само Apache)ΠžΡ‚Π΄Π΅Π»Π΅Π½Π° (всСки ΡΡŠΡ€Π²ΡŠΡ€)
Π˜Π·ΠΎΠ»Π°Ρ†ΠΈΡ Π½Π° ΡΠ°ΠΉΡ‚ΠΡΠΌΠ°ΠΡΠΌΠ°ΠŸΡŠΠ»Π½Π° (ΠΎΡ‚Π΄Π΅Π»Π½ΠΈ ΠΏΡƒΠ»ΠΎΠ²Π΅)
Плавно прСзарСТданСНСНСДа
Π‘Π°Π²Π΅Π½ Π»ΠΎΠ³ / профилиранСНСНСДа
Π”ΠΈΠ½Π°ΠΌΠΈΡ‡Π½ΠΎ ΠΌΠ°Ρ‰Π°Π±ΠΈΡ€Π°Π½Π΅ Π½Π° процСсиНСНСДа
ΠŸΠΎΠ΄Π΄Ρ€ΡŠΠΆΠΊΠ° Π½Π° Unix сокСтНСНСДа
Π‘ΡŠΠ²ΠΌΠ΅ΡΡ‚ΠΈΠΌΠΎΡΡ‚ с NGINXНСНСДа

CGI стартира Π½ΠΎΠ² OS процСс Π·Π° всяка заявка. ΠŸΡ€ΠΈ ΡƒΠΌΠ΅Ρ€Π΅Π½ Ρ‚Ρ€Π°Ρ„ΠΈΠΊ Ρ‚ΠΎΠ²Π° създава хиляди Ρ†ΠΈΠΊΠ»ΠΈ fork/exec/exit Π² ΠΌΠΈΠ½ΡƒΡ‚Π°, ΠΏΡ€Π΅Ρ‚ΠΎΠ²Π°Ρ€Π²Π°ΠΉΠΊΠΈ CPU ΠΈ ΠΏΠ°ΠΌΠ΅Ρ‚Ρ‚Π°. mod_php Π²Π³Ρ€Π°ΠΆΠ΄Π° PHP ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Π° Π΄ΠΈΡ€Π΅ΠΊΡ‚Π½ΠΎ във всСки Apache Ρ€Π°Π±ΠΎΡ‚Π΅Π½ процСс, ΠΊΠΎΠ΅Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π²Π°, Ρ‡Π΅ всСки Apache процСс β€” Π΄ΠΎΡ€ΠΈ Ρ‚Π°ΠΊΡŠΠ², обслуТващ статично ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ β€” носи ΠΏΡŠΠ»Π½ΠΎΡ‚ΠΎ PHP изпълнСниС Π² ΠΏΠ°ΠΌΠ΅Ρ‚Ρ‚Π°. PHP-FPM Ρ€Π΅ΡˆΠ°Π²Π° ΠΈ Π΄Π²Π°Ρ‚Π° ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°: Ρ€Π°Π±ΠΎΡ‚Π½ΠΈΡ‚Π΅ процСси са постоянни ΠΈ напълно ΠΎΡ‚Π΄Π΅Π»Π΅Π½ΠΈ ΠΎΡ‚ ΡƒΠ΅Π± ΡΡŠΡ€Π²ΡŠΡ€Π°, Ρ‚Π°ΠΊΠ° Ρ‡Π΅ NGINX ΠΈΠ»ΠΈ Apache ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π²Π°Ρ‚ статичнитС Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅ Π½Π°Ρ‚ΠΈΠ²Π½ΠΎ, Π΄ΠΎΠΊΠ°Ρ‚ΠΎ PHP-FPM ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π²Π° само PHP ΠΈΠ·ΠΏΡŠΠ»Π½Π΅Π½ΠΈΠ΅Ρ‚ΠΎ.

АрхитСктура Π½Π° PHP-FPM: ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π΅Π½ ΠΏΠΎΡ‚ΠΎΠΊ Π½Π° заявкитС

Π Π°Π·Π±ΠΈΡ€Π°Π½Π΅Ρ‚ΠΎ Π½Π° Π²ΡŠΡ‚Ρ€Π΅ΡˆΠ½ΠΈΡ ΠΏΡŠΡ‚ Π½Π° заявкитС Π΅ ΠΎΡ‚ ΡΡŠΡ‰Π΅ΡΡ‚Π²Π΅Π½ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π·Π° настройка ΠΈ отстраняванС Π½Π° Π³Ρ€Π΅ΡˆΠΊΠΈ.

  1. Π‘Ρ€Π°ΡƒΠ·ΡŠΡ€ΡŠΡ‚ ΠΈΠ·ΠΏΡ€Π°Ρ‰Π° HTTP заявка Π·Π° рСсурс .php.
  2. Π£Π΅Π± ΡΡŠΡ€Π²ΡŠΡ€ΡŠΡ‚ (NGINX ΠΈΠ»ΠΈ Apache) ΠΏΠΎΠ»ΡƒΡ‡Π°Π²Π° заявката ΠΈ я ΡΡŠΠΏΠΎΡΡ‚Π°Π²Ρ с location Π±Π»ΠΎΠΊ ΠΈΠ»ΠΈ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π° FilesMatch.
  3. Π£Π΅Π± ΡΡŠΡ€Π²ΡŠΡ€ΡŠΡ‚ ΠΏΡ€Π΅ΠΏΡ€Π°Ρ‰Π° заявката към PHP-FPM Ρ‡Ρ€Π΅Π· ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π° FastCGI β€” ΠΈΠ»ΠΈ Ρ‡Ρ€Π΅Π· Unix Π΄ΠΎΠΌΠ΅ΠΉΠ½ сокСт (/run/php/php8.2-fpm.sock), ΠΈΠ»ΠΈ Ρ‡Ρ€Π΅Π· TCP сокСт (127.0.0.1:9000).
  4. Главният процСс Π½Π° PHP-FPM насочва заявката към Π½Π°Π»ΠΈΡ‡Π΅Π½ Ρ€Π°Π±ΠΎΡ‚Π΅Π½ процСс ΠΎΡ‚ конфигурирания ΠΏΡƒΠ».
  5. Работният процСс изпълнява PHP скрипта, записва Π² stdout ΠΈ Π²Ρ€ΡŠΡ‰Π° ΠΎΡ‚Π³ΠΎΠ²ΠΎΡ€Π° Π½Π° ΡƒΠ΅Π± ΡΡŠΡ€Π²ΡŠΡ€Π°.
  6. Π£Π΅Π± ΡΡŠΡ€Π²ΡŠΡ€ΡŠΡ‚ доставя рСндСрирания HTML Π½Π° ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°.
  7. Работният процСс Π½Π΅ ΠΏΡ€ΠΈΠΊΠ»ΡŽΡ‡Π²Π° β€” Ρ‚ΠΎΠΉ сС Π²Ρ€ΡŠΡ‰Π° Π² ΠΏΡƒΠ»Π° Π½Π° Π½Π΅Π°ΠΊΡ‚ΠΈΠ²Π½ΠΈΡ‚Π΅ процСси, Π³ΠΎΡ‚ΠΎΠ² Π·Π° слСдващата заявка.

Unix сокСтитС сС ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡ΠΈΡ‚Π°Ρ‚ ΠΏΡ€Π΅Π΄ TCP Π·Π° Π»ΠΎΠΊΠ°Π»Π½Π° комуникация, Ρ‚ΡŠΠΉ ΠΊΠ°Ρ‚ΠΎ заобикалят изцяло TCP/IP стСка, намалявайки латСнтността с 10–20% Π² тСстовС ΠΈ Π΅Π»ΠΈΠΌΠΈΠ½ΠΈΡ€Π°ΠΉΠΊΠΈ Ρ€Π°Π·Ρ…ΠΎΠ΄ΠΈΡ‚Π΅ ΠΎΡ‚ ΡΠ²ΡŠΡ€Π·Π²Π°Π½Π΅ с ΠΏΠΎΡ€Ρ‚ ΠΈ loopback ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΈΠ·Π°Ρ†ΠΈΡ.

Π Π΅ΠΆΠΈΠΌΠΈ Π½Π° ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ Π½Π° процСситС

PHP-FPM ΠΏΠΎΠ΄Π΄ΡŠΡ€ΠΆΠ° Ρ‚Ρ€ΠΈ Ρ€Π΅ΠΆΠΈΠΌΠ° pm (ΠΌΠ΅Π½ΠΈΠ΄ΠΆΡŠΡ€ Π½Π° процСси), ΠΊΠ°Ρ‚ΠΎ ΠΈΠ·Π±ΠΎΡ€ΡŠΡ‚ Π½Π° Π³Ρ€Π΅ΡˆΠ΅Π½ Π΅ Π΅Π΄Π½Π° ΠΎΡ‚ Π½Π°ΠΉ-чСститС Π³Ρ€Π΅ΡˆΠΊΠΈ ΠΏΡ€ΠΈ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€Π°Π½Π΅.

pm = static

Ѐиксиран Π±Ρ€ΠΎΠΉ Ρ€Π°Π±ΠΎΡ‚Π½ΠΈ процСси Ρ€Π°Π±ΠΎΡ‚ΠΈ постоянно, нСзависимо ΠΎΡ‚ Ρ‚Ρ€Π°Ρ„ΠΈΠΊΠ°. Π˜Π·ΠΏΠΎΠ»Π·Π²Π°ΠΉΡ‚Π΅ Ρ‚ΠΎΠ²Π° Π½Π° dedicated ΡΡŠΡ€Π²ΡŠΡ€ΠΈ, ΠΊΡŠΠ΄Π΅Ρ‚ΠΎ искатС ΠΏΡ€Π΅Π΄Π²ΠΈΠ΄ΠΈΠΌΠ°, ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»Π½ΠΎ Ρ€Π°Π·ΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π° ΠΏΠ°ΠΌΠ΅Ρ‚ ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° си ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚Π΅ Ρ€Π°Π·Ρ…ΠΎΠ΄ΠΈΡ‚Π΅ ΠΏΡ€ΠΈ нСактивност.

pm = static
pm.max_children = 20

pm = dynamic

PHP-FPM стартира Π±Π°Π·ΠΎΠ² Π±Ρ€ΠΎΠΉ Ρ€Π°Π±ΠΎΡ‚Π½ΠΈ процСси ΠΈ ΠΌΠ°Ρ‰Π°Π±ΠΈΡ€Π° Π½Π°Π³ΠΎΡ€Π΅ ΠΈΠ»ΠΈ Π½Π°Π΄ΠΎΠ»Ρƒ Π² Ρ€Π°ΠΌΠΊΠΈΡ‚Π΅ Π½Π° ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈ Π³Ρ€Π°Π½ΠΈΡ†ΠΈ. Π’ΠΎΠ²Π° Π΅ Π½Π°ΠΉ-чСсто използваният Ρ€Π΅ΠΆΠΈΠΌ ΠΈ ΠΏΡ€Π°Π²ΠΈΠ»Π½Π°Ρ‚Π° настройка ΠΏΠΎ ΠΏΠΎΠ΄Ρ€Π°Π·Π±ΠΈΡ€Π°Π½Π΅ Π·Π° ΠΏΠΎΠ²Π΅Ρ‡Π΅Ρ‚ΠΎ срСди Π·Π° VPS Π₯остинг.

pm = dynamic
pm.max_children = 50
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 10
pm.max_requests = 500

pm = ondemand

Π Π°Π±ΠΎΡ‚Π½ΠΈΡ‚Π΅ процСси сС стартират само ΠΊΠΎΠ³Π°Ρ‚ΠΎ пристигнС заявка ΠΈ сС прСкратяват слСд pm.process_idle_timeout сСкунди нСактивност. Π’ΠΎΠ²Π° ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·ΠΈΡ€Π° ΠΏΠΎΡ‚Ρ€Π΅Π±Π»Π΅Π½ΠΈΠ΅Ρ‚ΠΎ Π½Π° ΠΏΠ°ΠΌΠ΅Ρ‚ ΠΏΡ€ΠΈ нСактивност ΠΈ Π΅ ΠΈΠ΄Π΅Π°Π»Π½ΠΎ Π·Π° сайтовС с нисък Ρ‚Ρ€Π°Ρ„ΠΈΠΊ ΠΈΠ»ΠΈ сподСлСни срСди, ΠΊΡŠΠ΄Π΅Ρ‚ΠΎ ΡΡŠΡ‰Π΅ΡΡ‚Π²ΡƒΠ²Π°Ρ‚ дСсСтки ΠΏΡƒΠ»ΠΎΠ²Π΅ Π΅Π΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ.

pm = ondemand
pm.max_children = 20
pm.process_idle_timeout = 10s

ΠšΡ€ΠΈΡ‚ΠΈΡ‡Π΅Π½ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ: ondemand въвСТда латСнтност ΠΏΡ€ΠΈ студСн старт ΠΏΡ€ΠΈ ΠΏΡŠΡ€Π²Π°Ρ‚Π° заявка слСд ΠΏΠ΅Ρ€ΠΈΠΎΠ΄ Π½Π° нСактивност. Π—Π° прилоТСния, чувствитСлни към латСнтност, dynamic Π²ΠΈΠ½Π°Π³ΠΈ Π΅ ΠΏΠΎ-добрият ΠΈΠ·Π±ΠΎΡ€.

ΠŸΡ€Π°Π²ΠΈΠ»Π½ΠΎ изчисляванС Π½Π° pm.max_children

Π’ΡƒΠΊ ΠΏΠΎΠ²Π΅Ρ‡Π΅Ρ‚ΠΎ администратори допускат ΡΠΊΡŠΠΏΠΎΡΡ‚Ρ€ΡƒΠ²Π°Ρ‰ΠΈ Π³Ρ€Π΅ΡˆΠΊΠΈ. Π—Π°Π΄Π°Π²Π°Π½Π΅Ρ‚ΠΎ Π½Π° Ρ‚Π²ΡŠΡ€Π΄Π΅ висока стойност Π·Π° pm.max_children причинява ΠΈΠ·Ρ‡Π΅Ρ€ΠΏΠ²Π°Π½Π΅ Π½Π° ΠΏΠ°ΠΌΠ΅Ρ‚Ρ‚Π° ΠΈ OOM прСкратявания; Ρ‚Π²ΡŠΡ€Π΄Π΅ ниска стойност причинява опашки ΠΎΡ‚ заявки ΠΈ Π³Ρ€Π΅ΡˆΠΊΠΈ 502 ΠΏΡ€ΠΈ Π½Π°Ρ‚ΠΎΠ²Π°Ρ€Π²Π°Π½Π΅.

ΠŸΡ€Π°Π²ΠΈΠ»Π½Π°Ρ‚Π° Ρ„ΠΎΡ€ΠΌΡƒΠ»Π°:

pm.max_children = (Available RAM for PHP) / (Average PHP worker memory usage)

Π—Π° Π΄Π° Π½Π°ΠΌΠ΅Ρ€ΠΈΡ‚Π΅ срСдната ΠΏΠ°ΠΌΠ΅Ρ‚ Π½Π° PHP Ρ€Π°Π±ΠΎΡ‚Π΅Π½ процСс:

ps --no-headers -o "rss,cmd" -C php-fpm8.2 | awk '{ sum+=$1 } END { printf "Average: %d MBn", sum/NR/1024 }'

На VPS с 2 GB RAM, ΠΊΡŠΠ΄Π΅Ρ‚ΠΎ NGINX, MySQL ΠΈ OS консумират ~600 MB, Ρ€Π°Π·ΠΏΠΎΠ»Π°Π³Π°Ρ‚Π΅ с ΠΏΡ€ΠΈΠ±Π»ΠΈΠ·ΠΈΡ‚Π΅Π»Π½ΠΎ 1 400 MB Π·Π° PHP. Ако всСки Ρ€Π°Π±ΠΎΡ‚Π΅Π½ процСс ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ~70 MB, бСзопасната стойност Π½Π° pm.max_children Π΅ 20. Никога Π½Π΅ я Π·Π°Π΄Π°Π²Π°ΠΉΡ‚Π΅ Π½Π° Π±Π°Π·Π° прСдполоТСния.

Π˜Π½ΡΡ‚Π°Π»ΠΈΡ€Π°Π½Π΅ Π½Π° PHP-FPM

Debian / Ubuntu

sudo apt update
sudo apt install php8.2-fpm
sudo systemctl enable php8.2-fpm
sudo systemctl start php8.2-fpm

CentOS / AlmaLinux / RHEL (с Remi Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅)

sudo dnf install epel-release
sudo dnf install https://rpms.remirepo.net/enterprise/remi-release-9.rpm
sudo dnf module enable php:remi-8.2
sudo dnf install php-fpm
sudo systemctl enable php-fpm
sudo systemctl start php-fpm

ΠŸΡ€ΠΎΠ²Π΅Ρ€Π΅Ρ‚Π΅ Π΄Π°Π»ΠΈ услугата Ρ€Π°Π±ΠΎΡ‚ΠΈ ΠΈ ΠΏΠΎΡ‚Π²ΡŠΡ€Π΄Π΅Ρ‚Π΅ ΠΏΡŠΡ‚Ρ Π½Π° сокСта:

sudo systemctl status php8.2-fpm
ls -la /run/php/

ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€Π°Π½Π΅ Π½Π° PHP-FPM ΠΏΡƒΠ»ΠΎΠ²Π΅

ΠžΡΠ½ΠΎΠ²Π½Π°Ρ‚Π° конфигурация Π½Π° PHP-FPM сС Π½Π°ΠΌΠΈΡ€Π° Π² /etc/php/8.2/fpm/php-fpm.conf, Π½ΠΎ ΠΎΡ‚Π΄Π΅Π»Π½ΠΈΡ‚Π΅ Π΄Π΅Ρ„ΠΈΠ½ΠΈΡ†ΠΈΠΈ Π½Π° ΠΏΡƒΠ»ΠΎΠ²Π΅ ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠ°Ρ‚ Π² /etc/php/8.2/fpm/pool.d/. На RHEL-Π±Π°Π·ΠΈΡ€Π°Π½ΠΈ систСми Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅Ρ‚Π΅ Π½Π° ΠΏΡƒΠ»ΠΎΠ²Π΅Ρ‚Π΅ сС Π½Π°ΠΌΠΈΡ€Π°Ρ‚ Π² /etc/php-fpm.d/.

ВсСки ΠΏΡƒΠ» Π΅ ΠΈΠ·ΠΎΠ»ΠΈΡ€Π°Π½Π° срСда Π·Π° изпълнСниС. Π Π°Π±ΠΎΡ‚Π°Ρ‚Π° с мноТСство PHP прилоТСния Π½Π° Π΅Π΄ΠΈΠ½ ΠΈ ΡΡŠΡ‰ΠΈ ΡΡŠΡ€Π²ΡŠΡ€ β€” Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ WordPress сайт ΠΈ Laravel API β€” ΠΎΠ·Π½Π°Ρ‡Π°Π²Π° създаванС Π½Π° ΠΎΡ‚Π΄Π΅Π»Π½ΠΈ Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅ Π½Π° ΠΏΡƒΠ»ΠΎΠ²Π΅ с ΠΎΡ‚Π΄Π΅Π»Π½ΠΈ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»ΠΈ, ΠΏΡŠΡ‚ΠΈΡ‰Π° Π½Π° сокСти ΠΈ ограничСния Π½Π° рСсурситС. Π’ΠΎΠ²Π° Π΅ ΠΏΡ€Π°Π²ΠΈΠ»Π½Π°Ρ‚Π° Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π° Π·Π° ΠΌΠ½ΠΎΠ³ΠΎΡ‚Π΅Π½Π°Π½Ρ‚Π½ΠΈ настройки ΠΈ Π΅ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»Π½ΠΎ ΠΏΠΎ-сигурна ΠΎΡ‚ сподСлянСто Π½Π° Π΅Π΄ΠΈΠ½ ΠΏΡƒΠ».

ΠŸΡ€ΠΈΠΌΠ΅Ρ€: ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ Π½Π° производствСн ΠΏΡƒΠ»

[myapp]
user = myapp
group = myapp

; Unix socket β€” always prefer this over TCP for local communication
listen = /run/php/myapp-fpm.sock
listen.owner = www-data
listen.group = www-data
listen.mode = 0660

; Process manager
pm = dynamic
pm.max_children = 30
pm.start_servers = 5
pm.min_spare_servers = 3
pm.max_spare_servers = 10
pm.max_requests = 1000

; Slow log β€” log requests taking longer than 2 seconds
slowlog = /var/log/php-fpm/myapp-slow.log
request_slowlog_timeout = 2s

; Status and ping endpoints
pm.status_path = /fpm-status
ping.path = /fpm-ping

; Environment isolation
clear_env = yes
env[HOSTNAME] = $HOSTNAME
env[PATH] = /usr/local/bin:/usr/bin:/bin

; PHP value overrides per pool
php_admin_value[error_log] = /var/log/php-fpm/myapp-error.log
php_admin_flag[log_errors] = on
php_admin_value[memory_limit] = 256M
php_admin_value[upload_max_filesize] = 64M
php_admin_value[post_max_size] = 64M

Π”ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π°Ρ‚Π° clear_env = yes Π΅ ΠΊΡ€ΠΈΡ‚ΠΈΡ‡Π½Π° Π·Π° сигурността настройка, която чСсто сС ΠΏΡ€Π΅Π½Π΅Π±Ρ€Π΅Π³Π²Π°. Π‘Π΅Π· нСя PHP Ρ€Π°Π±ΠΎΡ‚Π½ΠΈΡ‚Π΅ процСси наслСдяват всички ΠΏΡ€ΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ Π½Π° срСдата ΠΎΡ‚ главния процСс, ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»Π½ΠΎ ΠΈΠ·Ρ‚ΠΈΡ‡Π°ΠΉΠΊΠΈ чувствитСлни систСмни Π΄Π°Π½Π½ΠΈ Π² $_ENV Π½Π° Π²Π°ΡˆΠ΅Ρ‚ΠΎ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅.

Π˜Π½Ρ‚Π΅Π³Ρ€ΠΈΡ€Π°Π½Π΅ Π½Π° PHP-FPM с NGINX

NGINX няма Π½Π°Ρ‚ΠΈΠ²Π½Π° Π²ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ Π·Π° изпълнСниС Π½Π° PHP β€” Ρ‚ΠΎΠΉ Ρ€Π°Π·Ρ‡ΠΈΡ‚Π° изцяло Π½Π° FastCGI Π·Π° Π΄Π΅Π»Π΅Π³ΠΈΡ€Π°Π½Π΅ Π½Π° PHP заявки. Π’ΠΎΠ²Π° Π²ΡΡŠΡ‰Π½ΠΎΡΡ‚ Π΅ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π½ΠΎ прСдимство: NGINX ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π²Π° статичнитС Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅ ΠΏΡ€ΠΈ ΠΏΠΎΡ‡Ρ‚ΠΈ Π½ΡƒΠ»Π΅Π²Π° Ρ†Π΅Π½Π°, Π΄ΠΎΠΊΠ°Ρ‚ΠΎ PHP-FPM ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π²Π° само Ρ‚ΠΎΠ²Π°, ΠΊΠΎΠ΅Ρ‚ΠΎ изисква изпълнСниС.

server {
    listen 80;
    server_name example.com;
    root /var/www/myapp/public;
    index index.php index.html;

    # Serve static files directly, no PHP involvement
    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    # Delegate PHP to PHP-FPM
    location ~ .php$ {
        # Security: prevent executing uploaded files as PHP
        try_files $uri =404;
        fastcgi_split_path_info ^(.+.php)(/.+)$;

        fastcgi_pass unix:/run/php/myapp-fpm.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
        include fastcgi_params;

        # Performance tuning
        fastcgi_buffers 16 16k;
        fastcgi_buffer_size 32k;
        fastcgi_read_timeout 300;
    }

    # Block access to the FPM status page from public
    location ~ ^/(fpm-status|fpm-ping)$ {
        allow 127.0.0.1;
        deny all;
        fastcgi_pass unix:/run/php/myapp-fpm.sock;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }
}

Π‘Π΅Π»Π΅ΠΆΠΊΠ° Π·Π° сигурността: Π Π΅Π΄ΡŠΡ‚ try_files $uri =404; ΠΏΡ€Π΅Π΄ΠΈ fastcgi_pass Π½Π΅ Π΅ ΠΏΠΎ ΠΈΠ·Π±ΠΎΡ€. Π‘Π΅Π· Π½Π΅Π³ΠΎ NGINX Ρ‰Π΅ ΠΏΡ€Π΅ΠΏΡ€Π°Ρ‰Π° заявки Π·Π° Π½Π΅ΡΡŠΡ‰Π΅ΡΡ‚Π²ΡƒΠ²Π°Ρ‰ΠΈ Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅ към PHP-FPM, позволявайки Π°Ρ‚Π°ΠΊΠΈ Π·Π° ΠΎΠ±Ρ…ΠΎΠΆΠ΄Π°Π½Π΅ Π½Π° ΠΏΡŠΡ‚ΠΈΡ‰Π°, ΠΏΡ€ΠΈ ΠΊΠΎΠΈΡ‚ΠΎ нападатСлят ΠΊΠ°Ρ‡Π²Π° ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅, ΡΡŠΠ΄ΡŠΡ€ΠΆΠ°Ρ‰ΠΎ PHP ΠΊΠΎΠ΄, ΠΈ ΠΏΠΎΠ΄ΠΌΠ°ΠΌΠ²Π° ΡΡŠΡ€Π²ΡŠΡ€Π° Π΄Π° Π³ΠΎ изпълни.

Π˜Π½Ρ‚Π΅Π³Ρ€ΠΈΡ€Π°Π½Π΅ Π½Π° PHP-FPM с Apache

Apache изисква mod_proxy_fcgi Π·Π° комуникация с PHP-FPM. Π—Π° Ρ€Π°Π·Π»ΠΈΠΊΠ° ΠΎΡ‚ mod_php, Ρ‚ΠΎΠ·ΠΈ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ позволява Π½Π° Apache Π΄Π° стартира PHP-FPM ΠΊΠ°Ρ‚ΠΎ ΠΎΡ‚Π΄Π΅Π»Π΅Π½ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π», подобрявайки изолацията.

sudo a2enmod proxy_fcgi setenvif
sudo systemctl restart apache2

ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ Π½Π° Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»Π΅Π½ хост:

<VirtualHost *:80>
    ServerName example.com
    DocumentRoot /var/www/myapp/public

    <Directory /var/www/myapp/public>
        Options -Indexes +FollowSymLinks
        AllowOverride All
        Require all granted
    </Directory>

    <FilesMatch ".php$">
        SetHandler "proxy:unix:/run/php/myapp-fpm.sock|fcgi://localhost/"
    </FilesMatch>

    ErrorLog ${APACHE_LOG_DIR}/myapp-error.log
    CustomLog ${APACHE_LOG_DIR}/myapp-access.log combined
</VirtualHost>

АктивиранС ΠΈ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° страницата Π·Π° статус Π½Π° PHP-FPM

Π’Π³Ρ€Π°Π΄Π΅Π½Π°Ρ‚Π° страница Π·Π° статус Π΅ Π΅Π΄ΠΈΠ½ ΠΎΡ‚ Π½Π°ΠΉ-Π½Π΅Π΄ΠΎΡΡ‚Π°Ρ‚ΡŠΡ‡Π½ΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½ΠΈΡ‚Π΅ диагностични инструмСнти Π½Π° PHP-FPM. Π‘Π»Π΅Π΄ ΠΊΠ°Ρ‚ΠΎ pm.status_path Π΅ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€Π°Π½ Π² Ρ„Π°ΠΉΠ»Π° Π½Π° ΠΏΡƒΠ»Π°, Π½Π°ΠΏΡ€Π°Π²Π΅Ρ‚Π΅ заявка Π΄ΠΈΡ€Π΅ΠΊΡ‚Π½ΠΎ:

sudo -u www-data SCRIPT_NAME=/fpm-status SCRIPT_FILENAME=/fpm-status REQUEST_METHOD=GET cgi-fcgi -bind -connect /run/php/myapp-fpm.sock

Или, ΠΏΠΎ-ΠΏΡ€Π°ΠΊΡ‚ΠΈΡ‡Π½ΠΎ, Ρ‡Ρ€Π΅Π· curl слСд ΠΈΠ·Π»Π°Π³Π°Π½Π΅Ρ‚ΠΎ ΠΌΡƒ Π½Π° ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ Π²ΡŠΡ‚Ρ€Π΅ΡˆΠ΅Π½ endpoint:

curl http://127.0.0.1/fpm-status?full

ΠšΠ»ΡŽΡ‡ΠΎΠ²ΠΈ ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊΠΈ Π·Π° наблюдСниС:

  • listen queue: Заявки, Ρ‡Π°ΠΊΠ°Ρ‰ΠΈ свободСн Ρ€Π°Π±ΠΎΡ‚Π΅Π½ процСс. Всяка стойност Π½Π°Π΄ 0 ΠΏΡ€ΠΈ ΠΏΡ€ΠΎΠ΄ΡŠΠ»ΠΆΠΈΡ‚Π΅Π»Π½ΠΎ Π½Π°Ρ‚ΠΎΠ²Π°Ρ€Π²Π°Π½Π΅ ΠΎΠ·Π½Π°Ρ‡Π°Π²Π°, Ρ‡Π΅ pm.max_children Π΅ Ρ‚Π²ΡŠΡ€Π΄Π΅ ниска.
  • active processes: Π Π°Π±ΠΎΡ‚Π½ΠΈ процСси, ΠΈΠ·ΠΏΡŠΠ»Π½ΡΠ²Π°Ρ‰ΠΈ PHP Π² ΠΌΠΎΠΌΠ΅Π½Ρ‚Π°. Ако Ρ‚ΠΎΠ²Π° постоянно Π΅ Ρ€Π°Π²Π½ΠΎ Π½Π° pm.max_children, стС достигнали ΠΊΠ°ΠΏΠ°Ρ†ΠΈΡ‚Π΅Ρ‚Π°.
  • slow requests: ΠšΡƒΠΌΡƒΠ»Π°Ρ‚ΠΈΠ²Π΅Π½ Π±Ρ€ΠΎΠΉ заявки, Π½Π°Π΄Ρ…Π²ΡŠΡ€Π»ΠΈΠ»ΠΈ request_slowlog_timeout. Нарастващ Π±Ρ€ΠΎΠΉ ΠΏΠΎΠΊΠ°Π·Π²Π° ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΈ Π½Π° Π½ΠΈΠ²ΠΎ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅.

ИзползванС Π½Π° бавния Π»ΠΎΠ³ Π·Π° отстраняванС Π½Π° ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΈ с производитСлността

Бавният Π»ΠΎΠ³ записва пълСн PHP stack trace Π·Π° всяка заявка, Π½Π°Π΄Ρ…Π²ΡŠΡ€Π»ΡΡ‰Π° конфигурирания ΠΏΡ€Π°Π³. Π’ΠΎΠ²Π° Π΅ Π±Π΅Π·Ρ†Π΅Π½Π½ΠΎ Π·Π° ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΡ†ΠΈΡ€Π°Π½Π΅ Π½Π° N+1 ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΈ с заявки, Π±Π»ΠΎΠΊΠΈΡ€Π°Ρ‰ΠΈ I/O извиквания ΠΈΠ»ΠΈ Π½Π΅Π΅Ρ„Π΅ΠΊΡ‚ΠΈΠ²Π½ΠΈ Ρ†ΠΈΠΊΠ»ΠΈ, Π±Π΅Π· Π΄Π° Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌ пълСн ΠΏΡ€ΠΎΡ„ΠΈΠ»Π΅Ρ€.

slowlog = /var/log/php-fpm/myapp-slow.log
request_slowlog_timeout = 2s

Запис Π² бавния Π»ΠΎΠ³ ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π° Ρ‚Π°ΠΊΠ°:

[21-Jun-2025 14:32:11]  [pool myapp] pid 18432
script_filename = /var/www/myapp/public/index.php
[0x00007f3b4c001e80] PDOStatement->execute() /var/www/myapp/vendor/laravel/framework/src/Illuminate/Database/Connection.php:338
[0x00007f3b4c001d40] runQueryCallback() /var/www/myapp/vendor/laravel/framework/src/Illuminate/Database/Connection.php:295

Π’ΠΎΠ²Π° Π½Π΅Π·Π°Π±Π°Π²Π½ΠΎ Π²ΠΈ ΠΊΠ°Π·Π²Π°, Ρ‡Π΅ тСсното място Π΅ заявка към Π±Π°Π·Π°Ρ‚Π° Π΄Π°Π½Π½ΠΈ, Π° Π½Π΅ PHP Π»ΠΎΠ³ΠΈΠΊΠ° β€” насочвайки усилията Π²ΠΈ Π·Π° оптимизация ΠΏΡ€Π΅Ρ†ΠΈΠ·Π½ΠΎ.

PHP-FPM с OPcache: Π‘ΡŠΡ‰Π΅ΡΡ‚Π²Π΅Π½ΠΎΡ‚ΠΎ ΡΡŠΡ‡Π΅Ρ‚Π°Π½ΠΈΠ΅

PHP-FPM сам ΠΏΠΎ сСбС си управлява процСситС; OPcache Π΅Π»ΠΈΠΌΠΈΠ½ΠΈΡ€Π° Ρ€Π°Π·Ρ…ΠΎΠ΄ΠΈΡ‚Π΅ ΠΎΡ‚ парсванС ΠΈ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€Π°Π½Π΅ Π½Π° PHP ΠΈΠ·Ρ…ΠΎΠ΄Π½ΠΈ Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅ ΠΏΡ€ΠΈ всяка заявка. Π—Π°Π΅Π΄Π½ΠΎ Ρ‚Π΅ Ρ„ΠΎΡ€ΠΌΠΈΡ€Π°Ρ‚ пълния стСк Π·Π° производитСлност Π½Π° PHP Π² Linux.

АктивирайтС ΠΈ настройтС OPcache Π² /etc/php/8.2/fpm/php.ini ΠΈΠ»ΠΈ Π² спСциалСн /etc/php/8.2/fpm/conf.d/10-opcache.ini:

opcache.enable=1
opcache.memory_consumption=256
opcache.interned_strings_buffer=16
opcache.max_accelerated_files=20000
opcache.revalidate_freq=0
opcache.validate_timestamps=0
opcache.jit_buffer_size=128M
opcache.jit=tracing

Π—Π°Π΄Π°Π²Π°Π½Π΅Ρ‚ΠΎ Π½Π° validate_timestamps=0 Π΄Π΅Π°ΠΊΡ‚ΠΈΠ²ΠΈΡ€Π° ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈΡ‚Π΅ Π·Π° модификация Π½Π° Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅ ΠΏΡ€ΠΈ всяка заявка β€” Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»Π½ΠΎ ΠΏΠΎΠ΄ΠΎΠ±Ρ€Π΅Π½ΠΈΠ΅ Π½Π° производитСлността Π² производствСна срСда. ΠšΠΎΠ³Π°Ρ‚ΠΎ Ρ€Π°Π·Π³Ρ€ΡŠΡ‰Π°Ρ‚Π΅ Π½ΠΎΠ² ΠΊΠΎΠ΄, задСйствайтС ΠΈΠ·Ρ€ΠΈΡ‡Π½ΠΎ Π½ΡƒΠ»ΠΈΡ€Π°Π½Π΅ Π½Π° кСша:

sudo systemctl reload php8.2-fpm

На VPS с cPanel, настройкитС Π½Π° OPcache чСсто са Π΄ΠΎΡΡ‚ΡŠΠΏΠ½ΠΈ Π² интСрфСйса Π·Π° конфигурация Π½Π° PHP, Π½ΠΎ Ρ€ΡŠΡ‡Π½ΠΎΡ‚ΠΎ настройванС Ρ‡Ρ€Π΅Π· Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅ .ini Π²ΠΈΠ½Π°Π³ΠΈ осигурява ΠΏΠΎ-Ρ„ΠΈΠ½ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ».

Π£ΠΊΡ€Π΅ΠΏΠ²Π°Π½Π΅ Π½Π° сигурността Π½Π° PHP-FPM

Π‘Ρ‚Π°Ρ€Ρ‚ΠΈΡ€Π°ΠΉΡ‚Π΅ всСки ΠΏΡƒΠ» ΠΊΠ°Ρ‚ΠΎ спСциалСн систСмСн ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»

Никога Π½Π΅ стартирайтС PHP-FPM ΠΏΡƒΠ»ΠΎΠ²Π΅ ΠΊΠ°Ρ‚ΠΎ root ΠΈΠ»ΠΈ ΠΊΠ°Ρ‚ΠΎ сподСлСн ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π» www-data Π·Π° мноТСство прилоТСния. Π‘ΡŠΠ·Π΄Π°ΠΉΡ‚Π΅ спСциалСн систСмСн ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π» Π·Π° всяко ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅:

sudo useradd --system --no-create-home --shell /usr/sbin/nologin myapp

Π‘Π»Π΅Π΄ Ρ‚ΠΎΠ²Π° Π·Π°Π΄Π°ΠΉΡ‚Π΅ user = myapp ΠΈ group = myapp Π² конфигурацията Π½Π° ΠΏΡƒΠ»Π°. Π’ΠΎΠ²Π° Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€Π°, Ρ‡Π΅ ΠΊΠΎΠΌΠΏΡ€ΠΎΠΌΠ΅Ρ‚ΠΈΡ€Π°Π½ΠΎ PHP ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π½Π΅ ΠΌΠΎΠΆΠ΅ Π΄Π° Ρ‡Π΅Ρ‚Π΅ Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅, ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠ°Ρ‰ΠΈ Π½Π° Π΄Ρ€ΡƒΠ³ΠΈ прилоТСния Π½Π° ΡΡŠΡ‰ΠΈΡ ΡΡŠΡ€Π²ΡŠΡ€.

ΠžΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Ρ‚Π΅ PHP Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈΡ‚Π΅

Π’ Π±Π»ΠΎΠΊΠ° php_admin_value Π½Π° ΠΏΡƒΠ»Π° Π΄Π΅Π°ΠΊΡ‚ΠΈΠ²ΠΈΡ€Π°ΠΉΡ‚Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈΡ‚Π΅, ΠΊΠΎΠΈΡ‚ΠΎ нямат Π»Π΅Π³ΠΈΡ‚ΠΈΠΌΠ½Π° ΡƒΠΏΠΎΡ‚Ρ€Π΅Π±Π° Π² ΡƒΠ΅Π± прилоТСния:

php_admin_value[disable_functions] = exec,passthru,shell_exec,system,proc_open,popen,curl_exec,curl_multi_exec,parse_ini_file,show_source

ΠžΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Ρ‚Π΅ Open Basedir

ΠžΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Ρ‚Π΅ Π΄ΠΎΡΡ‚ΡŠΠΏΠ° Π½Π° PHP Π΄ΠΎ Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅ само Π² дирСкторията Π½Π° ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ:

php_admin_value[open_basedir] = /var/www/myapp:/tmp

Π˜Π·ΠΏΠΎΠ»Π·Π²Π°ΠΉΡ‚Π΅ Unix сокСти със строги Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ

TCP сокСтитС (127.0.0.1:9000) са Π΄ΠΎΡΡ‚ΡŠΠΏΠ½ΠΈ Π·Π° всСки процСс Π½Π° ΡΡŠΡ€Π²ΡŠΡ€Π°. Unix сокСтитС с listen.mode = 0660 ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π°Π²Π°Ρ‚ Π΄ΠΎΡΡ‚ΡŠΠΏΠ° само Π΄ΠΎ притСТаващия ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π» ΠΈ Π³Ρ€ΡƒΠΏΠ°.

ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π½Π° пълния стСк

Π‘Π»Π΅Π΄ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€Π°Π½Π΅ Π½Π° PHP-FPM ΠΈ вашия ΡƒΠ΅Π± ΡΡŠΡ€Π²ΡŠΡ€, ΠΏΡ€ΠΎΠ²Π΅Ρ€Π΅Ρ‚Π΅ цялата Π²Π΅Ρ€ΠΈΠ³Π° ΠΏΡ€Π΅Π΄ΠΈ Π΄Π° пуснСтС Π² производство.

ΠŸΡ€Π΅Π·Π°Ρ€Π΅Π΄Π΅Ρ‚Π΅ всички услуги:

sudo systemctl reload php8.2-fpm
sudo systemctl reload nginx
# or
sudo systemctl reload apache2

ВСствайтС синтаксиса Π½Π° конфигурацията Π½Π° NGINX ΠΏΡ€Π΅Π΄ΠΈ ΠΏΡ€Π΅Π·Π°Ρ€Π΅ΠΆΠ΄Π°Π½Π΅:

sudo nginx -t

Π‘ΡŠΠ·Π΄Π°ΠΉΡ‚Π΅ Π²Ρ€Π΅ΠΌΠ΅Π½Π΅Π½ info Ρ„Π°ΠΉΠ» (ΠΏΡ€Π΅ΠΌΠ°Ρ…Π½Π΅Ρ‚Π΅ Π³ΠΎ слСд ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ°Ρ‚Π° β€” Ρ‚ΠΎΠΉ ΠΈΠ·Π»Π°Π³Π° чувствитСлни Π΄Π°Π½Π½ΠΈ Π·Π° ΡΡŠΡ€Π²ΡŠΡ€Π°):

echo "<?php phpinfo();" | sudo tee /var/www/myapp/public/phpinfo.php

ΠžΡ‚Π²ΠΎΡ€Π΅Ρ‚Π΅ http://example.com/phpinfo.php Π² Π±Ρ€Π°ΡƒΠ·ΡŠΡ€ ΠΈ ΠΏΠΎΡ‚Π²ΡŠΡ€Π΄Π΅Ρ‚Π΅:

  • Server API ΠΏΠΎΠΊΠ°Π·Π²Π° FPM/FastCGI
  • PHP Version ΡΡŠΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²Π° Π½Π° инсталираната вСрсия
  • БСкцията OPcache Π΅ Π½Π°Π»ΠΈΡ‡Π½Π° ΠΈ Π°ΠΊΡ‚ΠΈΠ²ΠΈΡ€Π°Π½Π°

Π‘Π»Π΅Π΄ Ρ‚ΠΎΠ²Π° Π½Π΅Π·Π°Π±Π°Π²Π½ΠΎ ΠΏΡ€Π΅ΠΌΠ°Ρ…Π½Π΅Ρ‚Π΅ Ρ„Π°ΠΉΠ»Π°:

sudo rm /var/www/myapp/public/phpinfo.php

PHP-FPM Π² срСди с мноТСство прилоТСния ΠΈ висок Ρ‚Ρ€Π°Ρ„ΠΈΠΊ

На Dedicated ΡΡŠΡ€Π²ΡŠΡ€, хостващ дСсСтки PHP прилоТСния, Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π°Ρ‚Π° с мноТСство ΠΏΡƒΠ»ΠΎΠ²Π΅ става ΠΎΡ‚ ΡΡŠΡ‰Π΅ΡΡ‚Π²Π΅Π½ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. Всяко ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΏΠΎΠ»ΡƒΡ‡Π°Π²Π° свой собствСн ΠΏΡƒΠ» с нСзависимо настроСни pm.max_children, ограничСния Π½Π° ΠΏΠ°ΠΌΠ΅Ρ‚Ρ‚Π° ΠΈ ΠΏΡŠΡ‚ΠΈΡ‰Π° Π·Π° Π±Π°Π²Π΅Π½ Π»ΠΎΠ³. НСправилно Ρ€Π°Π±ΠΎΡ‚Π΅Ρ‰ΠΎ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, ΠΊΠΎΠ΅Ρ‚ΠΎ ΠΈΠ·Ρ‡Π΅Ρ€ΠΏΠ²Π° своя ΠΏΡƒΠ» ΠΎΡ‚ Ρ€Π°Π±ΠΎΡ‚Π½ΠΈ процСси, Π½Π΅ засяга Π΄Ρ€ΡƒΠ³ΠΈΡ‚Π΅ прилоТСния.

Π—Π° сцСнарии с висок Ρ‚Ρ€Π°Ρ„ΠΈΠΊ, ΠΊΠΎΠΌΠ±ΠΈΠ½ΠΈΡ€Π°ΠΉΡ‚Π΅ PHP-FPM с:

  • NGINX FastCGI ΠΊΠ΅ΡˆΠΈΡ€Π°Π½Π΅ (fastcgi_cache) Π·Π° обслуТванС Π½Π° ΠΊΠ΅ΡˆΠΈΡ€Π°Π½ΠΈΡ‚Π΅ PHP ΠΎΡ‚Π³ΠΎΠ²ΠΎΡ€ΠΈ ΠΊΠ°Ρ‚ΠΎ статични Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅, заобикаляйки изцяло PHP-FPM Π·Π° повтарящи сС заявки
  • Redis ΠΈΠ»ΠΈ Memcached Π·Π° ΡΡŠΡ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅ Π½Π° PHP сСсии, замСняйки стандартнитС Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎ-Π±Π°Π·ΠΈΡ€Π°Π½ΠΈ сСсии, ΠΊΠΎΠΈΡ‚ΠΎ ΡΡŠΠ·Π΄Π°Π²Π°Ρ‚ I/O конкурСнция ΠΏΡ€ΠΈ Π½Π°Ρ‚ΠΎΠ²Π°Ρ€Π²Π°Π½Π΅
  • Π₯ΠΎΡ€ΠΈΠ·ΠΎΠ½Ρ‚Π°Π»Π½ΠΎ ΠΌΠ°Ρ‰Π°Π±ΠΈΡ€Π°Π½Π΅ Ρ‡Ρ€Π΅Π· стартиранС Π½Π° PHP-FPM Π½Π° ΡΡŠΡ€Π²ΡŠΡ€ΠΈ Π·Π° прилоТСния Π·Π°Π΄ Π±Π°Π»Π°Π½ΡΡŒΠΎΡ€ Π½Π° Π½Π°Ρ‚ΠΎΠ²Π°Ρ€Π²Π°Π½Π΅Ρ‚ΠΎ, с NGINX Π½Π° ΠΎΡ‚Π΄Π΅Π»Π΅Π½ front-end възСл

Ако Π²Π°ΡˆΠΈΡΡ‚ стСк Π²ΠΊΠ»ΡŽΡ‡Π²Π° SSL Ρ‚Π΅Ρ€ΠΌΠΈΠ½ΠΈΡ€Π°Π½Π΅, ΡΡŠΡ‡Π΅Ρ‚Π°Π²Π°Π½Π΅Ρ‚ΠΎ Π½Π° PHP-FPM с ΠΏΡ€Π°Π²ΠΈΠ»Π½ΠΎ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€Π°Π½ΠΈ SSL сСртификати Π½Π° Π½ΠΈΠ²ΠΎ NGINX Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€Π°, Ρ‡Π΅ TLS Ρ€ΡŠΠΊΠΎΡΡ‚ΠΈΡΠΊΠ°Π½ΠΈΡΡ‚Π° сС ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π²Π°Ρ‚ ΠΏΡ€Π΅Π΄ΠΈ заявкитС Π΄Π° достигнат PHP-FPM, ΠΏΠΎΠ΄Π΄ΡŠΡ€ΠΆΠ°ΠΉΠΊΠΈ PHP Ρ€Π°Π±ΠΎΡ‚Π½ΠΈΡ‚Π΅ процСси фокусирани ΠΈΠ·ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»Π½ΠΎ Π²ΡŠΡ€Ρ…Ρƒ Π»ΠΎΠ³ΠΈΠΊΠ°Ρ‚Π° Π½Π° ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ.

Π—Π° изчислитСлно ΠΈΠ½Ρ‚Π΅Π½Π·ΠΈΠ²Π½ΠΈ PHP натоварвания β€” ΠΈΠ·Π²ΠΎΠ΄ Π·Π° машинно ΠΎΠ±ΡƒΡ‡Π΅Π½ΠΈΠ΅ Ρ‡Ρ€Π΅Π· PHP ΠΎΠ±Π²ΡŠΡ€Π·Π²Π°Π½ΠΈΡ, ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π½Π° изобраТСния ΠΈΠ»ΠΈ транскодиранС Π½Π° Π²ΠΈΠ΄Π΅ΠΎ β€” обмислСтС GPU Π₯остинг, ΠΊΡŠΠ΄Π΅Ρ‚ΠΎ PHP-FPM ΠΌΠΎΠΆΠ΅ Π΄Π° Π΄Π΅Π»Π΅Π³ΠΈΡ€Π° Ρ‚Π΅ΠΆΠΊΠΈΡ‚Π΅ изчислСния към GPU-ускорСни Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ, ΠΏΠΎΠ΄Π΄ΡŠΡ€ΠΆΠ°ΠΉΠΊΠΈ стандартна ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π½Π° заявки Π·Π° ΡƒΠ΅Π± слоя.

ΠšΠ»ΡŽΡ‡ΠΎΠ²Π° ΠΌΠ°Ρ‚Ρ€ΠΈΡ†Π° Π·Π° Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΈ тСхничСски ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π΅Π½ списък

ΠŸΡ€Π΅Π΄ΠΈ Ρ€Π°Π·Π³Ρ€ΡŠΡ‰Π°Π½Π΅ Π½Π° PHP-FPM Π² производство, ΠΏΡ€ΠΎΠ²Π΅Ρ€Π΅Ρ‚Π΅ всСки Π΅Π»Π΅ΠΌΠ΅Π½Ρ‚ ΠΎΡ‚ Ρ‚ΠΎΠ·ΠΈ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π΅Π½ списък:

Π˜Π·Π±ΠΎΡ€ Π½Π° ΠΌΠ΅Π½ΠΈΠ΄ΠΆΡŠΡ€ Π½Π° процСси

  • Π˜Π·ΠΏΠΎΠ»Π·Π²Π°ΠΉΡ‚Π΅ pm = dynamic Π·Π° ΠΎΠ±Ρ‰ΠΈ VPS натоварвания
  • Π˜Π·ΠΏΠΎΠ»Π·Π²Π°ΠΉΡ‚Π΅ pm = static само Π½Π° dedicated ΡΡŠΡ€Π²ΡŠΡ€ΠΈ с ΠΏΡ€Π΅Π΄Π²ΠΈΠ΄ΠΈΠΌ, постоянСн Ρ‚Ρ€Π°Ρ„ΠΈΠΊ
  • Π˜Π·ΠΏΠΎΠ»Π·Π²Π°ΠΉΡ‚Π΅ pm = ondemand само Π·Π° ΠΏΡƒΠ»ΠΎΠ²Π΅ с нисък Ρ‚Ρ€Π°Ρ„ΠΈΠΊ ΠΈΠ»ΠΈ Π·Π° Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ°

ΠŸΠ»Π°Π½ΠΈΡ€Π°Π½Π΅ Π½Π° ΠΊΠ°ΠΏΠ°Ρ†ΠΈΡ‚Π΅Ρ‚Π°

  • Π˜Π·ΠΌΠ΅Ρ€Π΅Ρ‚Π΅ дСйствитСлната ΠΏΠ°ΠΌΠ΅Ρ‚ Π½Π° работния процСс с ps ΠΏΡ€Π΅Π΄ΠΈ Π·Π°Π΄Π°Π²Π°Π½Π΅ Π½Π° pm.max_children
  • Π—Π°ΠΏΠ°Π·Π΅Ρ‚Π΅ ΠΏΠΎΠ½Π΅ 20% ΠΎΡ‚ ΠΎΠ±Ρ‰Π°Ρ‚Π° RAM Π·Π° OS, ΡƒΠ΅Π± ΡΡŠΡ€Π²ΡŠΡ€Π° ΠΈ Π±Π°Π·Π°Ρ‚Π° Π΄Π°Π½Π½ΠΈ
  • Π—Π°Π΄Π°ΠΉΡ‚Π΅ pm.max_requests ΠΌΠ΅ΠΆΠ΄Ρƒ 500–1000 Π·Π° прСдотвратяванС Π½Π° Π½Π°Ρ‚Ρ€ΡƒΠΏΠ²Π°Π½Π΅ Π½Π° ΠΈΠ·Ρ‚ΠΈΡ‡Π°Π½Π΅ Π½Π° ΠΏΠ°ΠΌΠ΅Ρ‚

Бигурност

  • ВсСки ΠΏΡƒΠ» Π½Π° ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Ρ€Π°Π±ΠΎΡ‚ΠΈ ΠΊΠ°Ρ‚ΠΎ свой собствСн систСмСн ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»
  • clear_env = yes Π΅ Π·Π°Π΄Π°Π΄Π΅Π½ във всСки ΠΏΡƒΠ»
  • open_basedir ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π°Π²Π° Π΄ΠΎΡΡ‚ΡŠΠΏΠ° Π΄ΠΎ Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅ Π΄ΠΎ дирСкторията Π½Π° ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ
  • disable_functions Π±Π»ΠΎΠΊΠΈΡ€Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈΡ‚Π΅ Π·Π° изпълнСниС Π½Π° shell ΠΊΠΎΠΌΠ°Π½Π΄ΠΈ
  • Π˜Π·ΠΏΠΎΠ»Π·Π²Π°Ρ‚ сС Unix сокСти вмСсто TCP сокСти

ΠΠ°Π±Π»ΡŽΠ΄Π°Π΅ΠΌΠΎΡΡ‚

  • pm.status_path Π΅ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€Π°Π½ ΠΈ Π΄ΠΎΡΡ‚ΡŠΠΏΠ΅Π½ само ΠΎΡ‚ localhost
  • slowlog Π΅ Π°ΠΊΡ‚ΠΈΠ²ΠΈΡ€Π°Π½ с request_slowlog_timeout ΠΎΡ‚ 2–5 сСкунди
  • Ротацията Π½Π° Π»ΠΎΠ³ΠΎΠ²Π΅Ρ‚Π΅ Π΅ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€Π°Π½Π° Π·Π° всички Π»ΠΎΠ³ Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅ Π½Π° PHP-FPM

ΠŸΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»Π½ΠΎΡΡ‚

  • OPcache Π΅ Π°ΠΊΡ‚ΠΈΠ²ΠΈΡ€Π°Π½ с validate_timestamps=0 Π² производствСна срСда
  • NGINX FastCGI ΠΊΠ΅ΡˆΠΈΡ€Π°Π½Π΅Ρ‚ΠΎ Π΅ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€Π°Π½ΠΎ Π·Π° ΠΊΠ΅ΡˆΠΈΡ€ΡƒΠ΅ΠΌΠΈ endpoints
  • PHP ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΡŠΡ‚ Π½Π° сСсии Π΅ настроСн Π½Π° Redis ΠΈΠ»ΠΈ Memcached, Π½Π΅ Π½Π° Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅

ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΈ

  • sudo systemctl reload php8.2-fpm сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Π·Π° ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈ Π² конфигурацията Π±Π΅Π· ΠΏΡ€Π΅ΠΊΡŠΡΠ²Π°Π½Π΅ (Π½Π΅ restart)
  • phpinfo.php сС ΠΏΡ€Π΅ΠΌΠ°Ρ…Π²Π° ΠΎΡ‚ document root Π½Π΅Π·Π°Π±Π°Π²Π½ΠΎ слСд ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ°Ρ‚Π°
  • ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡΡ‚Π° Π½Π° ΠΏΡƒΠ»Π° Π΅ ΠΏΠΎΠ΄ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ» Π½Π° вСрсиитС Π·Π°Π΅Π΄Π½ΠΎ с ΠΊΠΎΠ΄Π° Π½Π° ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ

Π§Π—Π’

Каква Π΅ Ρ€Π°Π·Π»ΠΈΠΊΠ°Ρ‚Π° ΠΌΠ΅ΠΆΠ΄Ρƒ PHP-FPM ΠΈ mod_php?

mod_php Π²Π³Ρ€Π°ΠΆΠ΄Π° PHP ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Π° във всСки Apache Ρ€Π°Π±ΠΎΡ‚Π΅Π½ процСс, консумирайки ΠΏΠ°ΠΌΠ΅Ρ‚ Π΄ΠΎΡ€ΠΈ ΠΏΡ€ΠΈ обслуТванС Π½Π° статични Ρ„Π°ΠΉΠ»ΠΎΠ²Π΅ ΠΈ тясно ΡΠ²ΡŠΡ€Π·Π²Π°ΠΉΠΊΠΈ PHP с Apache. PHP-FPM Ρ€Π°Π±ΠΎΡ‚ΠΈ ΠΊΠ°Ρ‚ΠΎ напълно ΠΎΡ‚Π΄Π΅Π»Π½Π° услуга, ΠΊΠΎΠΌΡƒΠ½ΠΈΠΊΠΈΡ€Π° Ρ‡Ρ€Π΅Π· FastCGI, Ρ€Π°Π±ΠΎΡ‚ΠΈ с всСки ΡƒΠ΅Π± ΡΡŠΡ€Π²ΡŠΡ€ Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»Π½ΠΎ NGINX ΠΈ позволява изолация Π½Π° процСситС Π½Π° прилоТСнията с нСзависими ограничСния Π½Π° рСсурситС.

Как Π΄Π° ΠΈΠ·Π±Π΅Ρ€Π° ΠΌΠ΅ΠΆΠ΄Ρƒ Unix сокСт ΠΈ TCP сокСт Π·Π° PHP-FPM?

Π˜Π·ΠΏΠΎΠ»Π·Π²Π°ΠΉΡ‚Π΅ Unix сокСт (listen = /run/php/app-fpm.sock) ΠΊΠΎΠ³Π°Ρ‚ΠΎ PHP-FPM ΠΈ ΡƒΠ΅Π± ΡΡŠΡ€Π²ΡŠΡ€ΡŠΡ‚ работят Π½Π° Π΅Π΄Π½Π° ΠΈ ΡΡŠΡ‰Π° физичСска ΠΈΠ»ΠΈ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»Π½Π° машина. Unix сокСтитС заобикалят TCP/IP стСка, намалявайки латСнтността ΠΈ Π΅Π»ΠΈΠΌΠΈΠ½ΠΈΡ€Π°ΠΉΠΊΠΈ ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚ΠΈΡ‚Π΅ с ΠΏΠΎΡ€Ρ‚ΠΎΠ²Π΅. Π˜Π·ΠΏΠΎΠ»Π·Π²Π°ΠΉΡ‚Π΅ TCP сокСт (listen = 127.0.0.1:9000) само ΠΊΠΎΠ³Π°Ρ‚ΠΎ PHP-FPM Ρ€Π°Π±ΠΎΡ‚ΠΈ Π½Π° Ρ€Π°Π·Π»ΠΈΡ‡Π΅Π½ хост ΠΎΡ‚ ΡƒΠ΅Π± ΡΡŠΡ€Π²ΡŠΡ€Π°.

Π—Π°Ρ‰ΠΎ ΠΏΠΎΠ»ΡƒΡ‡Π°Π²Π°ΠΌ Π³Ρ€Π΅ΡˆΠΊΠΈ 502 Bad Gateway ΠΏΡ€ΠΈ Π½Π°Ρ‚ΠΎΠ²Π°Ρ€Π²Π°Π½Π΅?

Π“Ρ€Π΅ΡˆΠΊΠ° 502 ΠΎΡ‚ NGINX, сочСща към PHP-FPM, ΠΏΠΎΡ‡Ρ‚ΠΈ Π²ΠΈΠ½Π°Π³ΠΈ ΠΎΠ·Π½Π°Ρ‡Π°Π²Π°, Ρ‡Π΅ ΠΎΠΏΠ°ΡˆΠΊΠ°Ρ‚Π° Π·Π° ΡΠ»ΡƒΡˆΠ°Π½Π΅ Π΅ пълна β€” всички Ρ€Π°Π±ΠΎΡ‚Π½ΠΈ процСси са Π·Π°Π΅Ρ‚ΠΈ ΠΈ Π½ΠΎΠ²ΠΈ Π²Ρ€ΡŠΠ·ΠΊΠΈ сС ΠΎΡ‚ΠΊΠ°Π·Π²Π°Ρ‚. ΠŸΡ€ΠΎΠ²Π΅Ρ€Π΅Ρ‚Π΅ pm.status_path Π·Π° Π½Π΅Π½ΡƒΠ»Π΅Π²Π° стойност Π½Π° listen queue. Π Π΅ΡˆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ Π΅ ΠΈΠ»ΠΈ ΡƒΠ²Π΅Π»ΠΈΡ‡Π°Π²Π°Π½Π΅ Π½Π° pm.max_children (Π°ΠΊΠΎ RAM позволява), ΠΈΠ»ΠΈ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€Π°Π½Π΅ Π½Π° Π±Π°Π²Π½ΠΈΡ‚Π΅ PHP скриптовС, ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΡ†ΠΈΡ€Π°Π½ΠΈ Ρ‡Ρ€Π΅Π· бавния Π»ΠΎΠ³.

Как Π΄Π° прСзарСдя PHP-FPM Π±Π΅Π· ΠΏΡ€Π΅ΠΊΡŠΡΠ²Π°Π½Π΅ Π½Π° Π°ΠΊΡ‚ΠΈΠ²Π½ΠΈΡ‚Π΅ Π²Ρ€ΡŠΠ·ΠΊΠΈ?

Π˜Π·ΠΏΠΎΠ»Π·Π²Π°ΠΉΡ‚Π΅ sudo systemctl reload php8.2-fpm вмСсто restart. Π‘ΠΈΠ³Π½Π°Π»ΡŠΡ‚ reload (SIGUSR2) ΠΊΠ°Ρ€Π° главния процСс Π΄Π° рСстартира Ρ€Π°Π±ΠΎΡ‚Π½ΠΈΡ‚Π΅ процСси ΠΏΠ»Π°Π²Π½ΠΎ: ΡΡŠΡ‰Π΅ΡΡ‚Π²ΡƒΠ²Π°Ρ‰ΠΈΡ‚Π΅ заявки Π·Π°Π²ΡŠΡ€ΡˆΠ²Π°Ρ‚ Π½ΠΎΡ€ΠΌΠ°Π»Π½ΠΎ, Π΄ΠΎΠΊΠ°Ρ‚ΠΎ Π½ΠΎΠ²ΠΈΡ‚Π΅ Ρ€Π°Π±ΠΎΡ‚Π½ΠΈ процСси ΠΏΠΎΠ΅ΠΌΠ°Ρ‚ Π°ΠΊΡ‚ΡƒΠ°Π»ΠΈΠ·ΠΈΡ€Π°Π½Π°Ρ‚Π° конфигурация. Π’Π²ΡŠΡ€Π΄ΠΎΡ‚ΠΎ restart прСкратява Π½Π΅Π·Π°Π±Π°Π²Π½ΠΎ всички Ρ€Π°Π±ΠΎΡ‚Π½ΠΈ процСси, ΠΏΡ€Π΅ΠΊΡŠΡΠ²Π°ΠΉΠΊΠΈ Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΡ‚Π΅ заявки.

МоТС Π»ΠΈ PHP-FPM Π΄Π° Ρ€Π°Π±ΠΎΡ‚ΠΈ с мноТСство PHP вСрсии Π΅Π΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ Π½Π° Π΅Π΄ΠΈΠ½ ΡΡŠΡ€Π²ΡŠΡ€?

Π”Π°. Π˜Π½ΡΡ‚Π°Π»ΠΈΡ€Π°ΠΉΡ‚Π΅ мноТСство PHP вСрсии (Π½Π°ΠΏΡ€. php7.4-fpm ΠΈ php8.2-fpm) ΠΈ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€Π°ΠΉΡ‚Π΅ всСки ΠΏΡƒΠ» Π½Π° ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° подходящия ΠΏΡŠΡ‚ Π½Π° сокСта. Π’ NGINX насочСтС fastcgi_pass към правилния сокСт Π·Π° всСки server Π±Π»ΠΎΠΊ. Π’ΠΎΠ²Π° Π΅ стандартСн ΠΌΠΎΠ΄Π΅Π» Π½Π° сподСлСна инфраструктура, управлявана Ρ‡Ρ€Π΅Π· VPS ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π½ΠΈ ΠΏΠ°Π½Π΅Π»ΠΈ ΠΈ Π΅ напълно ΠΏΠΎΠ΄Π΄ΡŠΡ€ΠΆΠ°Π½ Π½Π° VPS Π₯остинг с root Π΄ΠΎΡΡ‚ΡŠΠΏ.