Назад | Перейти на главную страницу

Высокое время ожидания от времени до первого байта с Magento + Nginx

У меня проблема с высоким временем TTFB, особенно временем ожидания после отправки.

Webpagetest показывает, что TTFB составляет почти 4 секунды.

Pingtom указывает, что время ожидания является узким местом.

Вот моя установка для сервера Magento + Nginx, см. Скриншоты для тестирования и настройки http://share.pho.to/#7BuP9

  1. ОС: сервер Ubuntu 14.04
  2. nginx / 1.4.6
  3. PHP 5.5.9
  4. opcache 7.0.3
  5. memcached
  6. PHP-FPM
  7. Magento 1.9.0.1
  8. Сервер Linode 2 ГБ / 2 ядра

Конфигурация сервера Nginx

server {
    server_name dev.magibooks.com;
    return 301 $scheme://www.dev.magibooks.com$request_uri;
}


server {
listen 80;

#listen 443 ssl spdy;
#ssl on;
#ssl_certificate      /etc/nginx/ssl/dev/ssl-dev-unified.crt;
#ssl_certificate_key  /etc/nginx/ssl/dev/ssl-dev.key;

server_name www.dev.magibooks.com;
root /var/www/www.dev.magibooks.com/web;

## rewrites dev.magibooks.com to www.dev.magibooks.com
#if ($http_host != "www.dev.magibooks.com") {
#    rewrite ^ $scheme://www.dev.magibooks.com$request_uri permanent;
#}

location / {
    index index.html index.php; ## Allow a static html file to be shown first
    try_files $uri $uri/ @handler; ## If missing pass the URI to Magento's front handler
    expires 30d; ## Assume all files are cachable

    #auth_basic           "Restricted"; ## Message shown in login window
    #auth_basic_user_file /var/www/www.dev.magibooks.com/.htpasswd; 
    #autoindex            on;



}

location ~ /\.(eot|otf|ttf|woff)$ {
    add_header Access-Control-Allow-Origin *;
}

## These locations would be hidden by .htaccess normally
location /app/                { deny all; }
location /includes/           { deny all; }
location /lib/                { deny all; }
location /media/downloadable/ { deny all; }
location /pkginfo/            { deny all; }
location /report/config.xml   { deny all; }
location /var/                { deny all; }

location /var/export/ { ## Allow admins only to view export folder
    auth_basic           "Restricted"; ## Message shown in login window
    auth_basic_user_file /var/www/www.dev.magibooks.com/.htpasswd; ## See /etc/nginx/htpassword
    autoindex            on;
}

## Disable .htaccess and other hidden files
location ~ /\. {
    deny all;
    access_log off;
    log_not_found off;
}

location @handler { ## Magento uses a common front handler
    rewrite / /index.php;
}

location ~ \.php/ { ## Forward paths like /js/index.php/x.js to relevant handler
    rewrite ^(.*\.php)/ $1 last;
}

location ~ \.php$ { ## Execute PHP scripts
    if (!-e $request_filename) { rewrite / /index.php last; } ## Catch 404s that try_files miss

    expires        off; ## Do not cache dynamic content
    #fastcgi_pass   127.0.0.1:9000;
    fastcgi_pass unix:/var/run/php5-fpm.sock;
    fastcgi_param  HTTPS $fastcgi_https;
    fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
    #fastcgi_param  MAGE_RUN_CODE default; ## Store code is defined in administration >     Configuration > Manage Stores
    fastcgi_param  MAGE_RUN_TYPE store;
    include        fastcgi_params; ## See /etc/nginx/fastcgi_params
}


location ~* .(jpg|jpeg|png|gif|ico|css|js)$ {
    expires 365d;
}
}

nginx.conf

user www-data;
worker_processes 2;
pid /run/nginx.pid;
worker_rlimit_nofile 60000;

events {
    worker_connections 10240;
    # multi_accept on;
}

http {

    ##
    # Basic Settings
    ##

    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    keepalive_timeout 2;
    types_hash_max_size 2048;
    # server_tokens off;

    # server_names_hash_bucket_size 64;
    # server_name_in_redirect off;

    include /etc/nginx/mime.types;
    default_type application/octet-stream;

    ##
    # Logging Settings
    ##

    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;

    ##
    # Gzip Settings
    ##

    gzip on;
    gzip_disable "msie6";

    #gzip_vary on;
    gzip_proxied any;
    gzip_comp_level 6;
    gzip_min_length 1100;
    gzip_buffers 16 8k;
    gzip_http_version 1.1;
    gzip_types text/plain application/xml text/css text/js text/xml application/x-javascript text/javascript application/json application/xml+rss;

    ##
    # nginx-naxsi config
    ##
    # Uncomment it if you installed nginx-naxsi
    ##

    #include /etc/nginx/naxsi_core.rules;

    ##
    # nginx-passenger config
    ##
    # Uncomment it if you installed nginx-passenger
    ##

    #passenger_root /usr;
    #passenger_ruby /usr/bin/ruby;

    ##
    # Virtual Host Configs
    ##

    ## Detect when HTTPS is used
    map $scheme $fastcgi_https {
      default off;
      https on;
    }

    client_body_buffer_size 10K;
    client_header_buffer_size 1k;
    client_max_body_size 8m;
    large_client_header_buffers 4 4k;


    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;
}

Я пробовал следующее

  1. +/- Cloudflare
  2. оптимизированные значения php-fpm pm_ *
  3. оптимизированный кеш, включая opcache и memcached, эти изменения ускоряют время полной загрузки страницы и документа, но не влияют на время TTFB
  4. +/- логи nginx
  5. отрегулируйте уровень gzip от 1 до 6
  6. Страница CMS загружается немного быстрее, но все еще имеет TTFB 1.815s.
  7. Страница phpinfo () загружается около 40 мс.
  8. За счет отслеживания access.log запрос всегда появляется после точного времени ожидания, например когда я обновляю dev.magibooks.com, на стороне сервера требуется 4 секунды, чтобы увидеть запрос, отображаемый в access.log
  9. Я подозреваю, что что-то связано со слишком большим количеством продуктов на главной странице, особенно с настраиваемыми продуктами, я удалил 12 продуктов, TTFB уменьшился с 5 секунд до 4 секунд, но все еще очень высокий
  10. На медленной странице php отображается следующее

    [17-Sep-2014 21:48:45]  [pool www] pid 10333
    script_filename = /var/www/www.dev.magibooks.com/web/index.php
    [0x00007fc13eb6f8d8] session_start() /var/www/www.dev.magibooks.com/web/app/code/core/Mage/Core/Model/Session/Abstract/Varien.php:125
    [0x00007fc13eb6f798] start() /var/www/www.dev.magibooks.com/web/app/code/core/Mage/Core/Model/Session/Abstract/Varien.php:168
    [0x00007fc13eb6f650] init() /var/www/www.dev.magibooks.com/web/app/code/core/Mage/Core/Model/Session/Abstract.php:84
    [0x00007fc13eb6f558] init() /var/www/www.dev.magibooks.com/web/app/code/core/Mage/Core/Model/Session.php:42
    [0x00007fc13eb6f428] __construct() /var/www/www.dev.magibooks.com/web/app/code/core/Mage/Core/Model/Config.php:1348
    [0x00007fc13eb6f310] getModelInstance() /var/www/www.dev.magibooks.com/web/app/Mage.php:463
    [0x00007fc13eb6f1e0] getModel() /var/www/www.dev.magibooks.com/web/app/Mage.php:477
    [0x00007fc13eb6f088] getSingleton() /var/www/www.dev.magibooks.com/web/app/code/core/Mage/Core/Controller/Varien/Action.php:493
    [0x00007fc13eb6ef00] preDispatch() /var/www/www.dev.magibooks.com/web/app/code/core/Mage/Adminhtml/Controller/Action.php:160
    [0x00007fc13eb6ed08] preDispatch() /var/www/www.dev.magibooks.com/web/app/code/core/Mage/Core/Controller/Varien/Action.php:407
    [0x00007fc13eb6eaf8] dispatch() /var/www/www.dev.magibooks.com/web/app/code/core/Mage/Core/Controller/Varien/Router/Standard.php:250
    [0x00007fc13eb6e9a8] match() /var/www/www.dev.magibooks.com/web/app/code/core/Mage/Core/Controller/Varien/Front.php:172
    [0x00007fc13eb6e850] dispatch() /var/www/www.dev.magibooks.com/web/app/code/core/Mage/Core/Model/App.php:354
    [0x00007fc13eb6e6b0] run() /var/www/www.dev.magibooks.com/web/app/Mage.php:684
    [0x00007fc13eb6e570] run() /var/www/www.dev.magibooks.com/web/index.php:87 11. minified all js and css
    

Magento в стандартной комплектации исключительно быстр, он загружает страницы за 0,5 с со всеми отключенными кешами и за 0,2 с со всеми включенными кешами.

Таким образом, вам не нужно строго делать Magento быстрее, вам нужно удалить / изменить все, что делает его медленным.

Есть 2 узких места для производительности.

  • Плохой хостинг
  • Плохой код

Решить их очень просто,

  • Используйте хостинг-провайдера, который специализируется на высокопроизводительном хостинге Magento, который может предоставить поддержку на уровне магазина, чтобы помочь вам масштабироваться и направлять вас по повышению производительности.
  • Профилируйте свой код и удалите / повторно проанализируйте плохо работающий код

Вы узнаете, является ли ваш хостинг-провайдер вашим узким местом, просто установив демонстрационный магазин с образцами данных. Если загрузка всех кешей занимает более 0,5 секунды, то в этом проблема.

Я сделал следующее, чтобы успешно сократить время загрузки страницы с 6 до 1 секунды на

  1. отключить newrelic
  2. отключить долгий просмотр

Предстоит сделать 1. Я в процессе обновления до 4-ядерной системы памяти 4 ГБ, результаты я опубликую здесь 2. Я собираюсь проконсультироваться с решением для полного кеширования страницы.