Добрый день, коллеги!
Когда-то я делилась с вами ситуацией, когда мой блог превысил все допустимые нагрузки на сервер и поэтому не смог функционировать некоторое время.
Менеджеры моего хостинга присылали мне неутешительные письма, что мой сайт создает непомерную нагрузку и предлагали перейти на другой, более дорогой тариф, либо вообще на выделенный сервер, что тоже недешево.
Отчего это произошло — от 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>
Таким образом, надеюсь, вам удалось оптимизировать свой сайт, сделать его быстрее. Мне пришлось это сделать, иначе мой сайт хостер бы вообще не выпустил в свет.
Другие способы оптимизации сайта мы еще рассмотрим, а пока на этом прощаюсь и желаю вам быть удачливее всех!