Россия, Сочи, РГПУ им. А.И.Герцена, 1997 |
Опубликован: 16.02.2009 | Уровень: специалист | Доступ: платный
Лекция 8:
Приложение
Оптимизированные конфигурации
Конфигурация Apache 1.3
<IfModule mod_gzip.c> # включаем gzip mod_gzip_on Yes # если рядом с запрашиваемым файлом есть сжатая версия с расширением .gz, то # будет отдана именно она, ресурсы CPU расходоваться не будут mod_gzip_can_negotiate Yes # используем при статическом архивировании расширение .gz mod_gzip_static_suffix .gz # выставляем заголовок Content-Encoding: gzip AddEncoding gzip .gz # выставляем минимальный размер для сжимаемого файла mod_gzip_minimum_file_size 1000 # и максимальный размер файла mod_gzip_maximum_file_size 500000 # выставляем максимальный размер файла, сжимаемого прямо в памяти mod_gzip_maximum_inmem_size 60000 # устанавливаем версию протокола, с которой будут отдаваться gzip-файлы # на клиент mod_gzip_min_http 1000 # исключаем известные проблемные случаи mod_gzip_item_exclude reqheader "User-agent: Mozilla/4.0[678]" mod_gzip_item_exclude reqheader "User-agent: Konqueror" # устанавливаем сжатие по умолчанию для файлов .html mod_gzip_item_include file \.html$ # включаем .css / .js файлы, подробнее о них ниже mod_gzip_item_include file \.js$ mod_gzip_item_include file \.css$ # дополнительно сжимаем другие текстовые файлы mod_gzip_item_include mime ^text/html$ mod_gzip_item_include mime ^text/plain$ mod_gzip_item_include mime ^httpd/unix-directory$ # отключаем сжатие для картинок (не дает никакого эффекта) mod_gzip_item_exclude mime ^image/ # отключаем 'Transfer-encoding: chunked' для gzip-файлов, чтобы # страница уходила на клиент одним куском mod_gzip_dechunk Yes # добавляем заголовок Vary для корректного распознавания браузеров, # находящихся за локальными прокси-серверами mod_gzip_send_vary On </IfModule> <IfModule mod_headers.c> # запрещаем прокси-серверам кэшировать у себя сжатые версии файлов <FilesMatch .*\.(js|css|html|txt)$> Header set Cache-Control: private </FilesMatch> </IfModule> <IfModule mod_expires.c> # включаем кэширование для всех файлов сроком на 10 лет ExpiresActive On ExpiresDefault "access plus 10 years" # отключаем его для HTML-файлов <FilesMatch .*\.(shtml|html|phtml|php)$> ExpiresActive Off </FilesMatch> </IfModule>
Конфигурация Apache 2
# выставляем заголовок Content-Encoding: gzip AddEncoding gzip .gz # с самого начала включаем gzip для текстовых файлов AddOutputFilterByType DEFLATE text/html AddOutputFilterByType DEFLATE text/xml # и для favicon.ico AddOutputFilterByType DEFLATE image/x-icon # также для CSS- и JavaScript-файлов AddOutputFilterByType DEFLATE text/css AddOutputFilterByType DEFLATE text/javascript AddOutputFilterByType DEFLATE application/x-javascript # далее устанавливаем максимальную степень сжатия (9) # и максимальный размер окна (15). Если сервер не такой мощный, # то уровень сжатия можно выставить в 1, размер файлов при этом # увеличивается примерно на 20%. DeflateCompressionLevel 9 DeflateWindowSize 15 # отключаем сжатие для тех браузеров, у которых проблемы с # его распознаванием: BrowserMatch ^Mozilla/4 gzip-only-text/html BrowserMatch ^Mozilla/4\.0[678] no-gzip BrowserMatch Konqueror no-gzip BrowserMatch \bMSIE !no-gzip !gzip-only-text/html # указываем прокси-серверам передавать заголовок User-Agent для # корректного распознавания сжатия Header append Vary User-Agent # запрещаем кэширование на уровне прокси-сервера для всех файлов, # для которых у нас выставлено сжатие, <FilesMatch .*\.(css|js|php|phtml|shtml|html|xml)$> Header append Cache-Control: private </FilesMatch> # включаем кэширование для всех файлов сроком на 10 лет ExpiresActive On 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+.