Выбрать главу

ExpiresDefault "access plus 10 years"

# отключаем его для HTML-файлов

<FilesMatch .*\.(shtml|html|phtml|php)$>

ExpiresActive Off

</FilesMatch>

Конфигурация nginx 0.7+

Пример конфигурационного файла для одного виртуального сервера:

server {

#слушаем порт 80

listen 80;

#перечисляем через пробел имена этого сервера

server_name core.freewheel.ru:

#путь к корню сервера

root /my/path/to/core.freewheel.ru;

#пути к логам

access_log /my/path/to/core-access.log combined;

error_log /my/path/to/core-access.log info;

#подключаем шаблон настроек сервера, в нем самое интересное

include _servers_template;

#разрешаем себе посмотреть статус сервера

location = /nginx_status {

stub_status on;

access_log off;

allow 127.0.0.1;

deny all;

}

#включаем сжатие для тех браузеров, которые его понимают

gzip on;

#определяем минимальную версию протокола HTTP, для которой отдаем архивы

gzip_http_version 1.0;

#устанавливаем максимальный уровень сжатия

gzip_comp_level 9;

#разрешаем проксировать сжатые файлы

gzip_proxied any;

#и определяем типы файлов (все, которые хорошо сжимаются)

gzip_types text/plain text/css application/x-javascript text/xml application/xml application/xml+rss text/javascript image/x-icon;

}

А теперь собственно основной файл настроек (_servers_template), использующийся для всех виртуальных серверов в неизменном виде:

index index.php index.html;

location / {

# стили, скрипты и XML-файлы

location ~* ^.+\.(css|js|xml)$ {

# вот для этого и делались заранее архивированные .gz версии

# css и js файлов. Nginx не будет тратить время и сжимать их каждый раз

# заново, а просто отдаст уже готовые архивы, если браузер клиента может

# их принять

gzip_static on;

expires 1y;

}

# несуществующие файлы html и папки отправляем на бэкенд

if (!-e $request_filename ) {

rewrite ^/(.*)$ /index.php ;

}

# проксируем все запросы к PHP-файлам на FCGI бэкенд

location ~* \.php$ {

fastcgi_pass 127.0.0.1:9000;

fastcgi_index index.php;

include _fastcgi_params;

}

# картинки

location ~* ^.+\.(bmp|gif|jpg|jpeg|ico|png|swf|tiff)$ {

expires 1y;

}

# файлы

location ~* ^.+\.(bz2|dmg|gz|gzip|rar|tar|zip)$ {

expires 1y;

}

# другие статические файлы

location ~* ^.+\.(pdf|txt)$ {

expires 1y;

}

}

Обычно nginx собирается без модуля статического сжатия, поэтому при его сборке надо указать опцию --with-http_gzip_static_module — без этого gzip_static не заработает, и серверу придется сжимать файлы каждый раз заново. Также надо иметь в виду, что указанная конфигурация приведена для версии 0.7+.

Настройка IIS

В IIS включить сжатие достаточно просто: необходимо в диспетчере служб IIS зайти в свойства элемента «Веб-узлы» и перейти во вкладку «Служба».

Плюсы такого включения сжатия:

простота;

поддержка сжатия IIS статических файлов;

поддержка кэширования сжатых файлов;

не требует написания кода.

Минусы включения поддержки сжатия на сервере IIS:

во всех случаях решает сервер, и вы не будете знать, что, когда и как сжимается;

глобальное включение: сжатие включается для всей службы разом и будет влиять на все узлы или виртуальные каталоги вашего сервера (по крайне мере, через gui отключить сжатие у конкретного узла нельзя);

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

8.4. Разбор полетов

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

В Контакте ( http://vkontakte.ru/ ) является на данный момент (по числу просмотров страниц) наиболее посещаемым сайтом. Диаграмма загрузки внутренней страницы профиля выглядит примерно следующим образом:

Рис. 8.18. Результаты анализа загрузки внутренней страницы сайта vkontakte.ru

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

Двигаемся дальше: gzip. Для всех текстовых файлов (HTML, CSS, JavaScript) он включен. Это не может не радовать. Однако никакой минимизации для них не производилось. С точки зрения производительности это совсем не большая оплошность: при самой лучшей минимизации выиграть больше 5% от уже имеющегося сжатия крайне сложно. Для пользователей же это отразится в 10-50 мс загрузки.