мои модули и патчи для Nginx. максим дунин. зал 1

Preview:

DESCRIPTION

 

Citation preview

Мои модули и патчи для 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. Все три описанных патча периодически проскакивают в рассылке nginx-devel@nginx.org. Последний раз они замечены тут: 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/