Настройка PHP на Ubuntu: от основ до продвинутых конфигураций
Основные подходы к установке PHP на Ubuntu
Как установить PHP из официального репозитория Ubuntu через APT?
Стандартный способ установки PHP на Ubuntu - использование менеджера пакетов APT. Этот подход подходит, если требуется версия PHP, доступная в текущем дистрибутиве (например, PHP 7.4 на Ubuntu 20.04). Для установки основной версии и популярных модулей выполняется:
sudo apt update
sudo apt install php php-cli php-fpm php-mysql php-xml php-mbstring php-curl php-gd php-zipПосле установки проверяется версия:
php -vЦель использования
Данный вариант рекомендуется для быстрого развертывания PHP на сервере, когда не требуется специфическая версия или нестандартные расширения. Он прост в обслуживании и обновляется через обычные системные обновления.
Проблема: на старых релизах Ubuntu (например, 20.04) доступна только PHP 7.4, а требуется PHP 8.x. Ошибка "E: Package 'php8.2' has no installation candidate" возникает при попытке установить более новую версию из репозитория. Решение: использовать PPA или другой метод.
Как установить PHP 8.2 на Ubuntu 20.04 через PPA?
Для доступа к новым версиям PHP используется репозиторий Ondřej Surý (ppa:ondrej/php).
sudo add-apt-repository ppa:ondrej/php
sudo apt update
sudo apt install php8.2 php8.2-cli php8.2-fpm php8.2-mysql php8.2-xml php8.2-mbstringПосле установки можно переключить версию PHP, используемую по умолчанию, с помощью команды update-alternatives. Это позволяет параллельно держать несколько версий.
sudo update-alternatives --config phpСлучаи использования
Метод подходит, когда необходима свежая версия PHP для современных фреймворков (Laravel, Symfony) или для тестирования совместимости.
Проблема: после добавления PPA возникают конфликты с пакетами из стандартного репозитория. Рекомендуется удалить старые версии PHP перед установкой новой: sudo apt purge php*. Также возможна ошибка установки из-за отсутствия ключа GPG. Ее можно добавить вручную.
Как собрать PHP из исходного кода для получения кастомной конфигурации?
Компиляция из исходников предоставляет полный контроль над опциями сборки. Это полезно, если требуется включить редкие расширения или оптимизировать PHP под аппаратную платформу.
Шаги сборки PHP 8.2.0:
sudo apt install build-essential autoconf libtool libxml2-dev libsqlite3-dev libssl-dev libcurl4-openssl-dev pkg-config
wget https://www.php.net/distributions/php-8.2.0.tar.gz
tar -xzf php-8.2.0.tar.gz
cd php-8.2.0
./configure --prefix=/usr/local/php82 --with-pdo-mysql --with-mysqli --with-openssl --enable-mbstring --enable-fpm --with-curl
make -j$(nproc)
sudo make installПосле установки файлы располагаются в /usr/local/php82/. Для запуска PHP-FPM потребуется скопировать конфигурационные файлы.
Цель использования
Сборка из исходников применяется в окружениях с жесткими требованиями к производительности или безопасности, а также при необходимости интеграции нестандартных расширений (например, собственных модулей).
Проблема: процесс компиляции может занять много времени и требует установки множества зависимостей. Возможны ошибки "configure: error: xml2-config not found" - в таком случае нужно установить libxml2-dev. Также после make install может потребоваться вручную добавить путь в PATH.
Как запустить PHP в изолированном окружении с помощью Docker?
Docker позволяет быстро развернуть PHP без влияния на основную систему. Контейнер можно настроить с любыми расширениями.
Пример запуска PHP-FPM контейнера:
docker run -d --name my-php -p 9000:9000 -v /path/to/your/app:/var/www/html php:8.2-fpmДля использования с Nginx создается docker-compose.yml:
version: '3'
services:
php:
image: php:8.2-fpm
volumes:
- ./app:/var/www/html
nginx:
image: nginx:latest
ports:
- "80:80"
volumes:
- ./app:/var/www/html
- ./nginx.conf:/etc/nginx/conf.d/default.confКогда применяется Docker?
Контейнеризация удобна для разработки и тестирования, а также в микросервисной архитектуре. Позволяет быстро менять версию PHP, не затрагивая хост.
Проблема: если контейнер не запускается из-за портов, следует остановить процесс, занимающий порт 9000 (например, локальный PHP-FPM). Также может потребоваться настройка прав на монтируемые папки.
Как управлять несколькими версиями PHP с помощью phpbrew?
phpbrew - инструмент, позволяющий устанавливать и переключать версии PHP в пользовательском окружении. Это особенно полезно для разработчиков, работающих над несколькими проектами.
curl -L -O https://github.com/phpbrew/phpbrew/releases/latest/download/phpbrew.phar
chmod +x phpbrew.phar
sudo mv phpbrew.phar /usr/local/bin/phpbrew
phpbrew init
source ~/.phpbrew/bashrcУстановка PHP 8.1 с расширениями:
phpbrew install 8.1 +default +mysql +openssl +mbstring +curl +fpm
phpbrew switch 8.1Сценарии использования
phpbrew идеален для локальной разработки, когда нужно быстро тестировать код на разных версиях PHP без конфликтов с системным PHP.
Проблема: при установке могут отсутствовать зависимости. phpbrew сообщит, какие пакеты нужны, их следует установить через apt. Также после переключения версии может не работать PHP-FPM, если не запущен соответствующий сервис.
Расширенные примеры настройки PHP на Ubuntu
Ниже приведены примеры с подробными командами и ожидаемыми результатами.
Настройка PHP-FPM пулов для разных пользователей
sudo cp /etc/php/8.2/fpm/pool.d/www.conf /etc/php/8.2/fpm/pool.d/site1.conf
sudo nano /etc/php/8.2/fpm/pool.d/site1.confИзменить параметры: user, group, listen, listen.owner, listen.group. Пример конфигурации:
[site1]
user = site1user
group = site1user
listen = /run/php/php8.2-fpm-site1.sock
listen.owner = www-data
listen.group = www-data
pm = dynamic
pm.max_children = 50
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 35Перезапуск PHP-FPM и проверка сокета:
sudo systemctl restart php8.2-fpm
ls -la /run/php/php8.2-fpm-site1.socksrw-rw---- 1 www-data www-data 0 Jan 15 12:00 /run/php/php8.2-fpm-site1.sock
Такой подход позволяет разграничить ресурсы между разными сайтами на одном сервере.
Установка расширения Redis через PECL
sudo apt install php8.2-dev
sudo pecl install redis
sudo bash -c "echo 'extension=redis.so' > /etc/php/8.2/mods-available/redis.ini"
sudo phpenmod redis
php -m | grep redisredis
Расширение Redis используется для кеширования и работы с очередями.
Изменение лимитов памяти и размера загружаемых файлов
sudo nano /etc/php/8.2/fpm/php.iniИзменить строки:
memory_limit = 256M
upload_max_filesize = 50M
post_max_size = 50M
max_execution_time = 300Перезапустить PHP-FPM:
sudo systemctl restart php8.2-fpmПроверка через phpinfo():
php -r "echo ini_get('memory_limit');"256M
Эти параметры важны для обработки больших файлов и длительных скриптов.
Настройка OpCache для повышения производительности
sudo nano /etc/php/8.2/fpm/conf.d/10-opcache.iniТипичная конфигурация:
opcache.enable=1
opcache.memory_consumption=128
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=4000
opcache.revalidate_freq=2
opcache.fast_shutdown=1Проверка состояния OpCache:
php -r "print_r(opcache_get_status());"Array ( [opcache_enabled] => 1 [cache_full] => ... )
OpCache ускоряет выполнение PHP за счет кеширования скомпилированных скриптов.
Создание Dockerfile для PHP с пользовательскими расширениями
FROM php:8.2-fpm
RUN docker-php-ext-install pdo_mysql mysqli bcmath gd
RUN pecl install xdebug && docker-php-ext-enable xdebug
COPY . /var/www/html
EXPOSE 9000Сборка образа и запуск:
docker build -t custom-php .
docker run -d -p 9000:9000 --name myphp custom-phpТакой Dockerfile позволяет получить окружение с заранее установленными расширениями.
Использование phpbrew для компиляции с Xdebug и дополнительными флагами
phpbrew install 8.2 +default +xdebug +mysql +fpm -- --with-pdo-mysql --with-openssl
phpbrew switch 8.2
php -vPHP 8.2.0 (cli) (built: ...) with Xdebug v3.2.0 ...
phpbrew упрощает сборку PHP с нестандартными опциями и переключение между версиями.