Nginx-ru mailing list archive (nginx-ru@sysoev.ru)
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re[2]: MemcachedGzip патч
- To: Eugene <nginx-ru@xxxxxxxxx>
- Subject: Re[2]: MemcachedGzip патч
- From: Alex the Marrch Caat <marrch.caat@xxxxxxxxx>
- Date: Sun, 26 Jul 2009 13:53:34 +0400
- Dkim-signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:received:received:date:from:reply-to:x-priority :message-id:to:subject:in-reply-to:references:mime-version :content-type:content-transfer-encoding; bh=n0AT33/ki6MccMJPaWt2HEcS+piQEsaD1wT9W/usjc0=; b=ZyJVzKWSE3y/t+XWYrXOGJlDtgpVELCuBG/2KbuH9rOuONdLZ+V8jplBysTM/mP2eO aouQHnDPnFbRcrm2teu1f7HBhK6vuyrp7HhopQM/psjbpNgpXM9hxZs+KsB1OWNWQG6O w4FIsNvZ1oSF/TLje1Jijpa0FbdDnnTKFlzaU=
- Domainkey-signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=date:from:reply-to:x-priority:message-id:to:subject:in-reply-to :references:mime-version:content-type:content-transfer-encoding; b=na3h1M/UhPLDSQDd3InHj6CaQRqGjSQMP3QKFegYcfPseLlG8l9lKsSsdy+nsXpflZ lUTISTR3ititQRCvAb3BP2lPCXm2EECju0g89BxNac3Wrx3clHVCAfEsNSfKHLIU0SBB gkQIK2Fk5qrFoAyHkmgmGW/2cIURdQKbgGRjw=
- In-reply-to: <200907232152.26792.JohnBat26@xxxxxxxxx>
- References: <e3ad6170907230736l3a822357k7a439ea9523ab4d8@xxxxxxxxxxxxxx> <200907232152.26792.JohnBat26@xxxxxxxxx>
В общем, уважаемый 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.
|