Мои модули и патчи для nginx
Максим Дунин
nginx – модульность • Без модулей – плохо
• Модульность:
– удобно развивать основной функционал
– легко решать специфические задачи
Модули бывают разные • nginx – 3-й в мире, 2-й в России* • много разного кода Совет: изучайте внимательно то, что собираетесь использовать. * http://openstat.ru/counter/trends
Модули • auth request
• bytes filter
• compose
• gunzip
• ip tos
• upstream keepalive
http://mdounin.ru/
Все модули – простые.
auth request Авторизация через подзапрос.
Если подзапрос вернул 200 – доступ разрешён, иначе – нет.
Что-то вроде fastcgi authorizers, ЕВПОЧЯ.
auth request • auth_pam, auth_ldap – блокируются
• X-Accel-Redirect – хорошо, но неудобно
auth request location /protected/ {
auth_request /auth;
...
}
location /auth {
proxy_pass ...
}
bytes filter Возврат отдельных диапозонов данных из ответа. Аналог range фильтра из стандартной поставки, но:
• Диапазоны не в заголовках, а непосредственно в аргументах запроса.
• Обычный ответ с кодом 200.
• Работает с любым потоком данных, в т.ч. от proxy.
bytes filter Использование:
location /store/ {
bytes on;
}
GET /store/file?bytes=0-999
bytes filter Аналог flv (работает поверх proxy):
location /video/ {
bytes on;
if ($args ~ "start=(\d+)") {
set $args "bytes=0-12,$1-";
}
}
compose filter Возвращает ответ от нескольких подзапросов, но позволяет указать Content-Length результата (и разрешает Range-запросы). Зачем? Вместе с bytes filter позволяет художественно вставлять в медиа-файлы другие медиа-файлы, сохраняя возможность докачки. Требует патчей: http://mdounin.ru/hg/nginx-compose/
compose filter location /audio/ {
compose on;
proxy_pass ...;
}
location /data/ {
bytes on;
}
HTTP/1.1 200 OK
X-Compose-Length: 100500
X-Compose: /data/file1?bytes=0-999
X-Compose: /data/file2
X-Compose: /data/file1?bytes=1000-
gunzip Разжимаем сжатые ответы на лету - если клиент не понимает gzip.
Понимают gzip - более 95%.
gunzip location / {
gunzip on;
proxy_pass ...
proxy_set_header Accept-Encoding gzip;
}
Экономим трафика к бекендам.
gunzip location / {
gunzip on;
gzip_static always;
}
Экономим диск и память под файловый кеш.
Нужен патч для gzip_static always.
gunzip location / {
gunzip on;
memcached_gzip_flag 2;
memcached_pass ...;
}
Экономим память в memcached. Нужен патч для memcached_gzip_flag.
gunzip Бонус: патч для perl-модуля, чтобы разжимались сжатые ответы из embedded perl. Все три описанных патча периодически проскакивают в рассылке [email protected]. Последний раз они замечены тут: http://nginx.org/pipermail/nginx-devel/2011-February/000734.html http://nginx.org/pipermail/nginx-devel/2011-February/000735.html http://nginx.org/pipermail/nginx-devel/2011-February/000736.html
ip tos Позволяет ставить IP TOS байт для ответов.
Потом можно лимитировать / приоритизировать трафик вашим любымым firewall'ом.
ip tos ip_tos 0x00;
location /video/ {
ip_tos 0x10;
}
upstream keepalive Поддержка постоянных соединений с бекендами.
Без патчей - хорошо работает
с memcached.
upstream keepalive upstream memd {
server 127.0.0.1:11211;
keepalive 10;
}
location / {
memcached_pass memd;
}
Почему нет keepalive'а с бекендами? • Типичное время генерации ответа бекендом - 20 ms (будем
верить в хорошее).
• Хорошее RTT до пользователя – 30 ms (ADSL). В среднем > 100 ms.
• На таком фоне установление соединения с бекендом обычно незаметно.
Вывод: нужно в специфических случаях.
Специфические случаи 1. Плохие бекенды, с высокой стоимостью
установления соединения. 2. "Далёкие" бекенды, с большим RTT до них. 3. Хорошие бекенды, отдающие ответ за < 1ms и
немного пакетов. Особенно если при этом реальный ответ собирается из большого количества подзапросов.
upstream keepalive В настоящий момент upstream keepalive умеет: 1. memcached 2. fastcgi (+ требуются патчи) 3. proxy unbuffered (+ Content-Length от бекенда) Мы работаем над улучшением ситуации.
Патчи 1. Багфиксы, багфиксы, багфиксы…
Для 1.0.0 - больше 20
Патчи 1. Keepalive connections reuse – in 0.9.7+
2. Gunzip related patches:
– gzip_static always;
– memcached_gzip_flag 2;
– perl
3. Compose – патч для range-фильтра после подзапросов
4. Mail – поддержка SMTP pipelining
Вопросы?
Максим Дунин
http://mdounin.ru/
Top Related