Содержание статьи
Вкратце о сервере
Итак, имеем самый обычный VDS с 39 Гбайт оперативки, 12 ядрами и «Убунтой» на борту. PHP 7.2, PHP-FPM, MySQL 5.7. Версии ПО, может, немного и древние, но установлены неспроста: такая конфигурация обусловлена требованиями CMS Magento 2.3.4. Более новая версия PHP повлекла бы за собой обновление версии CMS, а этого по ряду причин делать было нельзя.
Как обычно, все прекрасно работало до одного момента: пока не начались традиционные новогодние распродажи и маркетологи не притащили на сайт кучу трафика. Вот тут и начались проблемы. Наиболее характерная из них — процесс php-fpm
в паре с MySQL выжирал всю оперативку. Перезапуск сервисов с добавлением 20 Гбайт свопа проблему решил ненадолго. Дальше пошел процесс настройки nginx и php-fpm
, прежде всего — последнего, поскольку именно его параметры влияют на эксплуатационные особенности CMS. Я не буду рассматривать установку и настройку nginx с самого начала — скорее всего, у тебя уже все настроено. Даже если это не так, в сети можно найти множество статей и руководств на эту тему. Сконцентрируемся лучше на параметрах, непосредственно влияющих на производительность сервера.
Конфигурационные файлы
Прежде чем приступить к дальнейшему чтению статьи, нужно понимать, что и где и редактировать. Конфигурация nginx хранится в каталоге /
. Основной конфиг — nginx.
, но времена одного большого файла уже давно прошли, и в зависимости от содержимого nginx.
конфигурация веб‑сервера может быть разбросана по всей файловой системе.
Как правило, конфиги сайтов хранятся в каталоге /
. Для каждого сайта принято создавать отдельный конфиг. Далее нужно проанализировать содержимое файлов конфигурации на предмет директивы Include
. Если первоначальную настройку выполнял не ты, поищи во всех файлах каталога nginx
файлы с директивой Include
— так ты поймешь, что и откуда берется. Например, в моем случае кто‑то до меня добавил директиву include /
, чтобы некоторые параметры можно было вынести в каталог документов веб‑сервера и редактировать их без редактирования основной конфигурации сервера. Что‑то вроде .
в «Апаче», вот только после изменения этого файла все равно придется делать reload сервису.
Далее перейдем к параметрам PHP. У него есть несколько конфигураций. Прежде всего введи команду php
, чтобы выяснить номер версии. Так вот, конфигурация твоей версии PHP хранится в каталоге /
. В этом каталоге ты найдешь четыре подкаталога. Да, это три разные конфигурации и список модулей:
- apache2 — конфиг для модуля mod_rewrite «Апача». Если у тебя «Апач», то настройки PHP хранятся здесь;
- cli — параметры консольной версии PHP, они вступают в силу, если ты запускаешь выполнение скрипта с консоли командой
php <
;имя_скрипта> - fpm — наш случай, а именно конфигурация сервиса
php-fpm
и самого PHP, работающего в связке nginx, PHP-FPM и PHP; - mods-available — доступные расширения PHP. Здесь хранятся .ini-файлы, по одному для каждого установленного расширения. Закомментировав строчку
extension
внутри этого файла, ты можешь выключить расширение.
Чтобы узнать, какой именно файл конфигурации PHP используется, помести в корень сервера PHP-скрипт, вызывающий php_info(
. Эта функция и покажет (кроме всего прочего) локацию и имя файла конфигурации.
Включение HTTP 2.0
Если не считать статического кеша, то самое крутое, что ты можешь сделать в настройках nginx, — это включить HTTP 2.0. Некоторые админы почему‑то забывают об этом. В моем случае так и было: я уже получил преднастроенный подрядчиком сервер, в котором почему‑то забыли включить версию 2.0 протокола HTTP. Думаю, не нужно говорить о том, как медленно работала Magento.
Больше дела, меньше слов: открой конфигурацию сайта в каталоге /
. Найди блок server
и добавь (если этого еще не сделано) http2
в директиву listen
. Должно получиться так:
server {
listen 443 ssl http2;
ssl on;
...
}
Номер порта и SSL установи по своему усмотрению, но поскольку пример реальный, то SSL уже есть на твоем сайте, так как это стандарт по умолчанию.
OPcache: быть или не быть?
OPcache используется для кеширования скомпилированного байт‑кода PHP-скриптов в оперативной памяти. С одной стороны, при использовании OPcache повысится производительность и снизится нагрузка на сервер — PHP уже не будет создавать байт‑код при выполнении скрипта, а станет использовать откомпилированную версию из кеша. С другой стороны, в процессе использования сложных CMS вроде Magento могут возникнуть проблемы. При установке расширения этого движка происходит так называемая перекомпиляция Magento. Лучше эту процедуру производить при выключенном кеше, а затем снова его включить.
Для этого редактируется конфиг, перезагружается сервис php-fpm
, производятся необходимые действия, а потом снова все повторяется — редактирование конфига и перезапуск сервиса. Также возникнут проблемы при использовании собственной системы кеширования Magento. Здесь поможет использование Varnish. В общем, резюмировать можно следующее: если ты решишь включить OPcache, то в случае с Magento тебе придется отказаться от использования собственной системы кеширования и разбираться с настройками Varnish. Установка расширений доставляет меньше неудобств, поскольку выполняется не так часто.
Для включения OPcache нужно открыть конфигурацию PHP, в нашем случае это /
, и добавить в него всего одну строчку:
opcache.enable = 1
Этим ты активируешь opcache
с настройками по умолчанию. Как минимум можно задать параметр opcache.
, который регулирует размер памяти (в мегабайтах), выделяемый для OPcache. Значение по умолчанию — 128, минимально допустимое значение — 8:
opcache.memory_consumption = 256
С остальными настройками OPcache можно ознакомиться здесь. На своем сервере я отключил OPcache по двум причинам. Во‑первых, сайт активно допиливается, из‑за чего очень часто приходится добавлять в него новые функции или изменять уже имеющиеся, что при включенном OPcache не совсем удобно. Во‑вторых, пока нет никакого желания устанавливать Varnish, хотя в скором времени это придется сделать. На данный момент используется штатная система кеширования.
Запрещаем доступ ботов
Боты во время своего обхода сайта расходуют драгоценные ресурсы. При неблагоприятном стечении обстоятельств (например, случайные или намеренные визиты нескольких ботов сразу) сайт может упасть, не выдержав нагрузки. Каждый GET-запрос страницы тянет за собой использование ресурсов сервера: загрузка элементов страницы (картинки, CSS-таблицы и прочее), обращение к базе данных и, возможно, к сторонним ресурсам. Бот — это не пользователь, который откроет одну страницу и изучает ее контент, бот открывает страницу за страницей, что может вызвать негативные последствия.
Продолжение доступно только участникам
Вариант 1. Присоединись к сообществу «Xakep.ru», чтобы читать все материалы на сайте
Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее
Вариант 2. Открой один материал
Заинтересовала статья, но нет возможности стать членом клуба «Xakep.ru»? Тогда этот вариант для тебя! Обрати внимание: этот способ подходит только для статей, опубликованных более двух месяцев назад.
Я уже участник «Xakep.ru»