Назад | Перейти на главную страницу

Docker nginx + php-fpm ttfb медленный по сравнению с голым металлом

У меня nginx и php-fpm работают в отдельных контейнерах докеров. Php-fpm обрабатывает один и тот же скрипт php так же быстро, как php-fpm, работающий на голом железе (без использования докера). Однако TTFB при использовании докеров nginx + php-fpm всегда превышает 1,3 секунды, тогда как при запуске nginx + php-fpm на голом железе (без докеров) TTFB всегда составляет менее 30 мс.

Почему nginx (предположительно) так медленно работает на докере? Что еще более важно, я уверен, что это проблема конфигурации, которую можно решить, что в моем docker-compose yml нужно изменить, чтобы повысить производительность nginx TTFB? Никто не стал бы использовать докер для nginx + php-fpm, если это ожидаемое поведение, поэтому я знаю, что это ошибка пользователя.

Изменить: я создал репо, вы можете увидеть все файлы и попробовать сами. Цифры в TTFB будут немного отличаться от значений в приложении, о котором я говорю, но проблема все еще существует, см. Репозиторий для тестирования CI Docker.

Это мой docker-compose.yml:

version: "3"

services:
  nginx:
    image: nginx
    build:
      dockerfile: Dockerfile
      context: ./server/nginx
    ports:
      - 80:80
      - 443:443
    volumes:
      - ./app:/var/www/html
      - ./uploads:/var/www/uploads
    networks:
      - www
  php:
    user: "${userid}:${groupid}"
    image: php:7.3-fpm
    build:
      dockerfile: Dockerfile
      context: ./server/php-fpm
    env_file:
      - server/php-fpm/env/my.env
    environment:
      XDEBUG_CONFIG: remote_host=${ipaddr}
      CI_ENV: development
    volumes:
      - ./app:/var/www/html
      - ./uploads:/var/www/uploads
    networks:
      - www

networks:
  www:

Проблема решена (я уйду, если кто-то еще столкнется с этим)

Я запускал докер с помощью этой команды:

userid=$(id -u) groupid=$(id -g) ipaddr=$(ip route get 8.8.8.8 | awk '{print $NF; exit}') docker-compose up --build

В docker-compose.yml в контейнере php вы видите XDEBUG_CONFIG: remote_host=${ipaddr}

Проблема была в том, ip route get 8.8.8.8 | awk '{print $NF; exit}' не возвращает ip на всех системах. Таким образом, xdebug получал неправильный IP-адрес, что, в свою очередь, вызывало системный вызов, вызывающий задержку. Как только я отправил правильный IP-адрес в xdebug, все было хорошо.

Я скорректировал свой up просто передать ip вместо того, чтобы пытаться передать динамический поиск, поскольку он отличается в каждой системе. Теперь задержки больше нет.

userid=$(id -u) groupid=$(id -g) ipaddr=$(myipaddress) docker-compose up --build

TTFB запускает nginx + php-fpm в докере 1,23 секунды:

TTFB голый металл не в докере:

Таймер сценария php, запускающий php-fpm в контейнере докера:

таймер сценария php, запускающий php-fpm на голом железе (не в докере)