Организация работы PHP окружения: способы установки и конфигурации

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

Установка PHP сервера подразумевает настройку окружения для обработки PHP скриптов. В зависимости от целей разработки или эксплуатации применяются разные подходы. Далее рассмотрены основные варианты с примерами команд и кода.

Эффективное решение: PHP-FPM и Nginx

Как обеспечить высокую производительность PHP приложений в продакшене?

Наиболее распространённый промышленный вариант - связка веб-сервера Nginx и менеджера процессов PHP-FPM. Это позволяет добиться высокой производительности и гибкости настройки.

Установка на Ubuntu/Debian:

sudo apt update
sudo apt install nginx php-fpm

После установки необходимо настроить конфигурацию сайта. Пример базового файла /etc/nginx/sites-available/default:

server {
    listen 80;
    server_name example.com;
    root /var/www/html;
    index index.php index.html;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/run/php/php8.3-fpm.sock;
    }
}

Далее проверяется синтаксис конфигурации и перезапускается Nginx:

sudo nginx -t
sudo systemctl restart nginx

Для проверки работы создаётся файл /var/www/html/info.php с содержимым <?php phpinfo(); ?> и открывается в браузере.

Типичные проблемы:

  • 502 Bad Gateway - обычно означает, что PHP-FPM не запущен или сокет не найден. Проверяется командой sudo systemctl status php8.3-fpm.
  • Файлы PHP скачиваются вместо выполнения - отсутствует блок обработки .php в конфигурации Nginx. Необходимо добавить location ~ \.php$.
  • Ошибка прав доступа - пользователь Nginx не имеет прав на чтение файлов или подключение к сокету. Назначаются корректные права chown -R www-data:www-data /var/www/html.

Альтернативные варианты установки PHP сервера

Как запустить PHP сервер без установки веб-сервера?

Для быстрой разработки можно использовать встроенный сервер PHP. Он запускается одной командой и не требует настройки Nginx или Apache.

php -S 0.0.0.0:8000 -t /путь/к/проекту

Сервер работает в однопоточном режиме и подходит только для локального тестирования. Чтобы указать файл роутинга, добавляется параметр:

php -S 0.0.0.0:8000 router.php

Проблемы:

  • Одновременные запросы обрабатываются последовательно - не для продакшена.
  • Не поддерживается HTTPS без дополнительных прокси.

Как использовать Apache в качестве PHP сервера?

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

sudo apt install apache2 php libapache2-mod-php

После установки модуль автоматически подключается. Для включения обработки PHP в директории достаточно создать файл .htaccess или использовать конфигурацию виртуального хоста.

Проблемы:

  • Модуль mod_php запускается внутри процесса Apache, что потребляет много памяти.
  • Сложно изолировать разные приложения - все работают под одним пользователем.

Как изолировать PHP окружение с помощью Docker?

Docker позволяет развернуть PHP сервер в контейнере вместе с веб-сервером. Это удобно для единообразия окружения на разных машинах.

Пример Dockerfile для PHP-FPM:

FROM php:8.3-fpm
RUN docker-php-ext-install pdo pdo_mysql

Пример docker-compose.yml с Nginx:

version: '3'
services:
  web:
    image: nginx:alpine
    ports:
      - "80:80"
    volumes:
      - ./html:/var/www/html
      - ./nginx.conf:/etc/nginx/conf.d/default.conf
    depends_on:
      - php
  php:
    build: .
    volumes:
      - ./html:/var/www/html

Проблемы:

  • При неправильном монтировании volumes могут возникнуть проблемы с правами доступа (UID контейнера и хоста различаются).
  • Необходимо правильно настраивать сеть между сервисами.

Как развернуть полный стек LAMP?

LAMP (Linux, Apache, MySQL, PHP) - традиционный стек для веб-приложений. Установка всех компонентов одной командой:

sudo apt install lamp-server^

Пакет lamp-server^ в Ubuntu устанавливает Apache, MySQL и PHP с модулем mod_php. После установки настраивается база данных и виртуальные хосты.

Этот вариант подходит для простых проектов, не требующих высокой масштабируемости.

Проблемы:

  • Все компоненты работают на одном сервере, что затрудняет масштабирование.
  • MySQL по умолчанию использует аутентификацию auth_socket, что может вызывать затруднения при подключении из PHP.

Какие общие проблемы возникают при установке PHP сервера?

  • Скрипты не выполняются, отображаются как текст - веб-сервер не настроен на обработку PHP. Нужно убедиться, что установлен соответствующий модуль или настроен FastCGI.
  • Ошибка подключения к PHP-FPM - проверяется путь к сокету (unix:/run/php/php8.3-fpm.sock) или адрес (127.0.0.1:9000).
  • Порт уже занят - изменить порт в конфигурации или остановить другой процесс.

Дополнительные примеры с расширенными настройками

Как настроить несколько пулов PHP-FPM для разных сайтов?

PHP-FPM позволяет создавать отдельные пулы с разными пользователями и настройками. Пример конфигурации пула для сайта site1 (файл /etc/php/8.3/fpm/pool.d/site1.conf):

Пример
[site1]
user = site1user
group = site1group
listen = /run/php/site1.sock
listen.owner = www-data
listen.group = www-data
pm = dynamic
pm.max_children = 10
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 5
chdir = /var/www/site1

В конфигурации Nginx для этого сайта указывается соответствующий сокет:

Пример
location ~ \.php$ {
    fastcgi_pass unix:/run/php/site1.sock;
    include fastcgi_params;
}

Как переключить PHP-FPM на TCP-соединение вместо сокета?

В некоторых случаях (например, при запуске PHP-FPM в контейнере) удобнее использовать TCP. В конфигурации пула меняется параметр:

Пример
listen = 127.0.0.1:9000

Nginx подключается так:

Пример
fastcgi_pass 127.0.0.1:9000;

Результат: повышается гибкость, но появляется небольшое снижение производительности из-за сетевых накладных расходов.

Как использовать встроенный сервер с пользовательским роутингом?

Создаётся файл router.php:

Пример
<?php
$uri = $_SERVER['REQUEST_URI'];
if ($uri === '/api/users') {
    header('Content-Type: application/json');
    echo json_encode(['users' => ['Alice', 'Bob']]);
    return true;
}
return false; // продолжать обычную обработку

Запуск:

Пример
php -S 0.0.0.0:8000 router.php

Результат: при запросе /api/users возвращается JSON, остальные пути обрабатываются стандартно.

Как настроить Docker Compose для PHP-FPM с Nginx и пользовательскими правами?

Пример docker-compose.yml с явным заданием UID:

Пример
version: '3'
services:
  php:
    image: php:8.3-fpm
    user: "1000:1000"
    volumes:
      - ./app:/var/www/html
  web:
    image: nginx:alpine
    ports:
      - "8080:80"
    volumes:
      - ./app:/var/www/html
      - ./nginx.conf:/etc/nginx/conf.d/default.conf
    depends_on:
      - php

При этом nginx.conf должен содержать fastcgi_pass на контейнер php:9000. Результат: файлы создаются с UID хоста, что исключает проблемы с правами.

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

En
установить php сервер (php)