Найкращі плагіни кешування для WordPress: вони ще кращі з Nginx

Будь-хто, хто прагне покращити продуктивність свого WordPress-сайту, неминуче звертається до кешування. Так, сьогодні є багато плагінів сторінкового кешування, проте вони не всесильні. Потенціал за додатковими покращеннями завжди є.

Якщо ви читали блог Delicious Brains, то ви знаєте, що я затятий прихильник Nginx FastCGI Caching. Він неймовірно швидкий і відносно простий у налаштуванні. Однак він має свої особливості, про що ми вже говорили в нещодавній статті. Зокрема, Nginx FastCGI Caching має проблеми з інвалідністю кешу.

Усі послуги на Linux-сервері виконуються від імені конкретного системного користувача. Nginx FastCGI Caching чудово працює в тому випадку, якщо під одним користувачем запущені Nginx та PHP. Файли, що кешуються Nginx, залишаються доступними для PHP, тобто. ви можете очистити кеш прямо з PHP. Це особливо важливо при публікації або оновленні записів WordPress. Однак Nginx завжди створюватиме файли кешу під поточним користувачем, і неможливо настроїти власника або групу цих файлів. Усі кешовані файли створюються з правами доступу 0600 або 0700 для файлів та папок відповідно, і змінити це не можна. Якщо Nginx та PHP працюють під різними системними користувачами (що часто буває), ви не зможете інвалідувати кеш з PHP.

Оскільки ми не можемо задавати права доступу до файлів Nginx, нам залишається тільки створювати файли кеша через PHP. Тут ми плавно підходимо до плагінів кешування WordPress. Якщо ж ви подивитеся на результати нашого останнього набору тестів, ви побачите, що Simple Cache не відповідає продуктивності, що пропонується Nginx FastCGI Caching.

Топ 3 плагинов кэширования для WordPress и их усиление с помощью Nginx

Порівняння RPS (кількості запитів за секунду):

  • WordPress – 31
  • Simple Cache – 281
  • FastCGI Cache – 420
  • Varnish – 337

Чому так відбувається? Давайте подивимося, як працюють плагіни сторінкового кешування.

Як працюють плагіни сторінкового кешування в WordPress

Безумовно, найвужче місце у WordPress – це підключення до сервера БД та запит даних. З’єднання здійснюється для кожного окремого запиту незалежно від того, чи змінювалися дані між запитами. Це дуже неефективно.

Плагіни сторінкового кешування WordPress вирішують цю проблему, створюючи статичну HTML-версію запитуваних даних, яка зазвичай зберігається у файловій системі. Наступні запити працюють вже зі статичним HTML-файлом; не потрібно повторно звертатися до БД та обробляти сторінку. Щоб зробити це, плагіни сторінки кешування використовують файл advanced-cache.php, який створюється при установці плагіна. Він запускається до завантаження WordPress (якщо константа WP_CACHE дорівнює true). Ядро WP обробляє його в wp-settings.php:

if ( WP_CACHE && apply_filters( 'enable_loading_advanced_cache_dropin', true ) && file_exists( WP_CONTENT_DIR . '/advanced-cache.php' ) ) {
    // For an advanced caching plugin to use. Uses a static drop-in because you would only want one.
    include WP_CONTENT_DIR . '/advanced-cache.php';

    // Re-initialize any hooks added manually by advanced-cache.php.
    if ( $wp_filter ) {
        $wp_filter = WP_Hook::build_preinitialized_hooks( $wp_filter );
    }
}

Багато плагінів кешування вбудовують додаткову логіку, яка запускається з advanced-cache.php, але зазвичай все зводиться до простої перевірки (file_exists) існування статичного HTML-файлу. Якщо файл існує, його вміст зчитується і записується у вихідний буфер. Потім скрипт завершує свою роботу, що не дозволяє WordPress виконати частину запиту, що залишилася. Примітка: все, що підчеплене до хука shutdown, буде виконано..

Найпростіший приклад:

if ( @file_exists( $path ) && @is_readable( $path ) ) {
    @readfile( $path );
    exit;
}

Найкращі плагіни кешування для WordPress

Тепер, коли ми знаємо, як працюють плагіни кешування, розглянемо кілька популярних рішень. Базова реалізація плагінів практично однакова, тому продуктивність часто теж рівнозначна. Тому у статті ми будемо аналізувати доступний функціонал та простоту використання.

WP Rocket

WP Rocket – один з найкращих доступних плагінів для кешування WordPress. Це преміум-плагін, вартість якого починається від 49 $ за один сайт. Безкоштовна версія відсутня, хоч є 14-денна гарантія повернення коштів.

Це єдиний платний плагін у нашому списку, і він посідає перше місце з погляду функціоналу та простоти використання. Сторінне кешування включається автоматично після активації плагіна. Простий і зрозумілий інтерфейс дозволяє додатково оптимізувати та налаштувати правила кешування.

WP Rocket має широку сумісність з різними плагінами, темами та хостингами. Він чудово працює з ecommerce-плагінами, включаючи WooCommerce. WP Rocket повністю сумісний з багатьма хостингами, які мають свої рішення для сторінкового кешування. Це означає, що конфліктів не станеться.

Інші функції, що входять до WP Rocket:

  • Оптимізація файлів CSS і JavaScript.
  • Ліниве завантаження медіафайлів.
  • Попереднє завантаження кешу (preload)
  • Інтеграція з CDN
  • Оптимізація бази даних.

WP Super Cache

WP Super Cache – безкоштовний плагін для кешування з відкритим кодом від Automattic, компанії WordPress.com. Це один з найпопулярніших плагінів кешування – понад 2 млн. активних установок.

Хоча в WP Super Cache не так багато додаткових функцій, він в цілому працює добре, а інтерфейс користувача простий і зрозумілий. У режимі Easy можна ввімкнути сторінку кешування одним перемикачем. Режим Advanced контролює інші параметри кешу.

Додаткові можливості WP Super Cache

  • Складання сміття для очищення застарілих файлів кешу.
  • Попереднє завантаження кешу (preload)
  • Інтеграція CDN

W3 Total Cache

W3 Total Cache – ще один популярний плагін, що налічує понад 1 млн. активних установок. Він має платні опції – наприклад, преміум-підтримка, а також Pro-версія з деякими додатковими функціями.

W3 Total Cache має масу опцій, проте він не такий простий у використанні, а тому новачків він може відлякати. Однак у ньому є керівництво, яке дозволить швидко розпочати роботу.

Функціонал:

  • Мініфікація HTML, CSS і JavaScript.
  • Об’єктне кешування
  • Кешування бази даних
  • Кешування PHP OPCode
  • Ліниве завантаження зображень
  • Оптимізація браузерного кешування

Чому плагіни кешування програють Nginx FastCGI Caching

Плагіни кешування WordPress дозволяють значно підвищити продуктивність, проте вони програють у порівнянні з Nginx FastCGI Caching. Чому так? Тому що кожен запит обробляється PHP, що вимагає набагато більше CPU-циклів, ніж проста обробка запиту Nginx.

Якщо ви пам’ятаєте старі добрі часи, коли на ринку лідирував Apache, то ви знаєте, що більшість кешування плагінів рекомендували додати правило mod_rewrite у ваш файл .htaccess. Це дозволяло Apache обробляти запит, не торкаючись PHP. Справа в тому, що Apache міг перезаписувати конфіги у процесі виконання за допомогою .htaccess. Однак Nginx це не підтримує.

Якби ми могли змусити Nginx виконувати аналогічну перевірку file_exists, як у PHP, ми, ймовірно, змогли б істотно підвищити продуктивність плагінів кешування WP.

Як змусити плагіни кешування WordPress «літати»

Як виявилося, Nginx дійсно виконує аналогічну перевірку file_exists для кожного запиту, що обробляється. У більшості конфігів Nginx є наступний блок.

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

По суті, це вказує Nginx передати запитуваний файл, якщо він існує, або в іншому випадку виконати внутрішній редирект на index.php. Якщо ми додамо нашу директорію кешу до цього блоку, ми зможемо передавати кешований HTML-файл із Nginx безпосередньо, не звертаючись до PHP.

Для прикладу візьмемо W3 Super Cache. Він зберігає файли кешу наступним чином:

// Request: hellfish.media/
wp-content/cache/supercache/hellfish.media/index-https.html
// Request: hellfish.media/hello-world/
wp-content/cache/supercache/hellfish.media/hello-world/index-https.html

Як ви можете бачити, шлях до кешованого файлу index-https.html у каталозі кеша плагіна завжди збігається із запитаним URL.

Тепер ми можемо оновити нашу директиву try_files, щоб використати змінні $http_host і $request_uri:

location / {
    try_files "/wp-content/cache/supercache/$http_host/$request_uri/index-https.html" $uri $uri/ /index.php?$args;
}

Після перезавантаження Nginx будь-які кешовані сторінки, що генеруються W3 Super Cache, надходитимуть безпосередньо з Nginx, ігноруючи PHP. Запити, які не були кешовані, будуть оброблятися WordPress, і система буде формувати кеш для подальших запитів.

Аналогічно у випадку з WP Rocket:

location / {
    try_files "/wp-content/cache/wp-rocket/$http_host/$request_uri/index-https.html" $uri $uri/ /index.php?$args;
}

Для більш просунутої конфігурації Nginx під WP Rocket ми радимо скористатися пакетом rocket-nginx.

Для W3 Total Cache, якщо ви використовуєте метод сторінкового кешування “Disk: Enhanced”, ви можете вказати наступне:

location / {
    try_files "/wp-content/cache/page_enhanced/$http_host/$request_uri/_index_ssl.html" $uri $uri/ /index.php?$args;
}

Також для W3 Total Cache є хороший варіант увімкнення згенерованого файлу nginx.conf у конфігурації Nginx для вашого сайту. Цей файл автоматично оновлюється відповідно до настройок W3 Total Cache.

Тести

Настав час порівняти результати. Як і в минулому випадку, я використовуватимуApacheBench.

ab -n 10000 -c 100 https://siteunderload.com/

Тут ми імітуємо передачу 10000 запитів з одночасним виконанням 100 запитів. Кожен тест буде виконуватися в цілому 10 разів, і для порівняння використовуватиметься середнє значення.

Серверний стек виглядає так (кожний сайт працює за HTTPS):

  • DigitalOcean 1GB ($5/місяць)
  • Ubuntu 20.04
  • PHP 8.0
  • Nginx 1.20.1
  • MySQL 8.0.25
  • WordPress 5.8, Twenty Twenty-One

Кількість запитів за секунду (RPS)

Почнемо із запитів за секунду, тобто з кількості одночасних користувачів, яка може обробляти ваш сервер (чим більше, тим краще). Як бачимо, всі плагіни з базовими налаштуваннями сторінки кешування працюють приблизно однаково, а ось Nginx FastCGI Cache істотно лідирує.

  • WP Rocket – 268
  • WP Super Cache – 272
  • W3 Total Cache – 238
  • Nginx FastCGI Cache – 407

Однак використання Nginx-директиви try_files із плагінами кешування дає схожі на Nginx FastCGI Caching результати. У деяких випадках навіть трохи краще.

  • WP Rocket – 412
  • WP Super Cache – 408
  • W3 Total Cache – 404
  • Nginx FastCGI Cache – 407

Середній час відповіді (мс)

Середній час відповіді – це загальний час, необхідний виконання запиту (що менше, то краще). Це середнє для всіх 10000 запитів – імітація часу відповіді, коли сервер перебуває під навантаженням. Як і вище, з увімкненою директивою try_files результати схожі на Nginx FastCGI.

  • WP Rocket – 244
  • WP Super Cache – 246
  • W3 Total Cache – 249
  • Nginx FastCGI Cache – 247

Висновок

Як і очікувалося, використання плагіну кешування з Nginx-директивою try_files суттєво покращує продуктивність та піднімає її до нативного кешування. FastCGI Caching в Nginx.

На практиці різниця між Nginx FastCGI Caching та плагінами з директивою try_files є незначною, і будь-яке з цих рішень для кешування є відмінним варіантом. Якщо ви використовуєте хостинг, що адмініструється, вам, ймовірно, не знадобиться плагін для сторінкового кешування, оскільки такі рішення вже вбудовані в дані сервіси. А якщо ні, то я б порекомендував спробувати різні плагіни, щоб вибрати для себе найзручніший.

Прокоментувати

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *