PHP7 + Laravel + Nginx ужасно тормозят на Docker

У меня есть проект, который работает нормально на экземпляре EC2 уже более года. Ответ от бэкенда к интерфейсу обычно составляет 600 мс. На этом сервере, назовем его сервером A, интерфейс и серверная часть размещены на одном сервере, а база данных размещена на MongoDB Atlas.

Теперь мы используем докер, а интерфейс и серверная часть находятся в отдельных контейнерах, каждый контейнер размещается в другом экземпляре. Время отклика увеличилось до 3,36 с. Таким образом, с 600 миллисекунды до 3,36 секунды. И я использую тот же сервер базы данных, что и сервер A.

Мне бы очень хотелось услышать ваши мысли о том, как оптимизировать PHP, Laravel и Nginx, чтобы получить самое быстрое время отклика в Docker.

Вот мои файлы конфигурации, DockerFile, start.sh и nginx.conf

DockerFile

FROM nginx:mainline-alpine

COPY start.sh /start.sh
COPY nginx.conf /etc/nginx/nginx.conf
COPY supervisord.conf /etc/supervisord.conf

RUN apk add --update \
php7 \
php7-fpm \
php7-pdo \
php7-pdo_mysql \
php7-gd \
php7-mcrypt \
php7-mbstring \
php7-xml \
php7-openssl \
php7-json \
php7-phar \
php7-curl \
php7-zip \
php7-fileinfo \
php7-xmlwriter \
php7-tokenizer \
php7-mongodb \
php7-dom \
php7-session \
php7-zlib && \
php7 -r "copy('http://getcomposer.org/installer', 'composer-setup.php');" && \
php7 composer-setup.php --install-dir=/usr/bin --filename=composer && \
php7 -r "unlink('composer-setup.php');" && \
ln -s -f /usr/bin/php7 /usr/bin/php && \
ln -s -f /etc/php7/php.ini /etc/php7/conf.d/php.ini

RUN apk add --update \
bash \
openssh-client \
supervisor

RUN mkdir -p /etc/nginx && \
mkdir -p /etc/nginx/sites-available && \
mkdir -p /etc/nginx/sites-enabled && \
mkdir -p /run/nginx && \
ln -s /etc/nginx/sites-available/default.conf /etc/nginx/sites-enabled/default.conf && \
mkdir -p /var/log/supervisor && \
rm -Rf /var/www/* && \
chmod 755 /start.sh

RUN php -i | grep -i gd

RUN wget -O phpunit https://phar.phpunit.de/phpunit-8.phar
RUN chmod +x phpunit
RUN ./phpunit --version

RUN sed -i -e "s/;cgi.fix_pathinfo=1/cgi.fix_pathinfo=0/g" \
-e "s/variables_order = \"GPCS\"/variables_order = \"EGPCS\"/g" \
/etc/php7/php.ini && \
sed -i -e "s/;daemonize\s*=\s*yes/daemonize = no/g" \
-e "s/;catch_workers_output\s*=\s*yes/catch_workers_output = yes/g" \
-e "s/user = nobody/user = nginx/g" \
-e "s/group = nobody/group = nginx/g" \
-e "s/;listen.mode = 0660/listen.mode = 0666/g" \
-e "s/;listen.owner = nobody/listen.owner = nginx/g" \
-e "s/;listen.group = nobody/listen.group = nginx/g" \
-e "s/listen = 127.0.0.1:9000/listen = /var/run/php-fpm.sock/g" \
-e "s/^;clear_env = no$/clear_env = no/" \
/etc/php7/php-fpm.d/www.conf

EXPOSE 80
COPY . /var/www
WORKDIR /var/www
RUN chmod -R 777 storage/
RUN echo `ls`


CMD ["/start.sh"]

start.sh

#!/bin/bash

# ----------------------------------------------------------------------
# Create the .env file if it does not exist.
# ----------------------------------------------------------------------

if [[ ! -f "/var/www/.env" ]] && [[ -f "/var/www/.env.example" ]];
then
cp /var/www/.env.example /var/www/.env
fi

# ----------------------------------------------------------------------
# Run Composer
# ----------------------------------------------------------------------

if [[ ! -d "/var/www/vendor" ]];
then
cd /var/www
composer install --no-scripts
composer update
composer dump-autoload
fi

php artisan optimize --force
php artisan config:cache

# ----------------------------------------------------------------------
# Start supervisord
# ----------------------------------------------------------------------

exec /usr/bin/supervisord -n -c /etc/supervisord.conf

nginx.conf

user nginx;
worker_processes 1;

error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;

events {
worker_connections 1024;
}

http {
    include /etc/nginx/mime.types;
    default_type application/octet-stream;
    access_log off;
    sendfile on;
    #tcp_nopush on;
    keepalive_timeout 0;
    #gzip on;

    fastcgi_cache_path /etc/nginx/cache levels=1:2 keys_zone=BACKEND:500m inactive=60m;
    fastcgi_cache_key "$scheme$request_method$host$request_uri";
    add_header X-Cache $upstream_cache_status;

    server {

        listen 80;

        root /var/www/public;
        index index.php index.html;
                set $no_cache 0;

        location / {
            try_files $uri $uri/ /index.php?$query_string;
            }

        location ~ /\. {
            deny all;
            }

        location ~ \.php$ {
            try_files $uri = 404;
            fastcgi_split_path_info ^(.+\.php)(/.+)$;
            fastcgi_cache BACKEND;
            fastcgi_cache_valid 200 1m;
            fastcgi_pass unix:/var/run/php-fpm.sock;
            fastcgi_index index.php;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            include fastcgi_params;
            }
    }
}

Какое профилирование вы сделали? Какая часть стека на самом деле медленная? Вы нужно запускаете два сервиса в одном контейнере?

David Maze 10.03.2019 21:16

Когда вы говорите, что «каждый контейнер размещается в другом экземпляре», вы имеете в виду, что ваш контейнер базы данных работает на другой виртуальной машине, чем ваш php-контейнер? Если раньше они были вместе, возможно, вы вводили несколько миллисекунд сетевой задержки для каждого запроса к базе данных. С учетом количества запросов, которые обычно выполняет веб-сайт, они могут увеличиваться на сверхчувствительный до миллисекунд во время запросов к БД.

Travis Britz 10.03.2019 21:24

Что я имею в виду под каждым контейнером, размещенным в другом экземпляре, так это то, что теперь интерфейс находится в экземпляре, а серверная часть размещена в другом экземпляре. Для базы данных я уже использую автономные серверы в обоих сценариях.

MZaza 11.03.2019 13:45
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
3
1 388
1

Ответы 1

В моем случае (mac os) я обнаружил, что монтирование тома терпит неудачу.

благодаря применению этого приложения производительность была на 50% выше.

 volumes: 
  - .:/var/www/html:cache

Вы можете использовать другие флаги громкости для повышения производительности

  • последовательный: идеальная согласованность (хост и контейнер всегда имеют одинаковый вид на крепление)
  • cached: представление хоста является авторитетным (разрешить задержки перед появлением обновлений на хосте в контейнере)
  • делегировано: представление контейнера является авторитетным (разрешить задержки перед появлением обновлений в контейнере на хосте)

ссылка от https://www.docker.com/blog/user-guided-caching-in-docker-for-mac/

Примечание: работает только с версией докера Docker 17.04 CE Edge.

Другие вопросы по теме