Развертывание PHP окружения в Linux: от простого к продвинутому

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

Настройка сервера PHP в Linux: обзор подходов

Основное эффективное решение: Nginx + PHP-FPM

Этот тандем обеспечивает высокую производительность, низкое потребление памяти и гибкость. PHP-FPM (FastCGI Process Manager) обрабатывает запросы PHP, а Nginx выступает в роли обратного прокси.

Установка и настройка Nginx + PHP-FPM (Ubuntu/Debian)

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

Php server linux (настройка php сервера в linux)

Пояснение:

  • nginx – веб-сервер.
  • php-fpm – менеджер процессов PHP.
  • php-mysql и др. – необходимые расширения.

Настройка виртуального хоста Nginx для обработки PHP:

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

Содержимое конфигурации:

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

    location / {
        try_files $uri $uri/ =404;
    }

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

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

Пояснение шагов:

  • server_name – доменное имя.
  • root – корневая директория с файлами сайта.
  • location ~ \.php$ – блок для передачи PHP запросов в PHP-FPM через Unix сокет.
  • Сокет /var/run/php/php8.1-fpm.sock может отличаться в зависимости от версии PHP.

Активация сайта и перезапуск Nginx:

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

Типичные проблемы и их решение:

Ошибка 502 Bad Gateway

Причина: PHP-FPM не запущен или используется неверный сокет. Проверка:

sudo systemctl status php8.1-fpm

Если сокет не существует – проверить путь в конфигурации /etc/php/8.1/fpm/pool.d/www.conf.

Файлы PHP скачиваются, а не выполняются

Причина: отсутствует блок location ~ \.php$ или не подключен fastcgi_pass. Убедиться, что конфигурация содержит правильный location.

Как использовать Apache с модулем PHP для простых приложений?

Ответ: Установка Apache и mod_php. Подходит для небольших проектов, где не требуется тонкая настройка производительности.

Установка:

sudo apt install apache2 php libapache2-mod-php php-mysql

Конфигурация по умолчанию уже включает обработку PHP. Проверить:

sudo a2enmod php8.1
sudo systemctl restart apache2

Создать файл info.php в /var/www/html:

<?php phpinfo(); ?>

Проблемы:

Конфликт модулей

При включении нескольких версий PHP через mod_php может возникнуть конфликт. Рекомендуется отключить старые модули.

sudo a2dismod php7.4
sudo systemctl restart apache2

Как запустить встроенный PHP сервер для разработки?

Ответ: Встроенный сервер PHP подходит для локальной разработки и тестирования без установки полноценного веб-сервера.

Запуск из директории проекта:

cd /path/to/project
php -S localhost:8000

Маршрутизация через скрипт:

php -S localhost:8000 router.php

Проблемы:

Не поддерживает параллельные запросы

Встроенный сервер обрабатывает запросы последовательно. Для нагрузочного тестирования не подходит.

Отсутствие HTTPS

Для HTTPS потребуется настроить обратный прокси, например, Nginx.

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

Ответ: Docker позволяет быстро получить изолированное окружение с PHP, веб-сервером и зависимостями.

Пример Dockerfile:

FROM php:8.1-fpm
RUN docker-php-ext-install pdo_mysql mysqli
WORKDIR /var/www/html

docker-compose.yml с Nginx:

version: '3'
services:
  web:
    image: nginx:latest
    ports:
      - "80:80"
    volumes:
      - ./app:/var/www/html
      - ./nginx.conf:/etc/nginx/conf.d/default.conf
    depends_on:
      - php
  php:
    build: .
    volumes:
      - ./app:/var/www/html

Проблемы:

Права доступа к папке

Контейнеры работают под разными пользователями. Рекомендуется задать user ID:

RUN useradd -m -u 1000 user && chown -R user:user /var/www/html

Расширенные примеры конфигурации PHP сервера

Настройка пула PHP-FPM для разных пользователей

Создание отдельного пула для каждого сайта повышает изоляцию. Отредактировать /etc/php/8.1/fpm/pool.d/www.conf или создать новый файл site2.conf:

Пример
[site2]
user = site2user
group = site2user
listen = /run/php/php8.1-fpm-site2.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 = /

Затем в Nginx указать соответствующий сокет:

Пример
fastcgi_pass unix:/run/php/php8.1-fpm-site2.sock;

Результат выполнения команды ps aux | grep php:

site2user  1234  0.0  0.5  ... 0:00 php-fpm: pool site2
www-data   5678  0.0  0.4  ... 0:00 php-fpm: pool www

Настройка OPcache для ускорения выполнения PHP

OPcache кэширует скомпилированные скрипты. Конфигурация в /etc/php/8.1/cli/conf.d/10-opcache.ini или /etc/php/8.1/fpm/conf.d/:

Пример
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

Примечание: validate_timestamps=0 отключает проверку изменений файлов – полезно для продакшена, но требует ручной очистки кэша после обновления.

Проверить статус OPcache через phpinfo() или скрипт:

Пример
<?php
var_dump(opcache_get_status());
?>
array(4) {
  ["opcache_enabled"]=>
  bool(true)
  ...
}

Конфигурация Nginx для обработки PHP с кэшированием FastCGI

FastCGI cache снижает нагрузку на PHP-FPM, кэшируя ответы. Добавить в блок server или http:

Пример
fastcgi_cache_path /tmp/nginx_cache levels=1:2 keys_zone=PHP_CACHE:10m inactive=60m;
fastcgi_cache_key "$scheme$request_method$host$request_uri";

server {
    ...
    location ~ \.php$ {
        fastcgi_cache PHP_CACHE;
        fastcgi_cache_valid 200 301 302 5m;
        fastcgi_cache_use_stale error timeout updating;
        fastcgi_pass unix:/var/run/php/php8.1-fpm.sock;
        include fastcgi_params;
    }
}

Очистка кэша:

Пример
sudo rm -rf /tmp/nginx_cache/*

Использование нескольких версий PHP с помощью PHP-FPM и смены сокета

Установить PHP 7.4 и PHP 8.1 параллельно. Создать пулы на разных сокетах. Пример конфигурации второго пула:

Пример
sudo apt install php7.4-fpm

В Nginx указать для разных location разные версии:

Пример
location ~ \.php$ {
    # для PHP 8.1 (основной сайт)
    fastcgi_pass unix:/var/run/php/php8.1-fpm.sock;
}
location /legacy {
    alias /var/www/legacy;
    location ~ \.php$ {
        fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
    }
}

Результат: сайты на одной машине могут использовать разные версии PHP.

Настройка PHP сервера в Linux - comments

En
Php server linux (php)