логотип PurpleSchool
логотип PurpleSchool

Работа с php-fpm в Docker

Автор

Алексей Смирнов

Введение

В мире веб-разработки PHP остается одним из самых популярных языков программирования. Современные веб-разработчики все чаще обращаются к контейнеризации, чтобы упростить процесс развертывания и управления приложениями. Docker позволяет изолировать приложения от инфраструктуры, обеспечивая гибкость и масштабируемость. В этой статье мы рассмотрим, как использовать PHP-FPM (FastCGI Process Manager) в Docker для оптимизации производительности PHP-приложений.

PHP-FPM — это альтернатива традиционному CGI-методу исполнения PHP. Он специально разработан для работы с веб-серверами, такими как Nginx и Apache, чтобы обрабатывать запросы более эффективно. Поддержка PHP-FPM в Docker открывает разработчикам новые возможности управления ресурсами и оптимизации производительности приложений.

Создание Docker-окружения для PHP-FPM

Для начала работы с PHP-FPM в Docker вам понадобится Docker и Docker Compose. Мы будем использовать Docker Compose для упрощенного управления контейнерами. Давайте создадим простое окружение:

Создайте директорию для вашего проекта и внутри нее создайте файл docker-compose.yml. Это основной файл, который определяет всю конфигурацию вашего Docker-окружения.

version: '3.8' # Определяем версию docker-compose

services: # Определяем сервисы
  web: 
    image: nginx:latest # Используем образ Nginx
    ports:
      - "8080:80" # Маппинг порта 8080 на 80 порт в контейнере
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf # Монтируем наш конфигурационный файл Nginx
    depends_on:
      - php

  php:
    image: php:7.4-fpm # Используем образ PHP с поддержкой FPM
    volumes:
      - ./src:/var/www/html # Монтируем директорию с PHP-кодом

Теперь у нас есть базовая конфигурация, состоящая из двух сервисов: Nginx и PHP-FPM. Nginx будет служить фронтендом, принимающим HTTP-запросы, а PHP-FPM будет обрабатывать PHP-код.

Конфигурация Nginx

Создайте файл nginx.conf в корне директории проекта:

server {
    listen 80; # Слушаем 80 порт

    root /var/www/html; # Корневая директория PHP-кода
    index index.php index.html index.htm;

    location / {
        try_files $uri $uri/ =404; # Пытаемся найти запрашиваемый файл
    }

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass php:9000; # Пробрасываем PHP-запросы на php-fpm
    }
}

Эта конфигурация отвечает за проксирование PHP-запросов к FPM-процессу. fastcgi_pass php:9000; указывает, что Nginx должен перенаправлять PHP-запросы на PHP-FPM, который находится в другом контейнере.

Развертывание приложения

Запустите Docker Compose для создания и запуска контейнеров:

docker-compose up -d

Опция -d запускает процесс в фоновом режиме. Используя docker-compose up, вы создаете и запускаете оба контейнера: Nginx и PHP-FPM.

Проверка работы

Поместите файл index.php в папку src с простым содержимым:

<?php
phpinfo(); // Выводим информацию о PHP

Теперь откройте браузер и перейдите по адресу http://localhost:8080. Если все настроено правильно, вы увидите стандартную страницу PHP с информацией, которая подтверждает, что PHP-FPM обрабатывает запросы.

Тонкая настройка PHP-FPM

PHP-FPM предоставляет множество опций для тонкой настройки производительности и управления процессами. Следующий важный шаг — изучить и оптимизировать параметры PHP-FPM в php-fpm.conf. Этот файл внутри контейнера можно настроить для улучшения производительности.

Важные параметры PHP-FPM

  • pm.max_children: определяет максимальное число дочерних процессов. Этот параметр напрямую влияет на способность сервера обрабатывать параллельные запросы. Увеличение этого значения может улучшить производительность, но увеличит использование памяти.

  • pm.start_servers: количество процессов, запускаемых при старте. Определите это значение исходя из ожидаемого начального наплыва запросов.

  • pm.min_spare_servers и pm.max_spare_servers: минимальное и максимальное число процессов, которые будут простаивать, ожидая запросы. Эти параметры помогают управлять доступностью ресурсов.

Эти параметры можно передать контейнеру через переменные среды или монтированием пользовательского php-fpm.conf.

Пример монтирования пользовательского php-fpm.conf

Создайте файл php-fpm.conf и добавьте параметры, исходя из особенностей вашего приложения. После этого обновите конфигурацию в docker-compose.yml:

  php:
    image: php:7.4-fpm
    volumes:
      - ./src:/var/www/html
      - ./php-fpm.conf:/usr/local/etc/php-fpm.d/www.conf # Монтируем наш конфигурационный файл PHP-FPM

Заключение

Объединение Docker и PHP-FPM позволяет разрабатывать и развертывать PHP-приложения быстро и эффективно. Контейнеризация обеспечивает изоляцию приложений, легкость управления зависимостями и масштабируемость. Настройка PHP-FPM повышает производительность, и в это сыграет значительную роль тонкая настройка параметров, адаптированная под уникальные требования вашего проекта. Овладев навыками контейнеризации с помощью Docker и PHP-FPM, вы сможете значительно упростить процесс управления и развертывания ваших PHP-приложений.

Карта развития разработчика

Получите полную карту развития разработчика по всем направлениям: frontend, backend, devops, mobile