У меня 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 на голом железе (не в докере)