Ура! Нашел почему WordPress ложил сервер.


И так, были случаи когда сайт на вордпрессе без особой посещаемости, но достаточно большой по размеру (10 000 страниц) периодически вырубал в принципе не совсем дохлых ВДС. В чем причина не мог понять, пока не увидел в логах следующее:

POST /wp-cron.php?doing_wp_cron=1494319305.3046851158142089843750 HTTP/1.0" 500 273

Крон Вордпресса с периодичностью 5 секунд долбился на сайт навести там порядок. Долбился с внешнего сервера, а это значит, что на все про все ему давалось 60 секунд. Так как база очень большая, то за эти 60 секунд он это сделать не успевал и через 5 секунд новый крон накладывался на еще не доделанный старый и вот уже двойная нагрузка, а результата нет. Затем третий, четвертый и вот уже нагрузка растет в геометрической прогрессии. В результате сервер лежит.

Как лечится?

Нужно отрубить запуск крона с внешнего сервера. Для этого в конфигах  (wp-config.php) добавляем строчку

define(‘DISABLE_WP_CRON’, true);

Теперь извне крон запускать ни кто не будет. Но все же крон полезен и его запускать нужно. Для этого помещаем в свой серверный крон строку

php -f /home/user/web/site.ru/public_html/wp-cron.php?doing_wp_cron > /dev/null

Этот процесс будет запускаться уже без ограничений в 60 секунд на исполнение и будет завершен до конца как долго бы это не длилось.  Я поставил запуск этого процесса раз в сутки — думаю будет достаточно.

Добавляю еще один шаг в статью Подготовка движка WordPress под большие нагрузки.

Подготовка движка WordPress под большие нагрузки.


Если честно, Вордпресс немного недолюбливаю за его огромность. Так все удобно, да, но он слишком большой и если в него закинуть несколько тысяч страниц, то начинаются неприятности. Тормозит жутко. А если еще и плагинами приукрасить, то вообще вешалка.

С другой стороны Вордпресс по сути это уже default движок на рынке сайтов. Сайт на этом движке стоит дороже тупо за счет того, что он на этом движке. Можно разводить килознаки уникального текста, что это не правильно, а можно просто следовать тренду. Да и за счет тех же тормозных плагинов, например мне легко удалось привести школьный сайт к требования ГОСТ для инвалидов по зрению. Так что харе гундеть, будем приспосабливаться.

И так, задача сделать вордпресс менее прожорливым и способным работать с большим количеством страниц на дохлом вдс. Эта статейка больше написана для себя как инструкция действий, что бы при старте очередного проекта снова не бегать по сети и не вспоминать как же эта штука называется и как она настраивается. А именно так и случилось только что со словом редакция записи и кусочком кода

define('WP_POST_REVISIONS', 0 );
  1. Первое, что нужно сделать это отсечь роботов подборщиков паролей. Все они бесконечно долбятся к файлам wp-login.php и xmlrpc.php. Иногда эти боты сходят с ума и начинают долбиться до сотен раз в секунду, а это уже может положить сервер. Как их отсечь я писал тут. Но, что бы не бегать по ссылкам продублирую. В .htaccess добавляем следующие строки.
    <Files wp-login.php>
     order allow,deny
     deny from all
     </Files>
    <Files xmlrpc.php>
     order allow,deny
     deny from all
     </Files>

    Эти строки закрывают доступ к этим файлам. А сами заходим с переименованного и отредактированного wp-login

  2. Закрываем доступ всяким левым ботам. В идеале сайт должен быть доступен для индексации только ботам Яндекса и Гугла. Остальные если честно больше нагрузки дают чем трафа. Но тут дело вкуса. В тот же .htaccess добавляем
     RewriteCond %{HTTP_USER_AGENT} «.*coccoc\.com.*» [OR]
     RewriteCond %{HTTP_USER_AGENT} «.*AhrefsBot.*» [OR]
     RewriteCond %{HTTP_USER_AGENT} «.*Riddler*» [OR]
     RewriteCond %{HTTP_USER_AGENT} «.*MegaIndex\.ru/2\.0.*» [OR]
     RewriteCond %{HTTP_USER_AGENT} «.*rogerBot.*» [OR]
     RewriteCond %{HTTP_USER_AGENT} «.*MJ12bot.*» [OR]
     RewriteCond %{HTTP_USER_AGENT} «.*LinkpadBot.*»
     RewriteRule «.*» «-» [F]

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

  3. Дальше беспокоимся о размере базы данных с записями. Известно, чем меньше база данных, тем быстрее она работает. Поэтому отключаем хранение редакций записи. Все ваши исправления в статье Вордпресс тщательно хранит создавая тонны на мой взгляд мусора. Поэтому добавляем в файл wp-config.php эту строку.
    define('WP_POST_REVISIONS', 0 );

    Кстати если все таки история правок нужна, то можно вместо 0 выше поставить 1 или 2. Столько редакций будет храниться, но не десятки и сотни.

  4. Отключаем слишком частый и непродолжительный по времени работы запуск внутреннего крона ВордПресса с внешнего сервера.
    define('DISABLE_WP_CRON', true);

    И добавляем более редкий запуск, но без ограничения времени на выполнение скриптов крон со своего сервера.

    php -f /home/user/web/site.ru/public_html/wp-cron.php?doing_wp_cron > /dev/null
  5. А вот в этот пункт я бы хотел дописать Ваши рекомендации по разгону Вордпресс ибо мои познания на этом пока иссякли. Напишите в комментах, что еще нужно сделать с движком, что бы он летал и не кашлял.

Nofollow for external link или как закрыть все, кроме нужного.


Озадачился тут на днях необходимостью закрыть на сайте все внешние ссылки, кроме нужных мне. Задача думаю не нова, но я как то раньше с ней не сталкивался. Полез искать. Куча плагинов для Вордпресса, которые полностью автоматом все закрывают. Но не дают возможности оставить открытыми некоторые из них. Либо все либо ничего.

Из поиска всплыл плагин WP-NoRef, но видимо он на столько древний, что не совместим с нынешней версией WordPress и даже не ищется в списке плагинов. Но не буду долго томить — нашелся нужный и работающий плагин — Nofollow for external link.

Этот плагин тоже закрывает изначально все, но если ссылке вручную указать rel=»dofollow», то плагин rel=»nofollow» не ставит. Именно то, что мне и нужно.

Да и еще — с комментами плагин вообще жестко поступает. Вообще все ссылки вырезает напрочь. Ни ссылки на сайт автора, ни ссылок в комменте — все в текст! Спам не пройдет 🙂