Организация работы PHP на сервере под управлением Ubuntu

Раздел: Установка PHP -> Операционные системы

Выбор подхода для запуска PHP приложений

Какое решение можно считать наиболее эффективным для продакшена?

Связка Nginx + PHP-FPM

Для производственных нагрузок рекомендуется использовать Nginx в качестве веб-сервера и PHP-FPM (FastCGI Process Manager) для обработки PHP. Такая конфигурация обеспечивает высокую производительность, низкое потребление памяти и хорошую изоляцию процессов.

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

sudo apt update
sudo apt install nginx php-fpm php-mysql php-xml php-mbstring php-curl

Php ubuntu server (php сервер на ubuntu)

Пояснение: установка Nginx и PHP-FPM вместе с часто используемыми расширениями. После завершения необходимо настроить конфигурацию Nginx.

sudo nano /etc/nginx/sites-available/default

Внутри заменить содержимое (или добавить) блок location для PHP:

server {
    listen 80;
    root /var/www/html;
    index index.php index.html index.htm;
    server_name _;

    location / {
        try_files $uri $uri/ =404;
    }

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

Проверка синтаксиса и перезапуск:

sudo nginx -t
sudo systemctl restart nginx
sudo systemctl enable php8.1-fpm

Проблема: ошибка 502 Bad Gateway. Возникает, если путь к сокету PHP-FPM указан неверно или процесс не запущен.

Проверить статус PHP-FPM: systemctl status php8.1-fpm. Убедиться, что файл сокета существует: ls -la /run/php/. Если сокет отсутствует, перезапустить сервис: sudo systemctl restart php8.1-fpm.

Как быстро запустить PHP на Apache с модулем mod_php?

Установка LAMP (Linux, Apache, MySQL, PHP) в классическом исполнении

Подходит для простых сайтов, где не требуется высокая производительность и изоляция процессов. Модуль mod_php встраивается непосредственно в Apache, что упрощает конфигурацию.

sudo apt update
sudo apt install apache2 php libapache2-mod-php php-mysql

Проверка работы: создать файл info.php в /var/www/html/:

echo '<?php phpinfo(); ?>' | sudo tee /var/www/html/info.php

Открыть в браузере http://ваш-сервер/info.php.

Проблема: модуль не загружается после установки. Проверить включение: sudo a2enmod php8.1 (версия может отличаться). Перезапуск Apache: sudo systemctl restart apache2.

Если страница info.php отображается как текст или скачивается, модуль PHP не активирован. Убедиться, что установлен libapache2-mod-php, и выполнить sudo a2enmod mpm_prefork (mod_php не работает с mpm_event).

Как заставить Apache работать с PHP-FPM для лучшей производительности?

Apache с прокси на PHP-FPM

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

sudo apt install apache2 php-fpm libapache2-mod-proxy-html
sudo a2enmod proxy_fcgi setenvif
sudo a2enconf php8.1-fpm

Настройка виртуального хоста:

<VirtualHost *:80>
    ServerName example.com
    DocumentRoot /var/www/html
    <FilesMatch \.php$>
        SetHandler "proxy:unix:/run/php/php8.1-fpm.sock|fcgi://localhost"
    </FilesMatch>
</VirtualHost>

Перезапуск Apache: sudo systemctl restart apache2.

Проблема: 503 Service Unavailable. Проверить, что PHP-FPM запущен и сокет доступен.

Изменить права на сокет: sudo chmod 666 /run/php/php8.1-fpm.sock (не рекомендуется для безопасности, лучше настроить пользователя www-data).

Как использовать PHP только для командной строки (CLI)?

Установка PHP CLI без веб-сервера

Подходит для фоновых задач, скриптов обработки данных, тестирования. Не требует настройки веб-окружения.

sudo apt install php-cli php-xml php-mbstring php-curl php-zip

Проверка версии: php -v. Запуск скрипта:

echo '<?php echo "Hello from CLI\n";' > test.php
php test.php

Проблема: отсутствие расширений, например, mbstring. Установить их: sudo apt install php-mbstring.

После установки расширения может потребоваться перезагрузка терминала, так как расширения загружаются динамически.

Как развернуть изолированный PHP сервер через Docker?

Контейнеризация с официальным образом PHP-FPM

Идеально для консистентности окружения, микросервисной архитектуры, быстрой смены версий PHP.

docker pull php:8.1-fpm
mkdir ~/myapp
cd ~/myapp
cat <<EOF > Dockerfile
FROM php:8.1-fpm
COPY . /var/www/html
EOF
docker build -t my-php-app .
docker run -d -p 9000:9000 --name php-server my-php-app

Для работы с Nginx обычно используется docker-compose:

version: '3'
services:
  php:
    image: php:8.1-fpm
    volumes:
      - ./html:/var/www/html
  nginx:
    image: nginx:alpine
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf
      - ./html:/usr/share/nginx/html
    ports:
      - 80:80

Проблема: контейнер PHP-FPM не может соединиться с базой данных, если она запущена на хосте. Необходимо использовать сеть Docker или host.docker.internal.

Для доступа к хостовой MySQL в Linux добавить --add-host host.docker.internal:host-gateway или использовать переменную окружения для адреса БД.

Расширенные сценарии и примеры

Настройка пула PHP-FPM для оптимизации под нагрузку

Конфигурация пула находится в /etc/php/8.1/fpm/pool.d/www.conf. Изменение параметров позволяет контролировать количество процессов и использование памяти.

Пример
pm = dynamic
pm.max_children = 50
pm.start_servers = 10
pm.min_spare_servers = 5
pm.max_spare_servers = 20
pm.process_idle_timeout = 30s

Результат указанных настроек:

- Допускается до 50 одновременных PHP-процессов.
- В простое поддерживается от 5 до 20 процессов.
- Если процесс бездействует более 30 секунд, он завершается.

Использование разных версий PHP одновременно (например, 7.4 и 8.1)

Установка из PPA (Ondřej Surý) позволяет сосуществовать нескольким версиям.

Пример
sudo add-apt-repository ppa:ondrej/php
sudo apt update
sudo apt install php7.4-fpm php7.4-mysql php7.4-xml
sudo apt install php8.1-fpm php8.1-mysql php8.1-xml

Каждая версия слушает свой сокет: /run/php/php7.4-fpm.sock и /run/php/php8.1-fpm.sock. В конфигурации Nginx можно указать нужный сокет для каждого location.

Пример
location ~ \.php$ {
    fastcgi_pass unix:/run/php/php7.4-fpm.sock;
    include snippets/fastcgi-php.conf;
}

или для другого каталога:

Пример
location /legacy/ {
    fastcgi_pass unix:/run/php/php8.1-fpm.sock;
}

Кеширование PHP-ответов с помощью Nginx FastCGI Cache

Уменьшает нагрузку на PHP-FPM, кешируя ответы на определенное время.

Пример
fastcgi_cache_path /var/cache/nginx levels=1:2 keys_zone=PHP_CACHE:10m;
fastcgi_cache_key "$scheme$request_method$host$request_uri";

location ~ \.php$ {
    fastcgi_cache PHP_CACHE;
    fastcgi_cache_valid 200 60m;
    # добавить условие для пропуска кеша
    fastcgi_no_cache $cookie_nocache $arg_nocache;
    include snippets/fastcgi-php.conf;
    fastcgi_pass unix:/run/php/php8.1-fpm.sock;
}

Результат:

- Ответы с кодом 200 кешируются на 60 минут.
- Кеш хранится в /var/cache/nginx, размер до 10 МБ.
- При GET-параметре nocache или cookie nocache кеш пропускается.

Компиляция PHP из исходного кода для нестандартных опций

Полезно, когда требуется включить редкое расширение или настроить путь установки.

Пример
cd /tmp
wget https://www.php.net/distributions/php-8.2.12.tar.gz
tar -xzf php-8.2.12.tar.gz
cd php-8.2.12
./configure --prefix=/usr/local/php8.2 --enable-mbstring --enable-intl --with-openssl --with-pdo-mysql
make -j4
sudo make install

Проверка:

Пример
/usr/local/php8.2/bin/php -v

Результат:

PHP 8.2.12 (cli) (built: ...)

Запуск PHP-скрипта с ограничением времени выполнения и памяти

Через CLI можно передать параметры:

Пример
php -d max_execution_time=30 -d memory_limit=256M huge_script.php

Пример вывода:

(скрипт выполнится, не превышая лимиты; при ошибке времени появится сообщение "Fatal error: Maximum execution time of 30 seconds exceeded")

PHP сервер на Ubuntu - comments

En
Php ubuntu server (php)