Ваше местоположение в сети:
Рубрика:
Путеводитель по интернету

Скорость сайта

Эта статья - в первую очередь для вебмастеров. Сегодня мы поговорим о том, как правильно настроить свой сайт чтобы он быстро загружался у пользователей. Начинающие вебмастера не обращают внимания на такой параметр как скорость сайта, а ведь это совершенно неправильно! Даже если у вас очень красивый сайт, но грузится он минуту, то найдется мало посетителей, готовых дождаться окончания загрузки. Да что там минуту, вот представьте простую ситуацию - вы вводите поисковый запрос, вам Google предложил десять сайтов. Вы щелкаете по первому - и ничего, страница пуста - секунда, две, пять... У вас хватит терпения? Скорей всего, вы возьмете и кликните по второй ссылке. Тем самым, как бы ваш сайт не был хорош и информативен, низкая скорость загрузки сайта - это потерянные посетители.

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

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

О каких проблемах мы поговорим сегодня? На повестке дня включение кэширования, архивирования и настройка apache (keep-alive, max-clients и подобное). А про уменьшение числа соединений путем технологий data:uri и image map мы поговорим в следующий раз.

Если заинтересовало, читаем дальше! Но для начала хочу продемонстрировать свой новый баннер, сделанный бесплатно компанией website4all:

Никто не хочет его у себя разместить?

Кэширование

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

У каждого объекта на сайте можно указать, разрешается ли его кэшировать и как долго можно хранить его, не обновляя. Все современные браузеры поддерживают технологию кэширования, так что дело - исклютельно за вебмастером - нужно включать кэширование. Необходимо только решить, что кэшировать, а что - нет. Главную страницу сайта, тексты статей я бы не предлагал кэшировать - причина заключается в том, что в противном случае пользователи могут вообще перестать видеть изменения на вашем сайте. А для картинок, скриптов и таблиц css я бы кэширование включал. Так или иначе, окончательное решение - за вебмастером, а я просто приведу необходимый код.

Header append Cache-Control "public"
FileETag MTime Size
ExpiresActive On
ExpiresDefault "access plus 0 minutes"
ExpiresByType image/ico "access plus 1 years"
ExpiresByType text/css "access plus 1 years"
ExpiresByType text/javascript "access plus 1 years"
ExpiresByType image/gif "access plus 1 years"
ExpiresByType image/jpg "access plus 1 years"
ExpiresByType image/jpeg "access plus 1 years"
ExpiresByType image/bmp "access plus 1 years"
ExpiresByType image/png "access plus 1 years"

Да, чуть не забыл. Я молчаливо предполагаю, что вы используете самый популярный веб-сервер apache. Вставлять код нужно в файл .htaccess в корневой директории сайта, нужно также убедиться, что у сервера включен модуль mod_expires.

Типы вы можете уже выбирать самостоятельно и настраивать, что кэшировать, а что - нет. access plus 0 minutes означает, что файл кэшироваться не будет.

Архивирование

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

А пользователь, в общем-то, и не знает, что скачивает сжатые файлы. Все это спрятано от глаз и происходит за кадром. Итак, включаем gzip

Header append Vary "Accept-Encoding"
mod_gzip_on Yes
mod_gzip_dechunk Yes
mod_gzip_item_include file \.(html?|txt|css|js|php|pl)$
mod_gzip_item_exclude file \.(jpg|png|gif)$
mod_gzip_item_include handler ^cgi-script$
mod_gzip_item_include mime ^text/.*
mod_gzip_item_include mime ^application/x-javascript.*
mod_gzip_item_exclude mime ^image/.*
mod_gzip_item_exclude rspheader ^Content-Encoding:.*gzip.*
mod_gzip_maximum_file_size 100000
mod_gzip_minimum_file_size 300
mod_gzip_maximum_inmem_size 100000

Опять-таки, нужно убедиться, что включен соответствующий модуль apache - mod_gzip. Я указал, какие типы файлов сжимать, а какие-нет. Картинки сжимать бесполезно, будет только лишняя нагрузка на сервер, а реально объем не уменьшится. Кроме того, я указываю, что не нужно сжимать уже сжатые файлы, слишком маленькие файлы и слишком большие файлы.

Но это еще не все. Скрипты и стилевые файлы сжимать нужно, но зачем же их сжимать каждый раз? Лучше заготовить сжатые файлы на сервере заранее и отдавать их, если браузер поддерживает архивирование. Делается это так:

<FilesMatch "\.js.gz$">
ForceType text/javascript
Header set Content-Encoding: gzip
</FilesMatch>
<FilesMatch "\.css.gz$">
ForceType text/css
Header set Content-Encoding: gzip
</FilesMatch>
<FilesMatch "\.js$">
ForceType text/javascript
RewriteEngine On
RewriteCond %{HTTP_USER_AGENT} !".*Safari.*"
RewriteCond %{HTTP:Accept-Encoding} gzip
RewriteCond %{REQUEST_FILENAME}.gz -f
RewriteRule (.*)\.js$ $1\.js.gz [L]
ForceType text/javascript
</FilesMatch>
<FilesMatch "\.css$">
ForceType text/css
RewriteEngine On
RewriteCond %{HTTP_USER_AGENT} !".*Safari.*"
RewriteCond %{HTTP:Accept-Encoding} gzip
RewriteCond %{REQUEST_FILENAME}.gz -f
RewriteRule (.*)\.css$ $1\.css.gz [L]
ForceType text/css
</FilesMatch>

Теперь необходимо еще убедиться и в том, что на сервере включен mod_rewrite. Поясню происходящее. Во-первых, мы говорим, что файлы типа js.gz и css.gz уже сжаты (чтобы избежать повторного сжатия). Во-вторых, обычные js и css мы будем подменять сжатыми, если браузер поддерживает сжатие. При этом упоминается одна версия safari, которой все равно будут передаваться несжатые файлы - этот бразер утверждает, что сжатые файлы понимает, но на самом деле работает с ними неправильно.

Настройка Apache

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

Сервер Apache запускает несколько своих копий (дочерних процессов). Каждая копия готова обрабатывать входящие соединения. Тем самым, работа сервера очень сильно зависит от того, сколько у вас дочерних процессов и сколько запросов внутри одного соединения готов обработать дочерний процесс. За первое отвечают такие параметры как MinSpareServers, MaxSpareServers и MaxClients. MaxClients - этот лимит на число дочерних процессов. Как его расчитать? Нужно знать, сколько у вас оперативной памяти на хостинге (посмотрите в параметрах), сколько памяти забирает один процесс (если вы можете соединиться с сервером по ssh, то наберите команду top и посмотрите в колонке RES; типичное значение: 10-15 мегабайт), разделить первое на второе и вычесть 1 или 2 (1 для основного процесса и плюс запас). MinSpareServers и MaxSpareServers отвечают за то, сколько дочерних процессов может бездействовать. Дело в том, что если свободных процессов нет, а вдруг у сервера что-то запросили, то задержка может быть вызвана запуском процесса. Я использую для них значения 5 и 10 соответственно.

Теперь про запросы, выполняемые в рамках одного соединения с одним дочерним процессом. Для ускорения загрузки сайта полезно сделать так чтобы один процесс мог обрабатывать несколько запросов подряд. Для настройки используются параметры KeepAlive и KeepAliveTimeout. Первый нужно ставить "on" чтобы вообще включить KeepAlive, второй же означает количество секунд, которые сервер будет ждать новых запросов, не разрывая соединения. Думаю, секунд 10-15 будет в самый раз. Только имейте в виду, что если процесс находится в состоянии KeepAlive, то он не может принимать новые соединения. Так что при включенном KeepAlive ваш сервер не сможет одновременно обработать больше клиентов, чем количество дочерних процессов (MaxClients).

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

Итак, получаем такой код:

KeepAlive "on"
MaxClients 20
MinSpareServers 5
MaxSpareServers 10
MaxRequestsPerChild 10000

Внимание: этот код нужно вставлять не в .htaccess, а в конфигурационный файл apache. И не забудьте подобрать свое значение MaxClients! Удачной оптимизации!

Проверить свои настройки вы можете, например, сервисом site-perf.com. Проверьте свой сайт, и вы получите диаграмму загрузки сайта. Если у вас получается много длинных желтых частей - то это плохо. Такое означает, что клиент получает запрос, соединяется, а вот данные ему никто некоторое время не дает.

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

Дата: 23 декабря 2009 г., категория: для вебмастеров.

Хотите знать все об интертете?

Введите свой адрес электронной почты чтобы подписаться на обновления!


Уже 552 постоянных читателя! Присоединяйтесь!


Доставляется при помощи FeedBurner. Никакого спама. Всегда можно отписаться!

Что-то непонятно или не получается?
Оставьте свои пожелания или вопрос в виде комментария к статье. Информация о новых комментариях сразу приходит ко мне на почту, и я постараюсь ответить на ваш вопрос как можно скорее!

Есть вопрос по схожей теме?
Попробуйте поискать по сайту (форма поиска находится наверху страницы). Кроме того, можно задать мне вопрос через форму обратной связи.

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

← Форматы изображенийБыстрый сайт →

Комментарии

1#

Never Lex
23 декабря 2009 г. 10:23:49

Спасибо! Статья очень в тему! То есть можно gzip и кеширование включить прямо в .хтаксесс файле???
 

2#

Sander
23 декабря 2009 г. 10:26:42

Да. Первые два совета выполнимы всегда - достаточно использовать htaccess
Последний требует более полный доступ к настройкам сервера.
 

3#

Never Lex
23 декабря 2009 г. 10:28:09

Всё таки в Опере нельзя залогиниться. Точнее логин вроде как происходит, но толку нуль. А через ФФ всё ок работает.
 

4#

Mr.Visor
23 декабря 2009 г. 10:29:15

Есть один вопрос и одно пожелание.
Работает ли архивирование вместе с кэшированием? Я в темы кэширования и архивирования не углублялся, но тут (http://b23.ru/szwv) написано, что это два взаимоисключающих процесса.

Теперь пожелание.
Напишите про оптимизацию css и js файлов, т.к. порой люди забывают про их оптимизацию.
 

5#

Sander
23 декабря 2009 г. 10:36:13

Mr Visor - я там отписался. Не знаю, откуда информация о том, что они не работают одновременно. По мне - так работают, я потом разными сервисами блог проверял.
Хотя бы вышеупомянутым site-perf или webo.in - всегда можно посмотреть, что получается при первой и при повторных загрузках.
Оптимизация css и js - спасибо за тему, надо будет и до нее добраться!

Never Lex
Ну, похоже, мне придется в конце концов отказаться от GFC и перейти на банальные логины Google. Но пока нет на это времени.
 

6#

Ян
23 декабря 2009 г. 18:53:09

При авторизации нашел глюк - при выборе аватара на загруженной картинке можно выбрать область, но масштабировать ее нельзя.
Баннер я конечно же хочу разместить. За $25 :)
 

7#

Sander
23 декабря 2009 г. 22:41:56

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

8#

Елена
24 декабря 2009 г. 14:34:53

Автор, спасибо за полезную информацию!

если возможно, опишите технические подробности взаимодействия клиента-сервера если часть объектов кешируются

а также если в определенные момент кешируемый объект (например какая-то картинка) убирается из сайта. Мы получаем обновленную информацию Почему? Как об обновлении узнает клиент ( браузер)?
 

9#

Sander
24 декабря 2009 г. 15:11:57

Елена, происходит это примерно так: клиент посылает серверу запрос "пришли заголовки этого файла", сервер присылает заголовки, содержащие информацию о том, что кэшировать можно, как надолго, и что является идентификатором файла (FileETag MTime Size означает, что запоминаются размер и время). Соответственно при повторном запросе перепроверяются заголовки, и если не прошло время, а идентификатор не изменился - сами данные с сервера не скачиваются.
 

10#

Stan
24 декабря 2009 г. 16:02:17

Читал, что при помощи модуля mod_gzip неумелый вэбмастер может довольно сильно нагрузить сервак. К огромному сожалению эту же самую информацию читал и мой хостинг-провайдер. В результате я оказался лишенным возможности использовать данный модуль. К счастью осталась возможность использовать библиотеку zlib. Довольно нормально работает, не хуже, чем mod_gzip. А так статья в целом понравилась, особенно раздел про кэширование.
 

11#

Наблюдатель
26 декабря 2009 г. 00:45:30

Хотел бы разместить у себя Ваш баннер. Пробовал оставить сообщение через форму обратной связи в Контактах, но ни в одном браузере не отображается картинка с проверочным кодом (F5 нипричем). Как мы можем с Вами связаться?
 

12#

Sander
26 декабря 2009 г. 10:28:40

Наблюдатель, ответил по почте. А контактную форму надо будет починить, спасибо!
 

13#

CoolSeoMan
26 декабря 2009 г. 14:54:51

Статья просто супер, давно искал что-то подобное. У меня появился к вам вопрос по методу сжатия gzip. Если я вставляю ваш код, то у меня появляется ошибка 500. С чем это связано. Нашел на другом сайте другой код:
<ifModule mod_gzip.c>
mod_gzip_on Yes
mod_gzip_dechunk Yes
mod_gzip_item_include file \.(html?|txt|css|js|php)$
mod_gzip_item_include handler ^cgi-script$
mod_gzip_item_include mime ^text/.*
mod_gzip_item_include mime ^application/x-javascript.*
mod_gzip_item_exclude mime ^image/.*
mod_gzip_item_exclude rspheader ^Content-Encoding:.*gzip.*
</ifModule>

Он вроде работает и нет ошибок, а почему ваш не выдает ошибку? Может вы где ошиблись? И еще один вопрос. У меня на сайте помимо html и php файлов есть страницы shtml. Как их включить в архивирование gzip? Заранее спасибо, за ответ на мой вопрос.
 

14#

Sander
26 декабря 2009 г. 15:12:35

Мой код содержит больше настроек + включает статическое кэширование для css и js.
А не работает он потому, что у вас не включен mod_gzip
Приведенный же вами код "работает" потому что в него вставлено условие <ifModule mod_gzip.c>, но только раз у вас mod_gzip выключен, то условие не выполняется и код реально ничего не делает.
 

15#

CoolSeoMan
26 декабря 2009 г. 15:16:43

Sander, а как проверить работает он или нет. Где это можно посмотреть. И если он отключен, его можно включить самостоятельно или через тех.поддержку хостинга.

И будет ли он работать, если у меня сайт на shtml? Или нужно что-то исправлять в коде.
 

16#

Sander
26 декабря 2009 г. 15:44:12

CoolSeoMan,
- проверить, работает ли сжатие, можно, например, через site-perf - в списке ресурсов, в колонке "процент сжатия"
- включить mod_gzip чаще всего можно в админке хостинга - список модулей apache
- shtml, думаю, роли не играет, сжатие происходит независимо от генерации контента
 

17#

CoolSeoMan
28 декабря 2009 г. 14:16:16

Сандер, спрашивал у сисадминов хостинга, функция мод_гзип на сервере включена. Но при попытке добавить код в хтакесс, он выдает ошибку 500 Добавлял выше указанный код: Header append Vary "Accept-Encoding"
mod_gzip_on Yes
mod_gzip_dechunk Yes
mod_gzip_item_include file \.(html?|txt|css|js|php|pl)$
mod_gzip_item_exclude file \.(jpg|png|gif)$
mod_gzip_item_include handler ^cgi-script$
mod_gzip_item_include mime ^text/.*
mod_gzip_item_include mime ^application/x-javascript.*
mod_gzip_item_exclude mime ^image/.*
mod_gzip_item_exclude rspheader ^Content-Encoding:.*gzip.*
mod_gzip_maximum_file_size 100000
mod_gzip_minimum_file_size 300
mod_gzip_maximum_inmem_size 100000

Как вы думаете, в чем может быть ошибка.
P.S. Может напишите на почту вашу аську, я вам все подробнее расскажу. В замен на вашу помощь. В замен могу предложить денюшку или постовой (отдельный пост) с моего блога.
 

18#

Sander
28 декабря 2009 г. 18:38:50

хмм а если добавить вначале
AddEncoding gzip .gz
ася моя 342035917
 

19#

Sander
28 декабря 2009 г. 18:58:30

CoolSeoMan, а если все-таки посмотреть в админке хостинга? mod_gzip может быть глобально включен, а у вас выключен.
 

20#

Sander
2 января 2010 г. 11:58:34

Забыл добавить, что нужно еще включить headers_module
 

21#

R_G
2 января 2010 г. 16:45:26

Действительно большое спасибо! Занимаюсь оптимизацией скорости загрузки сайта. Раньше все не мог зацепиться за кеширование для Apache - не хватало знаний. Файлы .htaccess раньше видел, но и понятия не было для чего они нужны. Теперь благодаря этой статье появились зацепки и мысли.
Спасибо!
 

22#

Smak13
16 января 2010 г. 11:00:43

Отличная статья. Последнее время занимаюсь разгоном и много чего перечитал. Тут всё по пунктамЮ ясно изложено. Класс! Особенно понравилось про параллельные загрузки. Впервые встретил. Лично у меня "желтые столбы" длинные и ява-скрипты тормозят загрузку. Короче, есть куда стремиться...
 

23#

Alex
24 февраля 2010 г. 00:10:19

Напишите пожалуйста, как включить этот headers_module иначе Ваш код не работает.
 

24#

Sander
24 февраля 2010 г. 00:57:56

Alex, это зависит от вашего хостинга.
Если есть прямой доступ к конфигурационному файлу apache, то можно добавить в него строчки "LoadModule headers_module etc/apache/libexec/mod_headers.so" и "AddModule mod_headers.c" (путь по аналогии с остальными модулями).
Но чаще это делается где-то через админку хостинга.
Если же совсем нет прав, то нужно писать в поддержку хостинга и просить его включить.
 

25#

Alex
25 февраля 2010 г. 22:32:07

Спасибо за ответ.

Доступа к конф.файлу апача нет, в админке не нашёл где включить, написал хостеру. Вот их ответ:

Такой модуль присутствует на сервере, он включен. Управляется через .htaccess. Если не знаете как его включить обратитесь к документации Apache.
 

26#

Sander
25 февраля 2010 г. 23:16:39

Так. Модуль через .htaccess включить нельзя, можно только использовать, что мой код и делать.
Если сервер возвращает ошибку 500, то это означает, что нет какого-то модуля. В моем случае были использованы mod_rewrite, mod_headers, mod_expires и mod_gzip. Если без моего кода все работало, а с ним - ошибка 500, то это означает, что одного из этих модулей нет, что бы ни говорили хостеры. Какого именно? Это можно выяснить, добавляя куски кода понемногу.
 

27#

Alex
26 февраля 2010 г. 21:38:45

У меня оказывается нет gzip

есть только zlib напишите пожалуйста как при помощи zlib настроить архивирование
 

28#

Sander
26 февраля 2010 г. 21:52:08

Ну это вообще не так просто и настраивается в каждом случае индивидуально. Дело в том, что zlib - это не модуль Apache, а модуль php. Соответственно нужно смотреть, вообще какие php скрипты вызываются и в них внедряться...
 

29#

Alex
26 февраля 2010 г. 22:13:45

Вот блин, обидно, просто выше тут писали, что воспользовались zlib вместо gzip вот я и думал, что это не так сложно.
Жаль.
 

У вас есть вопрос не по теме статьи?
Нужна компьютерная помощь?
Задайте свой вопроc
на нашем новом проекте!

Подписаться на: комментарии к статье (rss), комментарии к статье (e-mail)

[*] Авторизоваться при помощи профиля Google (и не только)
Самые активные участники сайта:

Хотите разместить здесь свою аватарку? Авторизуйтесь, загружайте картинку и комментируйте!
Имя:

E-mail (если хотите подписаться на комментарии):

Сайт (не обязательно):

Я - робот! (снимите галочку, если это не так)
Для блоггеров: если вы хотите чтобы ваша ссылка индексировалась поисковыми системами, вам нужно авторизоваться при помощи Google Friend Connect и написать осмысленный комментарий по теме. В таком случае я переведу ваш аккаунт в разряд "trusted". Комментарии пользователей с проверенным аккаунтом не попадают на модерацию, ссылки индексируются, а рядом с ником стоит значок с зеленой галочкой. Да, модерацию могут пройти только ссылки IT-тематики! Внимание: если вы не авторизуетесь, я не смогу сделать вашу ссылку активной даже если мне понравятся ресурс и комментарий!
Комментарий:

Подписаться на  комментарии к статье (rss), комментарии к статье (e-mail)

У вас есть вопрос не по теме статьи?
Нужна компьютерная помощь?
Задайте свой вопроc
на нашем новом проекте!