Содержание
В этой статье мы рассмотрим несколько распространенных вариантов, когда сайт под управлением WordPress становится источником высокой нагрузки на сервер. В таких случаях техподдержка хостинга обычно извещает пользователей с просьбой провести работы по оптимизации сайта. Как же бороться с этой нагрузкой и что ее вызывает?
Начну с того, что ситуации бывают весьма специфические, но мы рассмотрим наиболее распространенные. Не исключено, что среди этих рассмотренных ситуаций, окажется и Ваша и Вы с легкостью ликвидируете проблемы. Также мы обусловимся, что Вы умеете найти причину нагрузки в WordPress самостоятельно, изучив логи посещений своего сайта.
Проблема в wp-cron.php
wp-cron.php периодически запускает на сайте различные задачи: проверяет обновления WordPress и установленных плагинов, публикует запланированные посты, рассылает уведомления о новых комментариях и прочих событиях и т.д. Проблемы с wp-cron начинаются зачастую на виртуальных серверах, которые имеют ограничение на количество используемых системных ресурсов. В итоге создается экстремальная нагрузка на сервер.
Определив, что источником нагрузки является wp-cron.php, его можно отключить, добавив в файл wp-config.php строчку:
define('DISABLE_WP_CRON', true);
Но без wp-cron сайт не будет полноценно функционировать. Тогда мы сами должны управлять его работой, это можно сделать через cPanel, создав cron-задачу (с необходимым интервалом на исполнение), например:
wget http://ваш_сайт.ру/wp-cron.php?doing_wp_cron > /dev/null
Проблема в xmlrpc.php
В WordPress есть скрипт xmlrpc.php, он отвечает за вызов удаленных процедур и поддерживает известные API — WordPress API, Blogger API, MetaWeblog API и MovableType API. С помощью этого файла можно удаленно публиковать посты на своем сайте или полностью им управлять, не обязательно через административную панель. И как раз таки частые запросы к XMLRPC могут вызывать чудовищную нагрузку, что очень эксплуатируется на практике.
Если Вы вообще не используете в своей работе XMLRPC (а этого наверняка Вы не делаете), то можно просто удалить из корня своего сайта файл xmlrpc.php. А чтобы боты не грузили 404 страницу, в .htaccess добавляем редирект на microsoft.com (сервера у них хорошие):
redirect /xmlrpc.php http://www.microsoft.com
Проблема в wp-login.php
wp-login отвечает за авторизацию на сайте WordPress. Слишком частое к нему обращение, например, в целью подобрать пароль администратора, что осуществляется программно, вызывает сильную нагрузку. Избежать нагрузок можно, заменив это стандартное имя. Сделать это можно множеством способов, вот пример с плагином и без плагина.
Защита wp-login.php без плагина
в .htaccess добавляем:
<Files wp-login.php> Order Deny,Allow Deny from all </Files>
Файл wp-login.php, переименовываем в секретное имя, например cudanelza.php и внутри файла меняем все надписи wp-login.php на cudanelza.php.
Теперь у нас wp-login.php стал cudanelza.php
Защита wp-login.php с помощью плагина Lockdown WP Admin
Плагины - Добавить новый - ищем "Lockdown WP Admin". Ставим, активируем, переходим в настройки. Напротив "Yes, please hide WP Admin from the user when they aren't logged in" ставим галочку. В разделе WordPress Login URL прописываем новый адрес админки, например, "parapara". Сохраняем настройки. Теперь наша админка доступна по адресу http://сайт.ру/parapara
Проблема в sitemap
XML карту сайта в WordPress генерируют плагины. Но многие игнорируют тонкие настройки плагинов, в результате чего, в sitemap попадает различный технический мусор. В sitemap.xml генерируется коллосальное количество страниц, ненужных для индексации, но тем, не менее, предлагаемых для обхода роботами. В таких ситуациях роботы могут создать коллосальную нагрузку на сервер, постоянно выкачивая не нужные страницы.
Вот как выглядят дефолтные (по умолчанию) настройки XML карты сайта в плагине All in One SEO. В XML карту попадают все типы записей, которые там вообще не нужны:

Именно дефолтные настройки XML карты сайта были частой причиной нагрузки на сервер, вызываемой поисковыми ботами и пауками.
Данная проблема решается в несколько этапов:
1. Настройте sitemap.xml таким образом, чтобы сюда попадали исключительно ссылки на страницы/записи вашего сайта
2. В robots.txt пропишите директиву
Crawl-delay: 10
10 - это число в секундах - интервал, через который робот снова может посетить очередную страницу. На индексацию это не повлияет, но нагрузку снимет.
3. Блокируйте ненужных Вам роботов. В статье Крутой .htaccess вы найдете действенные методы блокировки ненужных ботов и пауков
Это не все, но тем не менее, наиболее распространенные ситуации в моей практике, когда WordPress создавал нагрузку на сервер. Как мы видели выше, не сам WordPress может создавать нагрузку, но и недоброжелатели, пытающиеся взломать, либо просто "повесить" Ваш сайт. Данные рекомендации будут актуальны в любом случае, не важно, у вас виртуальный или выделенный сервер. Естественно, большие проекты на WordPress требуют серьезных мощностей, развернуть серьезный сайт, не вызывающий нагрузок на виртуальном сервере - проблематично. Тут проще купить сервер или арендовать. Но и там без оптимизации WordPress не обойтись, особенно, если речь идет о высокопосещаемом сайте.
P.S. В WordPress имеются недостатки, которые рано или поздно могут привести к нагрузке на вашем сервере. Этими недостатками могут воспользоваться недоброжелатели, что чревато выходом за предоставленные хостингом лимиты. Надо быть готовыми к их устранению. Наиболее частые проблемы мы только что рассмотрели. Также в связи с этим напрашивается закономерный вопрос: почему озвученным аспектам так мало уделяют внимания разработчики WordPress? Это не проблема последних версий, а наиболее уязвимые места, которые передаются по наследству, от версии к версии! Разумеется, с помощью плагинов и обширного кодекса, WordPress можно адаптировать под практически любые нужды вебмастера, но вебмастерами зачастую выступают новички, поэтому хотелось бы видеть механизмы защиты обозначенных в этой статье проблем в дефолтных сборках WP. Тогда и взломов сайтов было бы меньше и нагрузок на серверах поубавилось!
Вячеслав, точно xmlrpc.php можно спокойно удалять? После обновления WP он не появится опять?
Появится! Поставьте редирект лучше:
Спасибо, Вячеслав!
Как правильно настроить sitemap.xml в плагине All in One SEO?
Со входом, кроме переименования любых упоминаний внутри самого файла wp-login.php больше нигде не требуется прописывать новое название этого файла?
- Можно не заморачиватся тонкими настройками, типа приоритета, частоты обновления и т.д. - все эти настройки можете оставить по умолчанию. Единственный пункт, на который здесь надо обратить внимание - Типы записей - поставьте галочки только на страницах, записях и возможно используемых вами произвольных полях (если они требуются для индекса)... Тонкие настройки данного модуля потянут на здоровенную статью
- Все же, я бы посоветовал реализовать защиту wp-login.php с помощью плагина Lockdown WP Admin. Плюсы очевидны: у вас ничего не слетит после обновления WordPress, в любой момент сможете сменить урл одним кликом и т.д.
Всё получилось, ещё спасибо огромное! Надеюсь теперь нагрузка немного снизится. Это же должно пресечь попытки входов, я правильно поняла? а то письма с заблокированными ip так и сыпятся.
Спасибо! Замечательный материал!
Вопрос один: а когда в .htaccess добавляем:
Order Deny,Allow
Deny from all
вместо wp-login.php пишем секретно название?
Вообще ничего не пишем, поскольку боты не знают ваш новый урл админки.