Связка Nginx и PHP-FPM через внутреннюю Docker-сеть
Дата публикации: 24.04.2026

Связка Nginx и PHP-FPM через внутреннюю Docker-сеть

ccb9a536


Связка Nginx и PHP-FPM через внутреннюю Docker-сеть: Быстро, Безопасно, Изолированно

Вы когда-нибудь видели, как повара в ресторане работают на одной кухне, но каждый занимается своим делом? Один нарезает овощи, другой жарит мясо, третий оформляет блюдо. Они не мешают друг другу, но результат — вкусный ужин — получается только благодаря их слаженному взаимодействию.

Так же работает связка Nginx + PHP-FPM в Docker:

  • Nginx — как официант: принимает заказы (HTTP-запросы) от клиентов и передаёт их на кухню.
  • PHP-FPM — как повар: обрабатывает PHP-код и возвращает готовый "ответ" (HTML, JSON и т.д.).
  • Docker-сеть — как внутренняя связь ресторана: обеспечивает быструю и безопасную передачу данных между сервисами, не вынося её наружу.

Почему это важно для веб-мастера или арбитражника?Безопасность: Внутренняя сеть Docker скрывает PHP-FPM от внешнего мира (никаких открытых портов!). ✅ Скорость: Обмен данными между контейнерами происходит почти мгновенно (нет накладных расходов на сетевые протоколы). ✅ Изоляция: Каждый сервис работает в своём контейнере — если один упадёт, остальные продолжат работу.


1. Теория: Как Nginx и PHP-FPM общаются в Docker

1.1. Традиционная связка (без Docker)

В классической настройке:

  • Nginx и PHP-FPM установлены на одном сервере.
  • Nginx отправляет запросы PHP-FPM через Unix-сокет (файл в системе) или TCP-порт (например, 127.0.0.1:9000).
  • Проблемы:
    • Если хакер получит доступ к серверу, он может атаковать PHP-FPM напрямую.
    • Сложно масштабировать (например, добавить второй PHP-контейнер).

1.2. Связка в Docker: Почему это лучше

В Docker:

  • Каждый сервис (Nginx, PHP-FPM, база данных) работает в отдельном контейнере.
  • Контейнеры общаются через внутреннюю сеть Docker (bridge-сеть), которая:
    • Изолирована от внешнего мира (доступ только для контейнеров в этой сети).
    • Быстрая (данные передаются через виртуальный интерфейс, без выхода в интернет).
    • Управляемая (можно легко добавлять/удалять сервисы).

Аналогия: Представьте, что Nginx и PHP-FPM — это два телефона в одной комнате. Они могут звонить друг другу по внутреннему номеру (например, php-fpm:9000), но снаружи их не видно.


2. Практика: Настройка связки Nginx + PHP-FPM в Docker

2.1. Подготовка: Структура проекта

Создайте папку для проекта:

mkdir nginx-php-docker && cd nginx-php-docker

Структура будет такой:

nginx-php-docker/
├── docker-compose.yml  # Конфигурация Docker
├── nginx/
│   ├── Dockerfile      # Образ Nginx
│   └── conf.d/
│       └── default.conf # Конфиг Nginx
└── php/
    ├── Dockerfile      # Образ PHP-FPM
    └── www/            # Папка с PHP-кодом
        └── index.php

2.2. Создаём Dockerfile для PHP-FPM

Файл php/Dockerfile:

FROM php:8.2-fpm-alpine

# Устанавливаем расширения (по необходимости)
RUN docker-php-ext-install pdo pdo_mysql

# Копируем PHP-код в контейнер
COPY www /var/www/html

# Настраиваем PHP-FPM для работы с Docker-сетью
RUN sed -i 's/;listen.owner.*/listen.owner = www-data/' \
    /usr/local/etc/php-fpm.d/www.conf && \
    sed -i 's/;listen.group.*/listen.group = www-data/' \
    /usr/local/etc/php-fpm.d/www.conf && \
    sed -i 's/;listen.mode.*/listen.mode = 0660/' \
    /usr/local/etc/php-fpm.d/www.conf

# Включаем логи
RUN touch /var/log/php-fpm.log && \
    chown www-data:www-data /var/log/php-fpm.log

Что здесь происходит?

  • Берем официальный образ php:8.2-fpm-alpine (лёгкий и быстрый).
  • Устанавливаем расширения для работы с базой данных (например, pdo_mysql).
  • Копируем PHP-код в /var/www/html (стандартная папка для PHP-FPM).
  • Настраиваем права доступа для сокета (чтобы Nginx мог подключаться).

2.3. Создаём Dockerfile для Nginx

Файл nginx/Dockerfile:

FROM nginx:alpine

# Удаляем дефолтный конфиг
RUN rm /etc/nginx/conf.d/default.conf

# Копируем наш конфиг
COPY conf.d/default.conf /etc/nginx/conf.d/

# Копируем статику (если есть)
# COPY static/ /var/www/static/

Почему alpine? Это минималистичная версия Nginx, которая весит ~50 МБ (вместо ~150 МБ в обычной версии).

2.4. Конфигурация Nginx для работы с PHP-FPM

Файл nginx/conf.d/default.conf:

server {
    listen 80;
    server_name localhost;

    root /var/www/html;
    index index.php index.html;

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

    location ~ \.php$ {
        # Передаём запросы PHP-FPM через Docker-сеть
        fastcgi_pass php-fpm:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }
}

Ключевая строка: fastcgi_pass php-fpm:9000;

  • php-fpm — имя сервиса в Docker (см. docker-compose.yml ниже).
  • 9000 — стандартный порт PHP-FPM.

2.5. Создаём docker-compose.yml

version: '3.8'

services:
  nginx:
    build: ./nginx
    ports:
      - "80:80"  # Пробрасываем порт 80 хоста в контейнер
    depends_on:
      - php-fpm  # Ждём, пока запустится PHP-FPM
    networks:
      - app-network

  php-fpm:
    build: ./php
    volumes:
      - ./php/www:/var/www/html  # Монтируем папку с кодом
    networks:
      - app-network

# Создаём внутреннюю сеть
networks:
  app-network:
    driver: bridge

Что здесь важно?

  • depends_on: Nginx запустится только после PHP-FPM.
  • networks: Оба контейнера подключены к одной сети app-network.
  • volumes: Папка с PHP-кодом монтируется в контейнер (изменения на хосте сразу отразятся в контейнере).

2.6. Тестовый PHP-файл

Создайте php/www/index.php:

<?php
phpinfo();

Эта страница покажет конфигурацию PHP (полезно для проверки).

2.7. Запускаем проект

docker-compose up -d --build
  • -d — запуск в фоновом режиме.
  • --build — пересобрать образы (на случай изменений).

Проверка: Откройте в браузере http://localhost. Если видите страницу phpinfo(), всё работает!


3. Оптимизация и безопасность

3.1. Почему внутренняя сеть Docker безопаснее TCP-порта?

Способ подключения Безопасность Скорость Масштабируемость
Unix-сокет ⭐⭐⭐⭐ (лучше) ⭐⭐⭐⭐⭐ ❌ (только локально)
TCP (127.0.0.1:9000) ⭐⭐ (хуже) ⭐⭐⭐⭐
Docker-сеть ⭐⭐⭐⭐⭐ ⭐⭐⭐⭐⭐

Docker-сеть выигрывает, потому что:

  • Трафик между контейнерами не выходит за пределы хоста.
  • Можно использовать имена сервисов (php-fpm:9000) вместо IP-адресов.
  • Легко добавлять балансировку нагрузки (например, несколько PHP-контейнеров).

3.2. Дополнительные меры безопасности

  1. Ограничьте права PHP-FPM: В php/Dockerfile добавьте:

    RUN usermod -u 1000 www-data  # Меняем UID пользователя

    Это предотвратит конфликты с правами на хосте.

  2. Отключите ненужные функции PHP: В php/www/php.ini (или через docker-php-ext-configure):

    expose_php = Off
    disable_functions = exec,shell_exec,system
  3. Используйте HTTPS: Добавьте в nginx/conf.d/default.conf:

    listen 443 ssl;
    ssl_certificate /etc/nginx/ssl/cert.pem;
    ssl_certificate_key /etc/nginx/ssl/key.pem;
  4. Логирование и мониторинг: В docker-compose.yml добавьте логи для Nginx:

    nginx:
     volumes:
       - ./logs/nginx:/var/log/nginx

4. Распространённые ошибки и их решение

Ошибка Причина Решение
502 Bad Gateway Nginx не может подключиться к PHP-FPM Проверьте имя сервиса в fastcgi_pass (должно совпадать с docker-compose.yml)
File not found Неверный путь в SCRIPT_FILENAME Убедитесь, что root в Nginx и путь в PHP-FPM совпадают
Permission denied Неправильные права на сокет В php/Dockerfile проверьте настройки listen.owner/group
Контейнер не запускается Ошибка в Dockerfile Посмотрите логи: docker-compose logs php-fpm

Совет: Если что-то не работает, запустите контейнеры в интерактивном режиме:

docker-compose run --service-ports nginx sh

И проверьте конфиги вручную.


5. Практика для закрепления

Упражнение 1: Модификация конфига Nginx

Задача: Добавьте в nginx/conf.d/default.conf обработку статических файлов (CSS, JS, изображения) так, чтобы они отдавались напрямую Nginx, без участия PHP-FPM.

Подсказка: Используйте директиву location с регулярным выражением для файлов .css, .js, .jpg и т.д.


Упражнение 2: Добавление второго PHP-контейнера

Задача: Измените docker-compose.yml, чтобы запускались два контейнера PHP-FPM (например, php-fpm1 и php-fpm2), и настройте Nginx на балансировку нагрузки между ними.

Подсказка: Используйте upstream в конфиге Nginx:

upstream php_backend {
    server php-fpm1:9000;
    server php-fpm2:9000;
}

Упражнение 3: Настройка HTTPS

Задача: Сгенерируйте самоподписанный сертификат SSL (например, через openssl) и настройте Nginx на работу по HTTPS.

Подсказка:

  1. Сгенерируйте сертификат:
    mkdir -p nginx/ssl && openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
    -keyout nginx/ssl/key.pem -out nginx/ssl/cert.pem
  2. Добавьте в default.conf блок для listen 443 ssl.

Упражнение 4: Оптимизация PHP-FPM

Задача: Изучите параметры пула PHP-FPM (/usr/local/etc/php-fpm.d/www.conf) и оптимизируйте их для низкоресурсного сервера (например, уменьшите pm.max_children).

Подсказка: Для сервера с 1 ГБ RAM достаточно pm.max_children = 5.


Упражнение 5: Логирование ошибок

Задача: Настройте вывод логов PHP-FPM и Nginx в отдельные файлы на хосте и проверьте их после нескольких запросов.

Подсказка: В docker-compose.yml добавьте:

php-fpm:
  volumes:
    - ./logs/php-fpm:/var/log/php-fpm
nginx:
  volumes:
    - ./logs/nginx:/var/log/nginx

6. Итоги и дальнейшие шаги

Что вы сегодня узнали? ✅ Как Nginx и PHP-FPM взаимодействуют через внутреннюю сеть Docker. ✅ Как настроить Dockerfile и docker-compose.yml для безопасной и быстрой работы. ✅ Как избежать典型 ошибок (502 Bad Gateway, проблемы с правами). ✅ Как оптимизировать и защитить связку.

Куда двигаться дальше?

  1. Добавьте базу данных (MySQL/PostgreSQL) в ту же Docker-сеть.
  2. Настройте кэширование (Redis, Memcached) для ускорения PHP.
  3. Изучите Docker Swarm/Kubernetes для масштабирования.
  4. Автоматизируйте деплой с помощью CI/CD (GitHub Actions, GitLab CI).

Помните: Docker — это не просто "мода", а инструмент, который экономит время, деньги и нервы. Правильная настройка связки Nginx + PHP-FPM через внутреннюю сеть сделает ваш сервер быстрее, безопаснее и надёжнее.


Вопросы? Пишите в комментариях — разберём любые сложности! 🚀


Генератор паролей с длинной 64 символа
Женская одежда с бахромой
Кадастровые работы в Бийске
Как Aptum хостинг помогает малым бизнесам в управлении CRM-системами
Как выбрать планировку сайта для блогов на DreamHost
Как выбрать Vdsina вечный хостинг для своего проекта
Казань окна VEKA - профессионализм и опыт
Курьерская вода
Новостройки Оренбурга: недвижимость с отличной ценой
Онлайн чат-партнерство
Пиломатериалы для возведения бани
Почему VDSina — лучший выбор хостинга
Секреты Вконтакте: тонкости и хитрости
Скидки до 50% на тур в Коста-Рике
Видеочат рулетка бесплатно
рейтинг хостингов 2026 Быстрые VDS серверы