Бортовой журнал Ктулху

Включение gzip-сжатия PHP Apache2

В жизни каждого мужчины наступает момент, когда трафик растёт и сервак умирает необходимо задуматься об оптимизации. В последнем дайджесте PHP (№ 40) была упомянута ссылкой статья "How GZIP Compression Works". Исходя из статистики, 56% веб-сайтов используют GZIP.

GZIP обеспечивает сжатие без потерь, т.е., исходные данные можно полностью восстановить при распаковке.

Является ли GZIP лучшим методом сжатия?

Нет, но существует несколько хороших причин использовать этот.

Во-первых, он обеспечивает хороший компромисс между скоростью и степенью сжатия. Сжатие и распаковка у GZIP происходят быстро и степень сжатия на высоком уровне.
Во-вторых, нелегко внедрить новый глобальный метод сжатия данных, который смогут использовать все. Браузерам потребуется обновление, что на сегодняшний день гораздо проще за счёт автообновления. Как бы то ни было, браузеры — не единственная проблема. Chromium пытался добавить поддержку BZIP2, более лучшего метода основанного на преобразовании Барроуза-Уилера, но от него пришлось отказаться, т.к. некоторые промежуточные прокси-серверы искажали данные, т.к. не могли распознать заголовки bzip2 и пытались обработать gzip контент.

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

Итак, для начала нужно установить необходимые пакеты.

apt-get install zlib1g

В php.ini добавляем (или проверяем, существуют ли) такие строки:

--------- PHP.INI ---------

output_handler = Off
zlib.output_compression = On
zlib.output_handler = ob_gzhandler

--------- /PHP.INI ---------

Возможно, этого будет достаточно, но если gzip не заработает, в .htaccess добавляем такие строки:

--------- .HTACCESS ---------

mod_gzip_on Yes
mod_gzip_dechunk Yes
mod_gzip_item_include file .(html?|txt|css|js|php|pl)$
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.*

--------- /.HTACCESS ---------

или/и

--------- .HTACCESS ---------

AddOutputFilterByType DEFLATE text/plain
AddOutputFilterByType DEFLATE text/html
AddOutputFilterByType DEFLATE text/xml
AddOutputFilterByType DEFLATE text/css
AddOutputFilterByType DEFLATE application/xml
AddOutputFilterByType DEFLATE application/xhtml+xml
AddOutputFilterByType DEFLATE application/rss+xml
AddOutputFilterByType DEFLATE application/javascript
AddOutputFilterByType DEFLATE application/x-javascript

--------- /.HTACCESS ---------

Обычно после этого gzip работает.

ce0b2e07c6

bc7cb192b2