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 мс загрузки.