Настройка PHP на Ubuntu: от основ до продвинутых конфигураций

Раздел: -> Настройка PHP

Основные подходы к установке 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.sock
srw-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 redis
redis

Расширение 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 -v
PHP 8.2.0 (cli) (built: ...) with Xdebug v3.2.0 ...

phpbrew упрощает сборку PHP с нестандартными опциями и переключение между версиями.

PHP на Ubuntu - comments

En
Php ubuntu (php)