Организация работы PHP на сервере под управлением Ubuntu
Выбор подхода для запуска PHP приложений
Какое решение можно считать наиболее эффективным для продакшена?
Связка Nginx + PHP-FPM
Для производственных нагрузок рекомендуется использовать Nginx в качестве веб-сервера и PHP-FPM (FastCGI Process Manager) для обработки PHP. Такая конфигурация обеспечивает высокую производительность, низкое потребление памяти и хорошую изоляцию процессов.
Цели и случаи использования: высоконагруженные сайты, системы с большим количеством одновременных запросов, приложения, требующие быстрого ответа.
sudo apt update
sudo apt install nginx php-fpm php-mysql php-xml php-mbstring php-curlPhp ubuntu server (php сервер на ubuntu)
Пояснение: установка Nginx и PHP-FPM вместе с часто используемыми расширениями. После завершения необходимо настроить конфигурацию Nginx.
sudo nano /etc/nginx/sites-available/default
Внутри заменить содержимое (или добавить) блок location для PHP:
server {
listen 80;
root /var/www/html;
index index.php index.html index.htm;
server_name _;
location / {
try_files $uri $uri/ =404;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.1-fpm.sock;
}
}
Проверка синтаксиса и перезапуск:
sudo nginx -t
sudo systemctl restart nginx
sudo systemctl enable php8.1-fpm
Проблема: ошибка 502 Bad Gateway. Возникает, если путь к сокету PHP-FPM указан неверно или процесс не запущен.
systemctl status php8.1-fpm. Убедиться, что файл сокета существует: ls -la /run/php/. Если сокет отсутствует, перезапустить сервис: sudo systemctl restart php8.1-fpm.Как быстро запустить PHP на Apache с модулем mod_php?
Установка LAMP (Linux, Apache, MySQL, PHP) в классическом исполнении
Подходит для простых сайтов, где не требуется высокая производительность и изоляция процессов. Модуль mod_php встраивается непосредственно в Apache, что упрощает конфигурацию.
sudo apt update
sudo apt install apache2 php libapache2-mod-php php-mysql
Проверка работы: создать файл info.php в /var/www/html/:
echo '<?php phpinfo(); ?>' | sudo tee /var/www/html/info.php
Открыть в браузере http://ваш-сервер/info.php.
Проблема: модуль не загружается после установки. Проверить включение: sudo a2enmod php8.1 (версия может отличаться). Перезапуск Apache: sudo systemctl restart apache2.
sudo a2enmod mpm_prefork (mod_php не работает с mpm_event).Как заставить Apache работать с PHP-FPM для лучшей производительности?
Apache с прокси на PHP-FPM
Сочетает привычный интерфейс Apache с современным менеджером процессов PHP. Используется, когда необходимо сохранить .htaccess, но повысить производительность.
sudo apt install apache2 php-fpm libapache2-mod-proxy-html
sudo a2enmod proxy_fcgi setenvif
sudo a2enconf php8.1-fpm
Настройка виртуального хоста:
<VirtualHost *:80>
ServerName example.com
DocumentRoot /var/www/html
<FilesMatch \.php$>
SetHandler "proxy:unix:/run/php/php8.1-fpm.sock|fcgi://localhost"
</FilesMatch>
</VirtualHost>
Перезапуск Apache: sudo systemctl restart apache2.
Проблема: 503 Service Unavailable. Проверить, что PHP-FPM запущен и сокет доступен.
sudo chmod 666 /run/php/php8.1-fpm.sock (не рекомендуется для безопасности, лучше настроить пользователя www-data).Как использовать PHP только для командной строки (CLI)?
Установка PHP CLI без веб-сервера
Подходит для фоновых задач, скриптов обработки данных, тестирования. Не требует настройки веб-окружения.
sudo apt install php-cli php-xml php-mbstring php-curl php-zip
Проверка версии: php -v. Запуск скрипта:
echo '<?php echo "Hello from CLI\n";' > test.php
php test.php
Проблема: отсутствие расширений, например, mbstring. Установить их: sudo apt install php-mbstring.
Как развернуть изолированный PHP сервер через Docker?
Контейнеризация с официальным образом PHP-FPM
Идеально для консистентности окружения, микросервисной архитектуры, быстрой смены версий PHP.
docker pull php:8.1-fpm
mkdir ~/myapp
cd ~/myapp
cat <<EOF > Dockerfile
FROM php:8.1-fpm
COPY . /var/www/html
EOF
docker build -t my-php-app .
docker run -d -p 9000:9000 --name php-server my-php-app
Для работы с Nginx обычно используется docker-compose:
version: '3'
services:
php:
image: php:8.1-fpm
volumes:
- ./html:/var/www/html
nginx:
image: nginx:alpine
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
- ./html:/usr/share/nginx/html
ports:
- 80:80
Проблема: контейнер PHP-FPM не может соединиться с базой данных, если она запущена на хосте. Необходимо использовать сеть Docker или host.docker.internal.
--add-host host.docker.internal:host-gateway или использовать переменную окружения для адреса БД.Расширенные сценарии и примеры
Настройка пула PHP-FPM для оптимизации под нагрузку
Конфигурация пула находится в /etc/php/8.1/fpm/pool.d/www.conf. Изменение параметров позволяет контролировать количество процессов и использование памяти.
pm = dynamic
pm.max_children = 50
pm.start_servers = 10
pm.min_spare_servers = 5
pm.max_spare_servers = 20
pm.process_idle_timeout = 30s
Результат указанных настроек:
- Допускается до 50 одновременных PHP-процессов. - В простое поддерживается от 5 до 20 процессов. - Если процесс бездействует более 30 секунд, он завершается.
Использование разных версий PHP одновременно (например, 7.4 и 8.1)
Установка из PPA (Ondřej Surý) позволяет сосуществовать нескольким версиям.
sudo add-apt-repository ppa:ondrej/php
sudo apt update
sudo apt install php7.4-fpm php7.4-mysql php7.4-xml
sudo apt install php8.1-fpm php8.1-mysql php8.1-xml
Каждая версия слушает свой сокет: /run/php/php7.4-fpm.sock и /run/php/php8.1-fpm.sock. В конфигурации Nginx можно указать нужный сокет для каждого location.
location ~ \.php$ {
fastcgi_pass unix:/run/php/php7.4-fpm.sock;
include snippets/fastcgi-php.conf;
}
или для другого каталога:
location /legacy/ {
fastcgi_pass unix:/run/php/php8.1-fpm.sock;
}
Кеширование PHP-ответов с помощью Nginx FastCGI Cache
Уменьшает нагрузку на PHP-FPM, кешируя ответы на определенное время.
fastcgi_cache_path /var/cache/nginx levels=1:2 keys_zone=PHP_CACHE:10m;
fastcgi_cache_key "$scheme$request_method$host$request_uri";
location ~ \.php$ {
fastcgi_cache PHP_CACHE;
fastcgi_cache_valid 200 60m;
# добавить условие для пропуска кеша
fastcgi_no_cache $cookie_nocache $arg_nocache;
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.1-fpm.sock;
}
Результат:
- Ответы с кодом 200 кешируются на 60 минут. - Кеш хранится в /var/cache/nginx, размер до 10 МБ. - При GET-параметре nocache или cookie nocache кеш пропускается.
Компиляция PHP из исходного кода для нестандартных опций
Полезно, когда требуется включить редкое расширение или настроить путь установки.
cd /tmp
wget https://www.php.net/distributions/php-8.2.12.tar.gz
tar -xzf php-8.2.12.tar.gz
cd php-8.2.12
./configure --prefix=/usr/local/php8.2 --enable-mbstring --enable-intl --with-openssl --with-pdo-mysql
make -j4
sudo make install
Проверка:
/usr/local/php8.2/bin/php -v
Результат:
PHP 8.2.12 (cli) (built: ...)
Запуск PHP-скрипта с ограничением времени выполнения и памяти
Через CLI можно передать параметры:
php -d max_execution_time=30 -d memory_limit=256M huge_script.php
Пример вывода:
(скрипт выполнится, не превышая лимиты; при ошибке времени появится сообщение "Fatal error: Maximum execution time of 30 seconds exceeded")