Установка PHP интерпретатора и веб сервера на операционной системе Ubuntu

Раздел: Администрирование -> Установка на Linux

Развертывание PHP окружения на Ubuntu

В этом разделе рассматриваются способы установки и настройки сервера для обработки PHP скриптов на операционной системе Ubuntu. Каждый вариант сопровождается описанием цели, случаями использования, пошаговыми инструкциями и типичными проблемами.

Как настроить высокопроизводительный веб-сервер с PHP на Ubuntu для production окружения?

Наиболее эффективным решением является связка Nginx + PHP-FPM. Этот подход обеспечивает отличную производительность, низкое потребление памяти и гибкость в настройке.

  1. Обновление списка пакетов и установка Nginx и PHP-FPM:
    sudo apt update
    sudo apt install nginx php-fpm php-mysql php-xml php-mbstring php-curl php-zip

    Ubuntu php сервер (установка php сервера на ubuntu)

  2. Запуск и включение служб:
    sudo systemctl start nginx php8.1-fpm
    sudo systemctl enable nginx php8.1-fpm
  3. Создание виртуального хоста 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;
        }
    }
  4. Включение сайта и проверка конфигурации:
    sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/
    sudo nginx -t
    sudo systemctl reload nginx
  5. Создание тестового 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 (встраиваемым интерпретатором).

  1. Установка Apache и PHP с модулем:
    sudo apt install apache2 php libapache2-mod-php php-mysql
  2. Включение модуля (обычно активируется автоматически):
    sudo a2enmod php8.1
    sudo systemctl restart apache2
  3. Проверка: поместить файл /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) используется для локальной разработки, без установки полноценного веб-сервера.

  1. Запуск сервера в корне проекта:
    php -S localhost:8000
    Сервер будет слушать порт 8000 и обслуживать файлы из текущей директории.
  2. Указание роутинга (для фреймворков):
    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
...

Установка PHP сервера на Ubuntu - comments

En
Ubuntu php сервер (php)