Re[2]: MemcachedGzip патч
Alex the Marrch Caat
marrch.caat at gmail.com
Sun Jul 26 13:53:34 MSD 2009
В общем, уважаемый All, вернее - та его часть, что заинтересована в
упомянутом патче! Обращаюсь к вам, можно сказать, за помощью.
По адресу http://narod.ru/disk/11284873000/ng-gzmemc-patch.tgz.html
лежит патч к nginx (базируется на последнем релизе - 0.8.6). Патч
предназначен для того, чтобы позволить nginx возвращать gzip-сжатые
данные напрямую из memcached (если клиент поддерживает gzip-сжатие)
или распаковывать их на лету - если не поддерживает.
Поведение патча управляется всего двумя новыми параметрами
конфигурации: memcached_gzip_flag и gunzip.
memcached_gzip_flag маска [default: 0]
Если данный параметр выставлен в 0, то контент отдается из memcached
"как есть", то есть как сейчас - патч не работает.
Если параметр установлен в любое ненулевое состояние, то он определяет
маску флагов, по которым nginx определяет, что данные в memcached были
сжаты. Если результат наложения маски на флаги, возвращенные
memcached, ненулевой - то данные трактуются как сжатые и возвращаются
клиенту с соотв. заголовком Content-Encoding, так же они помечаются
как сжатые, чтобы избежать повторного сжатия в модуле
http_gzip_filter. Для большинства клиентов memcached правильной маской
будет 2, хотя возможны и исключения - например, текущая версия
PECL:Memcached (1.0.0) использует 4-й бит (маска 16). Тж.см.
http://www.hjp.at/zettel/m/memcached_flags.rxml.
Данная функция - собственно, является основной в данном патче. Для ее
использования необходимы (и достаточны) файлы
http\ngx_http_core_module.h, http\ngx_http_core_module.c,
http\ngx_http_request.h и http\modules\ngx_http_memcached_module.c из
патча. Эта часть тщательнейшим образом протестирована мной, хотя я,
конечно, и не мог предусмотреть все возможные сценарии - но пока что
не вижу, что тут может не заработать.
gunzip on/off [default: off]
Если данная функция отключена, то при обнаружении в memcached сжатых
данных, если клиент не поддерживает gzip-сжатие - nginx трактует это
как то, что подходящие данные не найдены, и делает соотв. fallback
(в соответствии с конфигурацией). Если данная функция включена, то
nginx в такой ситуации попытается на лету распаковать данные и вернуть
их клиенту не сжатыми.
Данный функционал реализован в модуле http\modules\ngx_http_gzip_filter_module.c
К сожалению или к счастью, но за последнее время этот можуль был очень
существенно переработан, и портировать эту часть патча на версию 0.8.6
было попросту невозможно, мне пришлось тщательно разбираться в
функционировании данного модуля и по сути делать патч заново. И я
вполне мог что-то напортачить в процессе :( Поэтому я был бы крайне
благодарен, если бы кто-то более опытный, нежели я, в разбирательстве
с исходниками nginx, сделал review изменений в данном модуле -
подправил то, что должно быть подправлено, добавил то, что было
упущено, итд.
Патч можно использовать, дропнув данный файл и выставив gunzip off,
однако при этом клиенты, не поддерживающие gzip-сжатие, не будут
получать выигрыша от кэширования. Если в вашем случае таких клиентов —
существенная часть, то вам необходим также и пропатченый модуль
gzip_filter, за полноценную работоспособность которого я, увы, пока
что отвечать не могу.
Кроме того, для упрощения отладки изменен файл core/nginx.h так, что
изменилась сообщаемая сервером строка версии: вместо "nginx/0.8.6"
пишется "nginx+gzmemc/0.8.6". Это изменение, разумеется, не несет
никакой функциональной нагрузки и было сделано только чтобы проще было
отслеживать, какие сервера пропатчены. Вы можете смело дропнуть этот
файл при применении патча.
Я буду благодарен за любой feedback по данному патчу.
С уважением -
Alex, the Marrch Ca'at.
More information about the nginx-ru
mailing list