我有一个位于nginx后面的Laravel 5.5 / PHP-fpm(PHP 7)API,它们都位于不同的Docker容器中。我的API调用只返回一个json对象需要大约2秒,这对于这样一个简单的查询来说非常长(即使我查询并从dockerized mysql数据库返回一些行,也需要3秒以上)。它应该不到一百毫秒。我不确定如何调试此问题。有什么想法,为什么它这么慢?
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;'"
答案 0 :(得分:2)
PHP依赖于文件缓存来快速加载每个请求。每次运行php
时,都必须再次加载所有必需的文件。从Mac到Docker VM的安装与文件缓存混乱并加载文件变得很慢,因此每个请求都会变慢。特别是任何加载带有大量文件的框架的东西,比如Laravel。
在没有Mac的情况下运行应用程序 - > VM卷安装,api/
文件复制到Dockerfile
中的每个图像中以进行确认。
我用过的一个解决方案是创建一个内容卷,该内容卷在运行时安装到每个容器中。对于开发,此内容卷由外部工具与本地dev更改同步。
内容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策略)让本地开发环境与卷保持同步。它大部分都有效,但可能会不时出现问题。另一个选择是直接fswatch
& rsync
到本地卷目录。 docker volume ls