Развертывание 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-curlPhp 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.