Когда мы говорим о быстрой загрузке сайтов WordPress, мы непременно учитываем кэширование. Нередко оно играет решающую роль. Грамотно оптимизированный страничный кэш способен существенно ускорить загрузку страниц для посетителей, снижая нагрузку на сервер. Это действительно беспроигрышный вариант! Однако не все решения для страничного кэширования одинаково полезны. Простой поиск по запросу «caching» в каталоге WordPress.org выводит тысячи результатов. Причем плагины – далеко не единственный вариант для реализации кэширования на сайте. Зачастую плагины работают не так хорошо, как серверные решения – к примеру, Varnish или Nginx FastCGI.
В этой статье мы сравним кэширование Varnish и Nginx FastCGI, чтобы понять, какое из них лучше. Также мы протестируем WordPress без кэширования и добавим кэширующий плагин. Я выбрал Simple Cache, поскольку, как и следует из названия, его проще всего настроить.
Наш стек выглядит следующим образом:
Varnish против Nginx
Прежде чем мы перейдем к тестированию, давайте коснемся каждой технологии и поймем, почему нам стоит ее использовать.
Varnish Cache – это open source фронтэнд-акселератор. Он устанавливается на ваш веб-сервер для кэширования содержимого ответов. Согласно официальной документации, он способен ускорить доставку контента в 300-1000 раз – в зависимости от архитектуры.
Главная функция Nginx – работа в качестве веб-сервера. Он предлагает обратное проксирование, кэширование, медиа-стриминг и даже балансировку нагрузки. С годами Nginx существенно вырос, начиная с обычного веб-сервера, предлагающего максимальную стабильность и производительность. Сегодня мы настроим веб-сервер так, чтобы он передавал запросы в PHP-FPM. Кэширование FastCGI (протокол, используемый для связи между Nginx и PHP-FPM) мы настроим так, чтобы ответы от PHP-FPM хранились в виде статичных HTML-файлов; к ним напрямую будет обращаться Nginx при последующих запросах.
Как видите, функционал Nginx и Varnish разный. Varnish специально создан для кэширования, в то время как Nginx – это веб-сервер с возможностью использования встроенного кэширования. Также для работы Varnish требуется веб-сервер, такой как Apache или Nginx.
Как мы будем сравнивать результаты кэширования?
ApacheBench – инструмент командной строки, разработанный Apache Software Foundation и изначально созданный для тестирования производительности Apache.
Все тесты в данной статье будут выполняться с использованием одних и тех же параметров, за исключением тестирования WordPress без кэша. Почему так? Отправка такого большого количества одновременных запросов к PHP и MySQL приведет только к увеличению среднего времени ответа, что вряд ли можно назвать грамотным отражением производительности PHP.
ab -n 10000 -c 100 https://siteunderload.com/
Здесь мы имитируем 10000 запросов с одновременным выполнением 100 запросов. Это означает, что ApacheBench будет отправлять в общей сложности 10000 запросов партиями по 100 за раз. Для версии без кэширования я буду использовать 20 одновременных запросов.
В итоге мы получим следующие результаты:
В данной статье мы будем рассматривать преимущественно показатели Requests per second и Connection Times. Каждый тест будет выполнен в общей сложности 10 раз – мы возьмем среднее значение для сравнения.
Мы будем тестировать только HTTPS-версию сайта, поскольку сегодня она максимально распространена.
Серверный стек
Все тесты будут проводиться с одним и тем же серверным стеком, включающим в себя:
- DigitalOcean 2GB ($10/месяц)
- Ubuntu 20.04
- PHP 7.4.14
- Nginx 1.18.0
- MariaDB 10.4.17
- Varnish 6.2.1
- WordPress 5.6, Twenty Twenty-One
Varnish мы полностью отключим, когда он не требуется для текущего набора тестов. Nginx будет использоваться для завершения HTTPS-запросов, поскольку Varnish не способен этого сделать. В итоге получаем следующую конфигурацию:
Nginx:443 > Varnish:80 > Nginx:8080
Обратите внимание, что Nginx у нас работает как прокси-сервер для завершения HTTPS. Есть и другие прокси-серверы для выполнения той же задачи, но я выбрал Nginx, дабы свести к минимуму количество разных компонентов.
Мы будем тестировать четыре разных сценария:
- WordPress – Без кэширования
- Simple Cache – Кэширование через WordPress-плагин
- FastCGI Cache – Nginx
- Varnish – Varnish с Nginx для завершения HTTPS
Пропускная способность – количество запросов в секунду (Requests Per Second)
Как и ожидалось, WordPress без кэширования работает очень плохо, поскольку есть узкое место – сервер базы данных. Простое исключение сервера базы данных из уравнения при помощи страничного кэширования дает почти 10-кратный прирост количества запросов. Varnish еще немного улучшает ситуацию, гарантируя, что запросы не будут обрабатываться средствами PHP. Однако Varnish сильно отстает от Nginx, если говорить о чистой пропускной способности (запросов в секунду) – возможно, из-за дополнительного шага в виде завершения HTTPS со стороны Nginx. Использование одного Nginx позволяет добиваться оптимальной пропускной способности.
Среднее время ответа
Большое количество запросов в секунду (Requests Per Second) не имеет никакого значения, если эти запросы выполняются медленно. Потому важно также измерять и время ответа. Среднее время ответа – это общее время, которое требуется на выполнение запроса.
Когда сервер находится под большой нагрузкой, среднее время ответа обычно увеличивается. Связано это с тем, что сервер может обрабатывать только определенное количество одновременных подключений – как правило, из-за узких мест в памяти или в ЦП. Если их число становится больше, то все дополнительные подключения ставятся в очередь и обрабатываются по мере доступности ресурсов. Если запросы находятся в очереди слишком долго, они истекают по тайм-ауту.
Как правило, чем меньше разных участков в жизненном цикле запроса, тем меньше будет среднее время ответа. Вот почему кэширование Nginx FastCGI работает лучше всего – ведь здесь используется статичный файл с диска (который, в свою очередь, с высокой долей вероятности будет кэширован в памяти вследствие применения Linux Page Cache). Запрос с WP-сайта без кэширования будет пропущен через Nginx, PHP и сервер баз данных в бэкэнде. С плагином кэширования вы затронете только Nginx и PHP. При кэшировании страниц через Nginx FastCGI Cache или Varnish вы затронете только Nginx или Varnish.
Заключение
Если сравнивать Varnish с Nginx FastCGI Cache, то Nginx здесь явный победитель, дающий высокую производительность. Он не только способен обрабатывать больше запросов в секунду, но еще и передает каждый запрос в среднем на 59 мс быстрее.
Однако производительность – не единственное соображение. Как насчет легкости настройки? В этом случае плагины WordPress выходят на первое место (за исключением W3 Total Cache, у которого очень громоздкая панель настроек). Да, кэширование Nginx FastCGI достаточно просто настроить, но оно требует sudo прав на сервере. Varnish, с другой стороны, намного сложнее настроить, отчасти из-за требований к HTTPS-терминации.
Если Varnish – не самое быстрое решение, да еще и сложнее в установке, зачем тогда его вообще использовать? Если говорить кратко, то Varnish лучше всех справляется с более сложными правилами инвалидации кэша благодаря Varnish Configuration Language (VCL). В общем, если вы не работаете с веб-приложениями, которые требуют сложной структуры кэширования (к примеру, с ecommerce-платформами), не передаете кучу динамического контента наряду с кэшированием, то вам вряд ли потребуется Varnish.
Многие компании полагаются исключительно на Nginx в вопросах кэширования.
Источник: spinupwp.com