Опубликован: 16.02.2009 | Уровень: специалист | Доступ: платный
Лекция 8:

Приложение

< Лекция 7 || Лекция 8: 1234567

Оптимизированные конфигурации

Конфигурация 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+.

< Лекция 7 || Лекция 8: 1234567
Дарья Билялова
Дарья Билялова
Россия
Елена Петрушевская
Елена Петрушевская
Россия, г. Нижневартовск