15%

Збережіть 15% на всі хостинг-послуги

Перевірте свої навички і отримайте Знижку на будь-який план хостингу

Використовуй код:

Skills
Почати
01.11.2024
1 +1

PHP режими на VPS: mod_php vs FastCGI vs PHP-FPM — Повний посібник

PHP працює на понад 80% усіх веб-сайтів в Інтернеті, однак одне з найбільш недооцінених рішень щодо продуктивності — це вибір правильного режиму виконання PHP. Вибір неправильного режиму призведе до повільного завантаження, надмірного споживання RAM та збоїв сервера під час всплесків трафіку. Вибір правильного режиму дозволить вашій програмі масштабуватися без зусиль, навіть під час інтенсивного одночасного навантаження.

Цей посібник розбирає всі три основні режими виконання PHP — mod_php, FastCGI та PHP-FPM — з контекстом реальної продуктивності, прикладами конфігурації та чіткими рекомендаціями для різних випадків використання. Незалежно від того, чи ви запускаєте особистий блог чи високонавантажену платформу електронної комерції, розуміння цих режимів є фундаментальним для максимального використання вашого серверного середовища.

Зміст

  1. Що таке режими виконання PHP?
  2. mod_php — класичний модуль Apache
  3. FastCGI — відокремлення PHP від веб-сервера
  4. PHP-FPM — сучасний стандарт для високої продуктивності
  5. Порівняння поруч
  6. Як налаштувати PHP-FPM на VPS (Ubuntu/Debian)
  7. PHP-FPM з Nginx
  8. PHP-FPM з Apache
  9. Налаштування пулу PHP-FPM для виробництва
  10. Який режим PHP вам вибрати?
  11. Висновок

Що таке режими виконання PHP? {#what-are-php-execution-modes}

Режим виконання PHP визначає, як ваш веб-сервер інтерпретує та запускає скрипти PHP. Він визначає взаємозв’язок між процесом веб-сервера (Apache, Nginx, LiteSpeed) та інтерпретатором PHP — конкретно, чи вони спільно використовують один процес, спілкуються через протокол чи працюють як повністю окремі керовані сервіси.

Три основні режими:

РежимАрхітектураНайкраще для
mod_phpPHP вбудований в ApacheПростих спільних середовищ
FastCGIPHP як окремий процесСайтів з середнім трафіком
PHP-FPMКеровані пули процесів PHPВисоконавантажених виробничих програм

Вибір правильного режиму безпосередньо впливає на використання пам’яті, пропускну спроможність запитів, ізоляцію та масштабованість. У середовищі VPS Hosting, де ресурси виділені та настроюються, у вас є повна свобода впровадження будь-якого режиму, який найкраще відповідає вашому навантаженню.

mod_php — класичний модуль Apache {#mod_php}

Що таке mod_php?

mod_php — це модуль Apache, який вбудовує інтерпретатор PHP безпосередньо в процес веб-сервера Apache. Це найстаріший та історично найпоширеніший метод запуску PHP.

Як працює mod_php

Коли Apache отримує запит на файл .php, він обробляє виконання внутрішньо — жоден зовнішній процес не запускається, жодна комунікація через сокет не відбувається. PHP живе всередині самого Apache.

Browser Request → Apache (with embedded PHP) → Response

Характеристики продуктивності

Для веб-сайтів з низьким трафіком та середовищ розробки mod_php працює адекватно. Оскільки PHP вже завантажений у пам’ять Apache, немає накладних витрат на запуск процесу за запит.

Однак ця архітектура має критичний недолік: кожен робочий процес Apache містить повний інтерпретатор PHP у пам’яті, незалежно від того, чи він обслуговує файл PHP чи статичний ресурс, як зображення або файл CSS.

Недоліки mod_php

  • Високе споживання пам’яті: кожен робочий процес Apache (навіть ті, що обслуговують статичні файли) містить повний час виконання PHP у RAM.
  • Відсутність ізоляції для кожного сайту: усі віртуальні хости спільно використовують один процес PHP та контекст користувача, що є проблемою безпеки на багатотенантних серверах.
  • Обмежена гнучкість конфігурації: ви не можете запускати різні версії PHP для різних віртуальних хостів без значних обхідних шляхів.
  • Несумісність з Nginx: mod_php є виключною для Apache; вона не може використовуватися з Nginx або LiteSpeed.
  • Погана масштабованість під навантаженням: під час високої одночасності вичерпання пам’яті стає реальним ризиком.

Коли використовувати mod_php

  • Локальні середовища розробки
  • Дуже низькотрафічні особисті сайти
  • Застарілі програми, де переконфігурація неможлива

FastCGI — відокремлення PHP від веб-сервера {#fastcgi}

Що таке FastCGI?

FastCGI — це протокол, який дозволяє веб-серверу спілкуватися з зовнішнім процесом PHP, а не вбудовувати PHP в себе. Це значне архітектурне поліпшення порівняно з mod_php.

Як працює FastCGI

Веб-сервер (Apache або Nginx) передає запити PHP постійному процесу FastCGI через Unix сокет або TCP порт. Процес PHP обробляє виконання та повертає результат.

Browser Request → Web Server → FastCGI Socket → PHP Process → Response

Ключове слово тут — постійний: на відміну від CGI (оригінального протоколу), процеси FastCGI залишаються активними між запитами, усуваючи накладні витрати на запуск нового процесу для кожного окремого запиту.

Характеристики продуктивності

FastCGI значно зменшує накладні витрати на пам’ять порівняно з mod_php, оскільки запити статичних файлів обробляються повністю веб-сервером без залучення PHP. Процеси PHP викликаються лише коли це дійсно необхідно.

Недоліки FastCGI

  • Складність конфігурації: вимагає додаткового налаштування порівняно з mod_php, включаючи конфігурацію сокета або порту.
  • Обмежене управління процесами: базовий FastCGI не має розширених функцій управління пулом, необхідних для виробничих середовищ.
  • Замінений PHP-FPM: у більшості сучасних розгортань PHP-FPM (який побудований на FastCGI) є кращим вибором, ніж базові реалізації FastCGI.

Коли використовувати FastCGI

  • Веб-сайти з середнім трафіком
  • Середовища, де PHP-FPM недоступний
  • Перехідні налаштування, які мігрують від mod_php

PHP-FPM — сучасний стандарт для високої продуктивності {#php-fpm}

Що таке PHP-FPM?

PHP-FPM (FastCGI Process Manager) — це розширена, багатофункціональна реалізація протоколу FastCGI. Це фактичний стандарт для запуску PHP у виробничих середовищах та рекомендований режим для будь-якої серйозної веб-програми.

Як працює PHP-FPM

PHP-FPM керує пулом робочих процесів PHP. Веб-сервер передає запити PHP до PHP-FPM через Unix сокет або TCP з’єднання. PHP-FPM динамічно керує кількістю активних робочих процесів на основі поточного трафіку, запускаючи нових робочих під час навантаження та звільняючи їх під час спокійних періодів.

Browser Request → Nginx/Apache → Unix Socket → PHP-FPM Pool → PHP Worker → Response

Ключові переваги PHP-FPM

#### 1. Динамічне управління процесами

PHP-FPM підтримує кілька стратегій управління процесами:

  • static: фіксована кількість робочих процесів (передбачувано, добре для високого трафіку)
  • dynamic: робочі масштабуються між мінімумом та максимумом на основі попиту
  • ondemand: робочі запускаються лише коли надходять запити (ефективно за пам’яттю для низькотрафічних сайтів)

#### 2. Конфігурація для кожного пулу

Кожна програма або віртуальний хост може мати власний пул PHP-FPM з незалежними налаштуваннями:

  • Окремий користувач/група Unix (поліпшена ізоляція безпеки)
  • Різна версія PHP для кожного пулу
  • Користувацькі значення php.ini для кожної програми
  • Окремі обмеження ресурсів

#### 3. Логування повільних запитів

PHP-FPM може логувати запити, які перевищують визначений поріг часу виконання, що є неоціненним для виявлення вузьких місць продуктивності.

#### 4. Ефективність ресурсів

Оскільки процеси PHP керуються окремо від веб-сервера, статичні ресурси обслуговуються без будь-яких накладних витрат PHP. Пам’ять споживається лише активними робочими PHP.

#### 5. Сумісність

PHP-FPM безперебійно працює з Nginx, Apache (через mod_proxy_fcgi) та LiteSpeed. При поєднанні з Nginx або LiteSpeed приріст продуктивності є значним — часто цитується як 5–10 разів швидше під час одночасного навантаження порівняно з mod_php з Apache.

Порівняння поруч {#comparison}

Функціяmod_phpFastCGIPHP-FPM
АрхітектураВбудована в ApacheЗовнішній процесКерований пул процесів
Ефективність пам’ятіНизькаСередняВисока
Накладні витрати статичних файлівВисокіНизькіНизькі
Обробка одночасних запитівПоганаДобраВідмінна
Версія PHP для кожного сайтуНіОбмеженоТак
Ізоляція безпекиПоганаСередняВідмінна
Сумісність з NginxНіТакТак
Складність конфігураціїНизькаСередняСередня
Готовність до виробництваНіЧастковоТак
Логування повільних запитівНіНіТак

Як налаштувати PHP-FPM на VPS (Ubuntu/Debian) {#setup}

Наступні інструкції застосовуються до Ubuntu 22.04 LTS та Debian 11/12. Якщо ви запускаєте свою програму на плані VPS Hosting, у вас буде повний доступ root для виконання цих команд.

Крок 1: оновіть вашу систему та встановіть PHP-FPM

sudo apt update && sudo apt upgrade -y
sudo apt install php-fpm -y

Для встановлення конкретної версії PHP (наприклад, PHP 8.2):

sudo apt install software-properties-common -y
sudo add-apt-repository ppa:ondrej/php -y
sudo apt update
sudo apt install php8.2-fpm -y

Крок 2: переконайтеся, що PHP-FPM запущений

sudo systemctl status php8.2-fpm

Ви повинні побачити active (running) у виводі. Якщо ні, запустіть та увімкніть його:

sudo systemctl start php8.2-fpm
sudo systemctl enable php8.2-fpm

Крок 3: підтвердіть шлях до сокета

PHP-FPM спілкується через Unix сокет. Перевірте його розташування:

ls /var/run/php/
# Expected output: php8.2-fpm.sock

PHP-FPM з Nginx {#nginx}

Nginx — це найпоширеніший веб-сервер, поєднаний з PHP-FPM, і з поважної причини — архітектура Nginx на основі подій без блокування ідеально доповнює модель пулу процесів PHP-FPM.

Встановіть Nginx

sudo apt install nginx -y

Налаштуйте блок сервера Nginx

Відредагуйте файл конфігурації вашого сайту:

sudo nano /etc/nginx/sites-available/yourdomain.com

Додайте наступну конфігурацію:

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

    # Handle PHP files
    location ~ .php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/var/run/php/php8.2-fpm.sock;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }

    # Deny access to .htaccess files
    location ~ /.ht {
        deny all;
    }

    # Serve static files directly
    location ~* .(jpg|jpeg|png|gif|ico|css|js|woff2)$ {
        expires 30d;
        add_header Cache-Control "public, no-transform";
    }
}

Увімкніть сайт та перезавантажте Nginx

sudo ln -s /etc/nginx/sites-available/yourdomain.com /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl restart nginx

PHP-FPM з Apache {#apache}

Якщо ви віддаєте перевагу Apache — або якщо ваша програма залежить від файлів .htaccess — ви все ще можете використовувати PHP-FPM через модуль mod_proxy_fcgi Apache.

Увімкніть необхідні модулі Apache

sudo a2enmod proxy_fcgi setenvif
sudo a2enconf php8.2-fpm

Налаштуйте віртуальний хост Apache

sudo nano /etc/apache2/sites-available/yourdomain.com.conf
<VirtualHost *:80>
    ServerName yourdomain.com
    ServerAlias www.yourdomain.com
    DocumentRoot /var/www/yourdomain.com/public

    <Directory /var/www/yourdomain.com/public>
        AllowOverride All
        Require all granted
    </Directory>

    # Route PHP requests to PHP-FPM
    <FilesMatch .php$>
        SetHandler "proxy:unix:/var/run/php/php8.2-fpm.sock|fcgi://localhost/"
    </FilesMatch>

    ErrorLog ${APACHE_LOG_DIR}/yourdomain_error.log
    CustomLog ${APACHE_LOG_DIR}/yourdomain_access.log combined
</VirtualHost>

Увімкніть сайт та перезавантажте Apache

sudo a2ensite yourdomain.com.conf
sudo apache2ctl configtest
sudo systemctl restart apache2

Налаштування пулу PHP-FPM для виробництва {#tuning}

Конфігурація пулу PHP-FPM за замовчуванням є консервативною та придатною для розробки. Для виробничих навантажень вам слід налаштувати параметри пулу на основі доступного RAM вашого сервера та очікуваного трафіку.

Знайдіть файл конфігурації пулу

sudo nano /etc/php/8.2/fpm/pool.d/www.conf

Ключові параметри для налаштування

; Process management mode: static, dynamic, or ondemand
pm = dynamic

; Maximum number of child processes
pm.max_children = 50

; Number of processes started on boot
pm.start_servers = 10

; Minimum idle processes
pm.min_spare_servers = 5

; Maximum idle processes
pm.max_spare_servers = 20

; Requests per child before recycling (prevents memory leaks)
pm.max_requests = 500

; Log slow requests (requests taking longer than 5 seconds)
request_slowlog_timeout = 5s
slowlog = /var/log/php-fpm/slow.log

Розрахунок pm.max_children

Практична формула для динамічних середовищ:

pm.max_children = (Available RAM in MB) / (Average PHP process size in MB)

Щоб знайти середній розмір процесу PHP:

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

На типовому сайті WordPress кожен робочий PHP-FPM споживає приблизно 30–60 МБ. На VPS з 2 ГБ RAM (залишаючи ~1,5 ГБ для PHP після накладних витрат ОС), ви можете безпечно запускати 25–50 робочих.

Застосуйте зміни

sudo systemctl reload php8.2-fpm

Який режим PHP вам вибрати? {#which-to-choose}

Ось практичний посібник для прийняття рішення:

Виберіть mod_php, якщо:

    15%

    Збережіть 15% на всі хостинг-послуги

    Перевірте свої навички і отримайте Знижку на будь-який план хостингу

    Використовуй код:

    Skills
    Почати