超级慢查询时间为laravel 5 / php-fpm / nginx在dockerized的web应用程序

我有一个位于nginx之后的Laravel 5.5 / PHP-fpm(PHP 7)API,都在不同的Docker容器中。 我简单地返回一个json对象的API调用大约需要2秒钟,这对于这样一个简单的查询来说是非常长的(即使我查询并从dockerized mysql数据库中返回一些行,也需要3秒以上)。 应该less于一百毫秒。 我不知道如何debugging这个问题。 任何想法为什么这么慢?

  • 使用Docker for Mac
  • docker-compose版本1.16.1,build 6d1ac21
  • Docker版本17.09.0-ce,编译afdb6d4

PHP API

Route::get('/api/names', function () { return array( 1 => "Honey", 2 => "Nut", 3 => "Cheerios" ); }); 

Nginx的dockerfile

 FROM nginx RUN rm /etc/nginx/conf.d/* COPY nginx.conf /etc/nginx/conf.d/ 

nginx.conf

 upstream phpie { server php-fpm:9000 weight=10 max_fails=3 fail_timeout=30s; } server { listen 80; index index.php index.html; root /var/www/api/public; resolver 127.0.0.11 valid=5s ipv6=off; location / { try_files $uri $uri/ /index.php$is_args$args; } location ~ \.php$ { try_files $uri /index.php =404; fastcgi_pass phpie:9000; fastcgi_index index.php; fastcgi_buffers 16 16k; fastcgi_buffer_size 32k; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } } 

PHP的dockerfile

 FROM php:7.1-fpm RUN apt-get update && apt-get install -y libmcrypt-dev \ mysql-client libmagickwand-dev --no-install-recommends \ && pecl install imagick \ && docker-php-ext-enable imagick \ && docker-php-ext-install mcrypt pdo_mysql 

泊坞窗,compose.yml

  php-fpm: build: context: ./api working_dir: /var/www/api volumes: - ./api:/var/www/api ports: - "9000" nginx: restart: always build: context: ./nginx volumes: - ./api:/var/www/api depends_on: - php-fpm ports: - "80:80" command: /bin/bash -c "nginx -g 'daemon off;'" 

PHP依靠文件caching来快速加载每个请求。 每次php运行它必须再次加载所有需要的文件。 从Mac到Docker虚拟机的文件caching和加载文件的速度变慢,因此每个请求都变慢。 尤其是任何加载了许多文件的框架,比如Laravel。

运行应用程序时,不要使用Dockerfile > VM卷装入,将api/文件复制到Dockerfile每个映像中进行确认。

我已经习惯的一种解决scheme是创build一个内容卷,在运行时安装到每个容器中。 对于开发,这个内容卷是由一个外部工具与您本地开发人员更改同步。

内容Dockerfile – Dockerfile.content

 FROM scratch WORKDIR /var/www/api/ COPY . /var/www/api/ 

撰写

  content: image: user3226932/api-content build: context: ./api dockerfile: Dockerfile.content volumes: - 'content:/var/www/api' php-fpm: build: context: ./api working_dir: /var/www/api volumes: - 'content:/var/www/api' depends_on: - content ports: - "9000" nginx: restart: always build: context: ./nginx volumes: - 'content:/var/www/api:ro' depends_on: - php-fpm ports: - "80:80" command: /bin/bash -c "nginx -g 'daemon off;'" volumes: - content 

尝试像docker-sync (使用rsync策略)来保持本地开发环境与卷同步。 它主要是工作,但有时可能会有点儿车。 另一个选项是直接fswatchrsync到本地卷目录。 docker volume ls