Время чтения 11 минут

Добрый день, коллеги!

Когда-то я делилась с вами ситуацией, когда мой блог превысил все допустимые нагрузки на сервер и поэтому не смог функционировать некоторое время.

Менеджеры моего хостинга присылали мне неутешительные письма, что мой сайт создает непомерную нагрузку и предлагали перейти на другой, более дорогой тариф, либо вообще на выделенный сервер, что тоже недешево.

Отчего это произошло — от DDOS-атаки скорее всего, но эта ситуация заставила меня задуматься о некоторых вещах:

Как так оптимизировать сайт, чтобы максимально снизить нагрузку на сервер?

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

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

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

Но не спешите этого делать (хотя я уже была готова менять тариф), после того, как мы с вами проделаем несколько нехитрых операций по оптимизации шаблона, нагрузка на базу данных сократится в разы и вам не придется об этом больше беспокоиться. Зачем, как говорится, платить больше 

Как происходит нагрузка на базу данных?

При обращении к сайту, чтобы вызвать ту или иную функцию, система должна обратиться сначала к базе данных. Но в некоторых случаях это не совсем нужно, вернее — совсем не нужно. Например, чтобы показать иконку сайта зачем каждый раз при каждой загрузке обращаться к базе данных? Проще указать на иконку прямой путь и это немного, но ускорит работу сайта.

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

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

Как можно оптимизировать сайт?

Есть масса замечательных способов оптимизировать сайт:

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

Поскольку все сразу невозможно ни сделать, ни уложить в одну статью, сегодня давайте пока остановимся на блокировке ненужных ботов и на оптимизации шаблона

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

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

<?php echo get_num_queries(); ?> Запросов за <?php timer_stop(1); ?> cекунд.

У вас может отразиться код прямо на сайте внизу, в футере, у меня на лицевой стороне что-то не очень видно счетчика , и я захожу в Инструменты браузера — Посмотреть код страницы и в самом-самом низу вижу показатели:

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

Что считать нормой? По моим наблюдениям — до 100 запросов за менее, чем 1 секунду. Если у вас больше  какой-нибудь из показателей или сразу оба — есть над чем поработать.

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

Сначала определимся, какой сайт является главным, а какой — зеркалом. Я говорю о том, что ваш сайт доступен по двум адресам с www и без.

В интернете существует множество поисковых ботов и, к сожалению, не все они настолько «умные», как Яндекс и Google, которые «понимают», что это один и тот же сайт. Большинство других ботов будут считать эти сайты разные и сканировать каждый из них, таким образом создавая лишнюю нагрузку.

Как определить зеркало сайта?

Заходим по ссылке: http://webmaster.yandex.ru/check.xml?hostname=

Вебмастер Яндекс нам сообщает, что с www сайт является зеркалом, значит без www — главный. Сообщим об этом другим ботам.

Сделаем в файле .htaccess 301 редирект:

RewriteEngine on

RewriteCond %{HTTP_HOST} ^www.ваш домен$ [NC]

RewriteRule ^(.*)$ https://ваш домен/$1 [R=301,L]

 Не забудьте подставить в код свой домен! 

Таким образом, теперь уже все поисковые системы будут знать, что у вас главный сайт — без www, а с того будет осуществляться редирект.

Но бывает же и наоборот, когда главный сайт с www, тогда в файле .htaccess (он, кстати, находится в админ панели хостинга — Файловый менеджер — Ваш домен — папка public_html), пишем вот такое:

RewriteEngine on

RewriteCond %{HTTP_HOST} ^ваш домен$ [NC]

RewriteRule ^(.*)$ https://www.ваш домен/$1 [R=301,L]

!Замените слова ваш домен — на ваш домен  Вот и все, часть нагрузки мы сняли!

Небольшое дополнение. Когда вы узнали, какой из сайтов является главным, а какой — зеркалом, проверьте, чтобы в файле Robots.txt стоял именно главный сайт!

Теперь давайте исключим по именам абсолютно бесполезных ботов, толку от которых ноль, но которые действуют агрессивно, только мешают и создают лишнюю нагрузку на сервер

В том же файле .htaccess прописываем:

## Блокировка по USER AGENT:

RewriteCond %{HTTP_USER_AGENT} MJ12bot [OR]

RewriteCond %{HTTP_USER_AGENT} Java [OR]

RewriteCond %{HTTP_USER_AGENT} NjuiceBot [OR]

RewriteCond %{HTTP_USER_AGENT} Gigabot [OR]

RewriteCond %{HTTP_USER_AGENT} Baiduspider [OR]

RewriteCond %{HTTP_USER_AGENT} JS-Kit [OR]

RewriteCond %{HTTP_USER_AGENT} Voyager [OR]

RewriteCond %{HTTP_USER_AGENT} PostRank [OR]

RewriteCond %{HTTP_USER_AGENT} PycURL [OR]

RewriteCond %{HTTP_USER_AGENT} Aport [OR]

RewriteCond %{HTTP_USER_AGENT} ia_archiver [OR]

RewriteCond %{HTTP_USER_AGENT} DotBot [OR]

RewriteCond %{HTTP_USER_AGENT} SurveyBot [OR]

RewriteCond %{HTTP_USER_AGENT} larbin [OR]

RewriteCond %{HTTP_USER_AGENT} Butterfly [OR]

RewriteCond %{HTTP_USER_AGENT} libwww [OR]

RewriteCond %{HTTP_USER_AGENT} Wget [OR]

RewriteCond %{HTTP_USER_AGENT} SWeb [OR]

RewriteCond %{HTTP_USER_AGENT} LinkExchanger [OR]

RewriteCond %{HTTP_USER_AGENT} Soup [OR]

RewriteCond %{HTTP_USER_AGENT} WordPress [OR]

RewriteCond %{HTTP_USER_AGENT} PHP/ [OR]

RewriteCond %{HTTP_USER_AGENT} spbot [OR]

RewriteCond %{HTTP_USER_AGENT} MLBot [OR]

RewriteCond %{HTTP_USER_AGENT} InternetSeer [OR]

RewriteCond %{HTTP_USER_AGENT} FairShare [OR]

RewriteCond %{HTTP_USER_AGENT} Yeti [OR]

RewriteCond %{HTTP_USER_AGENT} Birubot [OR]

RewriteCond %{HTTP_USER_AGENT} YottosBot [OR]

RewriteCond %{HTTP_USER_AGENT} gold\ crawler [OR]

RewriteCond %{HTTP_USER_AGENT} Linguee [OR]

RewriteCond %{HTTP_USER_AGENT} Ezooms [OR]

RewriteCond %{HTTP_USER_AGENT} lwp-trivial [OR]

RewriteCond %{HTTP_USER_AGENT} Purebot [OR]

RewriteCond %{HTTP_USER_AGENT} User-Agent [OR]

RewriteCond %{HTTP_USER_AGENT} kmSearchBot [OR]

RewriteCond %{HTTP_USER_AGENT} SiteBot [OR]

RewriteCond %{HTTP_USER_AGENT} CamontSpider [OR]

RewriteCond %{HTTP_USER_AGENT} ptd-crawler [OR]

RewriteCond %{HTTP_USER_AGENT} HTTrack [OR]

RewriteCond %{HTTP_USER_AGENT} suggybot [OR]

RewriteCond %{HTTP_USER_AGENT} ttCrawler [OR]

RewriteCond %{HTTP_USER_AGENT} Nutch [OR]

RewriteCond %{HTTP_USER_AGENT} Zeus

RewriteRule ^(.*)$ – [F,L]

Можно также сделать блокировку по IP адресам, но это уже надо отслеживать эти адреса, наблюдать, когда идет нагрузка на сервер — какие ip адреса наиболее активные в это время.

Но самых «вредных» ботов мы устранили, давайте будем оптимизировать шаблон и снижать тем самым нагрузку на MySQL.

Как оптимизировать шаблон?

!Прежде всего рекомендую предварительно сделать копии всех файлов, в которых будете делать изменения. Малейшая досадная ошибка может привести к тому, что ваш сайт пропадет, тогда вернете все на место и попробуете снова.

Итак, первое, что можно изменить — это постоянное обращение к базе данных за такими параметрами, как тип контента и кодировка.

Мы прекрасно знаем, что тип нашего контента text/html, а кодировка UTF-8 (если у вас другая, поставьте свою) и поэтому находим в файле header.php (редактировать можно прямо из админ панели сайта — Внешний вид — Редактор-Заголовок) вот такие приблизительно строчки:

<meta http-equiv=”Content-Type” content=”<?php bloginfo(’html_type’); ?>; charset=<?php bloginfo(’charset’); ?>” />

и заменяем все это на:

<meta http-equiv=”Content-Type” content=”text/html; charset=UTF-8” />

Следующий пункт — убрать совсем строку, которая сообщает, что наш сайт сделан на WordPress. И зачем это нужно? Для взлома? Сносим такую строчку к такой-то бабушке  :

<meta name=”generator” content=”WordPress <?php bloginfo(’version’); ?>” />

Дальше, если вы используете иконку сайта, а большинство это делают, то у вас в хедере наверняка есть такие строчки:

<link rel="shortcut icon" type="image/ico" href="<?php bloginfo('template_directory'); ?>/favicon.ico" />

Это значит, что в поисках иконки система каждый раз обращается к базе данных. Тем самым притормаживая загрузку страницы. Сделаем такой код, который позволит добраться до иконки в десять раз быстрее:

<link rel="shortcut icon" type="image/ico" href="/favicon.ico" />

Иконку при этом положите в главную папку public_html 

Дальше система запрашивает у базы данных путь к стилям:

<link rel=”stylesheet” href=”<?php bloginfo(’stylesheet_url’); ?>” type=”text/css” media=”screen” />

Давайте сделаем этот путь покороче:

<link rel=”stylesheet” href=”/wp-content/themes/НАЗВАНИЕ_ВАШЕЙ_ТЕМЫ/style.css” type=”text/css” media=”screen” />

Дальше — запрос к RSS ленте фида (Федбернер):

<link rel=”alternate” type=”application/rss+xml” title=”<?php bloginfo(’name’); ?> RSS Feed” href=”<?php bloginfo(’rss2_url’); ?>” />

 <link rel=”pingback” href=”<?php bloginfo(’pingback_url’); ?>” />

На это место ставим вот это:

<link rel=”alternate” type=”application/rss+xml” title=”Название Вашего сайта или RSS фида” href=”http://feeds.feedburner.com/ИМЯ_ВАШЕГО_ФИДА/” />

 <link rel=“pingback” href=“http://АДРЕС_ВАШЕГО_САЙТ/xmlrpc.php” />

Можно еще оптимизировать название и описание вашего блога

Для этого строку:

<a href=”<?php echo get_settings(’home’); ?>/” ><?php bloginfo(’name’); ?></a>

заменим на:

<a href=”/” >НАЗВАНИЕ САЙТА</a>

И для описания, строку:

<div class=”description”><?php bloginfo(’description’); ?></div>

заменим на:

<div class=”description”>описание блога</div>

Таким образом, надеюсь, вам удалось оптимизировать свой сайт, сделать его быстрее. Мне пришлось это сделать, иначе мой сайт хостер бы вообще не выпустил в свет.

Другие способы оптимизации сайта мы еще рассмотрим, а пока на этом прощаюсь и желаю вам быть удачливее всех!