Laravel 6 с Nginx, php 7,4 fpm и mysql 8 на docker медленнее, чем Laravel 4 на php 7.1 - PullRequest
2 голосов
/ 09 января 2020

Я работал на сайте, построенном на Laravel 4.2 и Php 7.1. Недавно я пытался перенести сайт на Laravel 6 с php 7.4 и mysql 8. Я настраиваю docker со следующими настройками.

Файл базы данных:

FROM mysql:8.0.18
ADD data_x.sql /docker-entrypoint-initdb.d
CMD ["mysqld"]
EXPOSE 3306

Nginx Файл:

FROM nginx:latest
CMD ["nginx"]
EXPOSE 80 443

Nginx conf:

server {

    listen 80 default_server;
    listen [::]:80 default_server ipv6only=on;

    server_name localhost;
    root /var/www/public/superadmin;
    index index.php index.html index.htm;

    location / {
         try_files $uri $uri/ /index.php$is_args$args;
    }

    location ~ \.php$ {
        try_files $uri /index.php =404;
        fastcgi_pass php-fpm:9000;
        fastcgi_index index.php;
        fastcgi_buffers 16 16k;
        fastcgi_buffer_size 32k;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        #fixes timeouts
        fastcgi_read_timeout 600;
        include fastcgi_params;
    }

    location ~ /\.ht {
        deny all;
    }

    location /.well-known/acme-challenge/ {
        root /var/www/letsencrypt/;
        log_not_found off;
    }
}

Php -fpm

FROM php:7.4.0-fpm-buster
RUN docker-php-ext-install pdo_mysql
CMD ["php-fpm"]
# Use the default production configuration
RUN mv "$PHP_INI_DIR/php.ini-production" "$PHP_INI_DIR/php.ini"
EXPOSE 9000

docker -составить

version: '3'

services:
  nginx:
    build:
      context: ./nginx
    volumes:
      - ../laravelproject:/var/www
      - ./nginx/nginx.conf:/etc/nginx/nginx.conf
      - ./nginx/sites/:/etc/nginx/sites-available
      - ./nginx/conf.d/:/etc/nginx/conf.d
    depends_on:
      - php-fpm
    ports:
      - "80:80"
      - "443:443"

  php-fpm:
    build:
      context: ./php-fpm
    volumes:
      - ../laravelproject:/var/www
      - ../laravelproject/serve_config/custom.ini:/usr/local/etc/php/conf.d/custom.ini
    links:
      - database:mysql

  database:
    build:
        context: ./database
    environment:
      - MYSQL_DATABASE=mydb
      - MYSQL_USER=myuser
      - MYSQL_PASSWORD=secret
      - MYSQL_ROOT_PASSWORD=docker
    command: ['--default-authentication-plugin=mysql_native_password']
    ports:
      - "3306:3306"

Миграция проходит гладко, но я заметил, что страницы загружаются довольно медленно.

Та же страница в моем старом коде, работающем на php 7.1 и Apache, занимает около 100 - 200 мс, в то время как моя новая версия почти заняла бы 1 секунду.

Я положил выход в bootstrap / app. php, и это все еще занимает примерно то же время. Я заметил, что app_debug был включен, и я выключил его, и это уменьшило задержку примерно до 600 - 700 мс, чтобы загрузить «привет» текст на странице.

Мне интересно, Docker добавляет задержку или я пропускаю какие-либо настройки на laravel 6, которые могут замедлять его.

Опкэш отключен на обоих.

Я пытался проверить некоторые различия во времени. Я не очень разбираюсь в том, как это сделать, но сделал это.

Первая страница индексной страницы
Старая настройка - 8 мс
Docker Настройка - 16 мс

в bootstrap приложении. php первая строка
старая настройка - 28 мс
Docker настройка - 106 мс

in bootstrap приложение. php до возврата $ app
старая настройка - 56 мс
Docker настройка - 206 мс

При индексе. php до запуска приложения
старая настройка - 68 мс
Docker настройка - 254 мс

после полной загрузки приложения
старая настройка - 115 мс
Docker настройка - 1 секунда (приблизительно)

В laravel 4 у нас была $ app-> run () в индексе. php после возврата $ app. В larave 6 вместо $ app-> run () у нас есть.

$kernel = $app->make(Illuminate\Contracts\Http\Kernel::class);

$response = $kernel->handle(
    $request = Illuminate\Http\Request::capture()
);

$response->send();

$kernel->terminate($request, $response);

- это может загружать что-то, что может привести к некоторой задержке. Я также попытался закомментировать некоторое промежуточное программное обеспечение, и оно оставалось прежним.

Каждый запрос занимает много времени для загрузки. Шрифты загружаются за 300 ~ 400 мс, и все примерно в 10 раз медленнее, чем старый код на apache на Mamp.

Ответы [ 2 ]

1 голос
/ 09 января 2020

К сожалению, сравнивать сайт, работающий на нативном PHP / MySQL (например, Mamp) с Docker, не имеет особого смысла. Docker сильно замедляет сайты (как на Ма c, так и Windows, может быть, намного лучше на Linux), поэтому это нормально, что сайт будет работать намного медленнее.

Если вас беспокоит производительность, вы должны протестировать ее непосредственно на вашем P C или загрузить сайт на какой-либо сервер разработки, чтобы увидеть производительность сайта.

0 голосов
/ 13 января 2020

Я нашел кое-что, что значительно улучшило производительность. Временные метки для сайта на разных страницах похожи на «голую железную» конфигурацию с MAMP.

Я использовал оптимизацию объема, как описано здесь: https://engageinteractive.co.uk/blog/making-docker-faster-on-mac

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...