Docker nginx+php-fpm ttfb 与裸机相比速度较慢

Docker nginx+php-fpm ttfb 与裸机相比速度较慢

我在单独的 docker 容器中运行 nginx 和 php-fpm。php-fpm 处理相同 php 脚本的时间与在裸机上运行的 php-fpm(不使用 docker)一样快。但是,使用 nginx+php-fpm docker 时的 TTFB 始终超过 1.3 秒,而在裸机上运行 nginx+php-fpm(无 docker)时 TTFB 始终小于 30 毫秒。

为什么 nginx (大概) 在 docker 上这么慢?更重要的是,我确信这是一个可以解决的配置问题,我的 docker-compose yml 中需要更改哪些内容才能提高 nginx TTFB 的性能?如果这是预期的行为,没有人会将 docker 用于 nginx+php-fpm,所以我知道这是用户错误。

编辑:我创建了一个 repo,您​​可以查看所有文件并亲自尝试。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:

问题已解决(我会留下来以防其他人遇到这个问题)

我一直使用以下命令启动 docker:

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

在 php 容器中的 docker-compose.yml 中你会看到XDEBUG_CONFIG: remote_host=${ipaddr}

问题是,ip route get 8.8.8.8 | awk '{print $NF; exit}'它不会在所有系统上返回 IP。因此 xdebug 获取了错误的 IP 地址,这反过来又导致了系统调用,从而导致了延迟。一旦我向 xdebug 发送了正确的 IP 地址,一切就都好了。

我调整了up命令,只传递 ip,而不是尝试传递动态查找,因为每个系统上的 ip 都不同。现在延迟消失了。

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

docker 中运行 nginx+php-fpm 的 TTFB 为 1.23 秒:

docker 中运行 nginx+php-fpm 的 TTFB 为 1.23 秒:

TTFB 裸机不在 docker 中:

ttfb 裸机 nginx+php-fpm (不在docker中)

在docker容器上运行php-fpm的php脚本计时器:

php 脚本计时器

php 脚本计时器在裸机上运行 php-fpm(不在 docker 中)

php 脚本计时器在裸机上运行 php-fpm(不在 docker 中)

相关内容