Выбор платформы для PHP приложений: от установки до оптимизации

Раздел: Администрирование сервера -> Хостинг и серверное администрирование PHP

Выбор и настройка среды исполнения PHP

Как создать надежную конфигурацию для PHP-хостинга на связке Nginx и PHP-FPM?

Эта связка считается современным стандартом благодаря высокой производительности и гибкости. Nginx обрабатывает статику и проксирует динамические запросы к PHP-FPM через Unix-сокет или TCP. Рассмотрим пошаговую настройку на Ubuntu Server.

Шаг 1. Установка компонентов:

sudo apt update
sudo apt install nginx php-fpm php-mysql php-xml php-mbstring php-curl -y

Шаг 2. Настройка пула PHP-FPM (файл /etc/php/8.3/fpm/pool.d/www.conf). Установим пользователя и группу, с которыми будет работать FPM:

user = www-data
listen.owner = www-data
listen.group = www-data
listen.mode = 0660
pm.max_children = 10
pm.start_servers = 3
pm.min_spare_servers = 2
pm.max_spare_servers = 5

Шаг 3. Создание конфигурации сайта в Nginx (/etc/nginx/sites-available/example.com):

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

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

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/var/run/php/php8.3-fpm.sock;
    }

    location ~ /\.ht {
        deny all;
    }
}

Шаг 4. Активация сайта и перезапуск сервисов:

sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl restart nginx php8.3-fpm

Типичные ошибки и их решения:

  • 502 Bad Gateway – PHP-FPM не отвечает. Проверить статус systemctl status php8.3-fpm, путь к сокету в конфиге Nginx и права на сокет.
  • 403 Forbidden – отсутствует index.php или неправильные права на корневую директорию. Убедиться, что chown -R www-data:www-data /var/www/example.com.
  • Файлы не загружаются (большие) – добавить в блок http/server Nginx client_max_body_size 50M;.

Цель использования: высокая производительность при большом количестве одновременных запросов, разделение обработки статики и динамики. Подходит для продакшн-среды.

Как организовать быстрый старт хостинга PHP на Apache с mod_php?

Apache с модулем mod_php – классическое решение, простое в установке. Подходит для небольших проектов, где не требуется максимальная производительность.

Установка:

sudo apt install apache2 php libapache2-mod-php php-mysql -y
sudo systemctl restart apache2

Создание VirtualHost:

<VirtualHost *:80>
    ServerName example.com
    DocumentRoot /var/www/example.com
    <Directory /var/www/example.com>
        AllowOverride All
        Require all granted
    </Directory>
</VirtualHost>

Активировать сайт: sudo a2ensite example.com и sudo a2dissite 000-default при необходимости.

Проблемы:

  • .htaccess не работает – проверить наличие AllowOverride All в секции Directory.
  • Низкая производительность – Apache использует много памяти при каждом запросе. Рекомендуется перейти на Nginx+PHP-FPM для высоконагруженных проектов.

Когда применимо: разработка локально, внутренние приложения, сайты с низким трафиком, когда важна простота настройки.

Как использовать Docker для изоляции PHP-приложений?

Контейнеризация позволяет запускать каждое PHP-приложение в изолированном окружении с собственными версиями PHP и расширений.

Пример docker-compose.yml для PHP+Nginx:

version: '3.8'
services:
  php:
    image: php:8.3-fpm
    volumes:
      - ./app:/var/www/html
    environment:
      - MYSQL_HOST=db
  nginx:
    image: nginx:alpine
    ports:
      - "80:80"
    volumes:
      - ./app:/var/www/html
      - ./nginx.conf:/etc/nginx/conf.d/default.conf
    depends_on:
      - php
# nginx.conf
server {
    listen 80;
    root /var/www/html;
    index index.php;
    location ~ \.php$ {
        fastcgi_pass php:9000;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }
}

Возможные ошибки:

  • Файлы не видны – права на томе: внутри контейнера ID может отличаться. Использовать user: www-data или задать GID в Dockerfile.
  • Зависимости не устанавливаются – добавить RUN docker-php-ext-install pdo_mysql в кастомный Dockerfile.

Применение: микросервисная архитектура, тестовые среды, когда требуется быстрое разворачивание и изоляция.

Как автоматизировать создание PHP-сайтов с помощью панели управления хостингом?

Панели управления (ISPmanager, VestaCP, CWP) берут на себя настройку веб-сервера, создание пулов PHP-FPM и управление доменами.

Установка VestaCP (устаревшая, но показательная): curl -O https://vestacp.com/pub/vst-install.sh && sudo bash vst-install.sh. После установки через веб-интерфейс добавляется домен, выбирается версия PHP.

Недостатки:

  • Ограниченная гибкость конфигурации.
  • Возможные уязвимости при несвоевременном обновлении.
  • Не подходит для сложных кастомных настроек.

Целевая аудитория: пользователи, не желающие углубляться в администрирование, с стандартными требованиями.

Расширенные примеры настройки и оптимизации

1. Множественные пулы PHP-FPM с разными пользователями

Создаются отдельные пулы для разных сайтов, каждый со своим Unix-пользователем, что повышает безопасность.

Пример
# /etc/php/8.3/fpm/pool.d/site1.conf
[site1]
user = site1user
group = site1user
listen = /run/php/site1.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
chdir = /home/site1user/www
Пример
# В Nginx для сайта site1:
location ~ \.php$ {
    include snippets/fastcgi-php.conf;
    fastcgi_pass unix:/run/php/site1.sock;
}

Проблема: при неправильных правах на сокет (должен быть доступен для nginx) - проверяется listen.mode.

2. Оптимизация PHP через OPcache и php.ini

Настройки для производственной среды:

Пример
; /etc/php/8.3/fpm/conf.d/10-opcache.ini
zend_extension=opcache.so
opcache.enable=1
opcache.memory_consumption=128
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=10000
opcache.revalidate_freq=2
opcache.validate_timestamps=0  ; отключение проверки изменений (только для стабильного кода)

Также установить memory_limit = 256M, max_execution_time = 30, upload_max_filesize = 20M, post_max_size = 20M.

3. Настройка Nginx для кэширования статики

Пример
location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
    expires 30d;
    add_header Cache-Control "public, no-transform";
}

Для PHP-файлов кэширование не применяется, но можно добавить заголовки для статики, ускоряя загрузку.

4. Использование HTTP/2 для повышения производительности

Пример
server {
    listen 443 ssl http2;
    server_name example.com;
    ssl_certificate /etc/ssl/certs/example.crt;
    ssl_certificate_key /etc/ssl/private/example.key;
    ...
}

Для включения HTTP/2 необходим SSL-сертификат.

5. Docker: multi-stage сборка для установки Composer

Пример
# Dockerfile
FROM composer:2 AS build
COPY . /app
RUN composer install --no-dev --optimize-autoloader

FROM php:8.3-fpm
COPY --from=build /app /var/www/html
RUN docker-php-ext-install pdo_mysql

Результат: финальный образ содержит только PHP и необходимые зависимости, без лишних инструментов.

6. Мониторинг PHP-FPM через status page

Включение статуса в пуле (добавить в www.conf):

Пример
pm.status_path = /status

В Nginx:

Пример
location ~ ^/(status|ping)$ {
    include snippets/fastcgi-php.conf;
    fastcgi_pass unix:/var/run/php/php8.3-fpm.sock;
}

Доступ к http://example.com/status покажет метрики пула. Можно интегрировать с Prometheus для оповещений.

Результат вывода /status:

pool:                 www
process manager:      dynamic
start time:           10/Jan/2025:12:00:00 +0000
start since:          3600
accepted conn:        1000
listen queue:         0
max listen queue:     0
listen queue len:     0
idle processes:       2
active processes:     3
total processes:      5
max active processes: 4
max children reached: 0
slow requests:        0

Эти метрики полезны для определения необходимости масштабирования.

Хостинг PHP - comments

En
Php host (php)