Установка PHP интерпретатора и веб сервера на операционной системе Ubuntu
Развертывание PHP окружения на Ubuntu
В этом разделе рассматриваются способы установки и настройки сервера для обработки PHP скриптов на операционной системе Ubuntu. Каждый вариант сопровождается описанием цели, случаями использования, пошаговыми инструкциями и типичными проблемами.
Как настроить высокопроизводительный веб-сервер с PHP на Ubuntu для production окружения?
Наиболее эффективным решением является связка Nginx + PHP-FPM. Этот подход обеспечивает отличную производительность, низкое потребление памяти и гибкость в настройке.
- Обновление списка пакетов и установка Nginx и PHP-FPM:
sudo apt update sudo apt install nginx php-fpm php-mysql php-xml php-mbstring php-curl php-zipUbuntu php сервер (установка php сервера на ubuntu)
- Запуск и включение служб:
sudo systemctl start nginx php8.1-fpm sudo systemctl enable nginx php8.1-fpm - Создание виртуального хоста Nginx для PHP проекта. Пример конфигурации (/etc/nginx/sites-available/example.com):
server { listen 80; server_name example.com; root /var/www/example.com; index index.php index.html; location / { try_files $uri $uri/ /index.php?$args; } location ~ \.php$ { include snippets/fastcgi-php.conf; fastcgi_pass unix:/var/run/php/php8.1-fpm.sock; } location ~ /\.ht { deny all; } } - Включение сайта и проверка конфигурации:
sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/ sudo nginx -t sudo systemctl reload nginx - Создание тестового PHP файла:
echo "<?php phpinfo(); ?>" | sudo tee /var/www/example.com/index.php
Типичные ошибки и их решения
- 502 Bad Gateway – обычно проблема с PHP-FPM. Проверить работу сокета:
sudo systemctl status php8.1-fpm. Убедиться, что путь к сокету совпадает в конфигурации nginx. - Файлы PHP отображаются как текст – не подключён модуль fastcgi или неправильный блок location ~ \.php$.
- Ошибка 'Primary script unknown' – неправильный параметр root или fastcgi_param SCRIPT_FILENAME.
Данный вариант подходит для любых современных PHP проектов: от WordPress до Laravel. При необходимости можно легко масштабировать, добавляя несколько пулов PHP-FPM или балансировщик нагрузки.
Как установить PHP на сервер Apache с использованием модуля mod_php для простых проектов?
Для быстрой настройки или работы с legacy приложениями можно использовать Apache с модулем mod_php (встраиваемым интерпретатором).
- Установка Apache и PHP с модулем:
sudo apt install apache2 php libapache2-mod-php php-mysql - Включение модуля (обычно активируется автоматически):
sudo a2enmod php8.1 sudo systemctl restart apache2 - Проверка: поместить файл /var/www/html/info.php с
<?php phpinfo();и открыть в браузере.
Возможные проблемы
- При использовании Apache с mpm_event модуль mod_php несовместим. Необходимо переключиться на mpm_prefork:
sudo a2dismod mpm_event && sudo a2enmod mpm_prefork && sudo systemctl restart apache2. - Конфликт версий – при установке нескольких версий PHP модуль подключается только к одной.
Вариант подходит для небольших сайтов, где производительность не критична, а удобство конфигурации (например, .htaccess) важнее.
Как запустить встроенный PHP сервер для разработки или быстрого тестирования?
Встроенный сервер PHP (php -S) используется для локальной разработки, без установки полноценного веб-сервера.
- Запуск сервера в корне проекта:
Сервер будет слушать порт 8000 и обслуживать файлы из текущей директории.php -S localhost:8000 - Указание роутинга (для фреймворков):
php -S localhost:8000 router.php
Ограничения и ошибки
- Сервер однопоточный и не подходит для production.
- Не обрабатывает статические файлы оптимально; при большом количестве запросов производительность падает.
- Ошибка 'Address already in use' при повторном запуске – нужно освободить порт или указать другой.
Рекомендуется для быстрой отладки, учебных проектов или демонстрации.
Какие современные альтернативы существуют для контейнеризации PHP приложений?
Для унификации окружения и упрощения развёртывания часто применяют Docker. Контейнер с Nginx + PHP-FPM позволяет изолировать приложение.
docker run -d -p 80:80 --name php-server nginx:alpine
Другой альтернативой является веб-сервер Caddy с автоматическим HTTPS и простой конфигурацией, а также OpenLiteSpeed с поддержкой PHP из коробки.
Расширенные примеры настройки и нестандартные сценарии
Настройка PHP-FPM пула для конкретного приложения с отдельным пользователем
Для изоляции проектов создаётся отдельный пул PHP-FPM с собственным сокетом и пользователем.
sudo nano /etc/php/8.1/fpm/pool.d/myapp.conf
Содержимое пула:
[myapp]
user = myappuser
group = myappuser
listen = /run/php/php8.1-fpm-myapp.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
После создания пула перезапустить PHP-FPM и указать в конфигурации nginx путь к новому сокету.
sudo systemctl restart php8.1-fpm
Использование нескольких версий PHP на одном сервере
Установка второй версии PHP (например, 7.4) рядом с 8.1:
sudo apt install php7.4-fpm php7.4-mysql
Настройка виртуального хоста на использование определённой версии:
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
}
Оптимизация PHP через OPcache
Включение OPcache в php.ini:
opcache.enable=1
opcache.memory_consumption=128
opcache.max_accelerated_files=4000
opcache.revalidate_freq=2
Проверка статуса через phpinfo().
Конфигурация Nginx для Laravel с обработкой символических ссылок и оптимизацией кеша
server {
listen 80;
server_name laravel.app;
root /var/www/laravel/public;
index index.php;
add_header X-Frame-Options "SAMEORIGIN";
add_header X-Content-Type-Options "nosniff";
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
fastcgi_pass unix:/var/run/php/php8.1-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
location ~ /\.(?!well-known).* {
deny all;
}
location ~* \.(jpg|jpeg|gif|png|css|js|ico|webp)$ {
expires 30d;
add_header Cache-Control "public, immutable";
}
}
После перезагрузки Nginx проверить ответы заголовков.
HTTP/1.1 200 OK Cache-Control: public, immutable X-Frame-Options: SAMEORIGIN ...