Проблема экстремальной нагрузки на сайт под управлением WordPress

Рассказывать в данном посте о том, что такое WordPress я не буду. Более того, я надеюсь что вы, читая данную статью, уже имеете опыт работы с ней, а лучше администрируете или запустили хотя бы один сайт под управлением данной CMS. В противном случае, никакой полезной информации для себя здесь не ищите.

Итак, за те 10 лет, которые прошли с момента первого релиза, WordPress превратилась из небольшой системы управления содержимым с открытым исходным кодом в мощный инструмент для создания веб-сайтов практически любой сложности. Я считаю, что на данный момент эта лучшая платформа для создания сайтов-визиток, блогов и прочих ресурсов, предназначенных для получения информации. Несомненно, за все это время система была "отполирована" и оптимизирована как нельзя лучше, однако и сейчас встречаются проблемы с которыми приходится бороться самостоятельно, редактируя и правя исходный код. Широкие функциональные возможности WordPress несут не только блага, но и проблемы, об одной из которых речь пойдет дальше.

Предыстория

Начну с предыстории. Совсем недавно один из сайтов, за которым я присматриваю около 5-ти месяцев, рухнул, гордо выдавая ошибку 504. Работает, как вы поняли, он под управлением WordPress (версия 3.4.2), а сам ресурс расположен на виртуальном хостинге, который администрируется при помощи cPanel.

В то время когда появились проблемы с доступом к сайту, количество запущенных процессов на сервере возросло. Одновременно увеличилась загрузка процессора и объем используемой оперативной памяти. Среди множества ничем непримечательных GET-запросов в логах, удалось обнаружить следующий POST-запрос:

93.125.XXX.XXX - - [26/Jun/2013:17:27:24 +0300] "POST /wp-cron.php?doing_wp_cron=1372256843.9632339477539062500000 HTTP/1.0" 200 - "-" "WordPress/3.4.2; http://www.xxxxx.xx"

Из него можно понять, что сам WordPress делает POST-запрос к своему же скрипту wp-cron.php. Время обращения к данному файлу совпадало с временем, когда начались проблемы с доступом к сайту и поэтому я решил разобраться, что же происходит внутри скрипта wp-cron.php.

Что делает wp-cron.php

wp-cron.php - это скрипт, который отвечает за периодический запуск различных задач. К таким задачам например относятся:

  • проверка обновлений WordPress и установленных плагинов;
  • запланированная публикация постов;
  • рассылка уведомлений о новых комментариях и прочих событиях;
  • запуск плагинов, таких например как Akismet для фильтрации комментариев на наличие спама;
  • оповещение сторонних сервисов о публикации нового материала;
  • и др.

Объем выполняемой работы, как видим, достаточно велик. При этом виртуальные сервера, на которых чаще всего размещаются небольшие сайты под управлением WordPress, имеют ограничение на количество используемых системных ресурсов. В итоге получается, что запуск скрипта wp-cron.php является достаточно дорогим и может создавать экстремальные нагрузки на сервер, из-за чего сам сайт становится недоступным на некоторое время.

Отключение wp-cron.php

Очевидным решением для снижения нагрузки на сервер является отключение периодического запуска скрипта wp-cron.php. Делается это добавлением всего одной строчки в конфигурационный файл WordPress wp-config.php.

Просто добавьте этот код в начало или конец wp-config.php.

define('DISABLE_WP_CRON', true);

Далее у вас есть выбор: оставить скрипт wp-cron.php отключенным навсегда или создать свою cron-задачу для запуска его с определенным интервалом. Хотя первый вариант позволит вам избавиться от нагрузок на сервер, я склоняюсь ко второму, поскольку каким бы "тяжелым" не было выполнение данного скрипта, он делает действительно необходимую и полезную работу. У вас может возникнуть вопрос: "Зачем тогда вообще отключать автоматическое выполнение wp-cron.php?". Дело в том, что сам WordPress может запустить его несколько раз в день, а, создав собственную cron-задачу, вы можете контролировать данный процесс и установить время, когда сайт, скажем, нагружен меньше всего.

Если для администрирования хостинга вы используете cPanel, то воспользуйтесь инструкцией по созданию cron-задач . Команда, которая выполнит скрипт wp-cron.php представлена ниже. Это простой GET-запрос к wp-cron.php и выводом результата в /dev/null.

wget http://www.vashdomen.com/wp-cron.php?doing_wp_cron > /dev/null

Интервал запуска созданной вами cron-задачи будет зависеть от того, как часто вы проверяете свой сайт. Если это один раз в 6 дней, то и интервал разумно установить таким же. С другой стороны, если у вас ресурс с высокой посещаемостью и активностью пользователей, то интервал лучше установить более частым, чтобы, например, плагин Akismet мог отфильтровать все оставленные комментарии.

Заключение

Я решил рассказать об этой проблеме владельцам сайтов на базе WordPress, поскольку убежден, что большинство из них хостятся именно на виртуальных серверах с низкой производительностью и потенциально могут столкнуться с ней. А как говорится: "Предупрежден - значит вооружен".