27
Мои модули и патчи для nginx Максим Дунин

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

  • Upload
    rit2011

  • View
    1.476

  • Download
    1

Embed Size (px)

DESCRIPTION

 

Citation preview

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

Мои модули и патчи для nginx

Максим Дунин

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

nginx – модульность • Без модулей – плохо

• Модульность:

– удобно развивать основной функционал

– легко решать специфические задачи

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

Модули бывают разные • nginx – 3-й в мире, 2-й в России* • много разного кода Совет: изучайте внимательно то, что собираетесь использовать. * http://openstat.ru/counter/trends

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

Модули • auth request

• bytes filter

• compose

• gunzip

• ip tos

• upstream keepalive

http://mdounin.ru/

Все модули – простые.

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

auth request Авторизация через подзапрос.

Если подзапрос вернул 200 – доступ разрешён, иначе – нет.

Что-то вроде fastcgi authorizers, ЕВПОЧЯ.

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

auth request • auth_pam, auth_ldap – блокируются

• X-Accel-Redirect – хорошо, но неудобно

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

auth request location /protected/ {

auth_request /auth;

...

}

location /auth {

proxy_pass ...

}

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

bytes filter Возврат отдельных диапозонов данных из ответа. Аналог range фильтра из стандартной поставки, но:

• Диапазоны не в заголовках, а непосредственно в аргументах запроса.

• Обычный ответ с кодом 200.

• Работает с любым потоком данных, в т.ч. от proxy.

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

bytes filter Использование:

location /store/ {

bytes on;

}

GET /store/file?bytes=0-999

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

bytes filter Аналог flv (работает поверх proxy):

location /video/ {

bytes on;

if ($args ~ "start=(\d+)") {

set $args "bytes=0-12,$1-";

}

}

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

compose filter Возвращает ответ от нескольких подзапросов, но позволяет указать Content-Length результата (и разрешает Range-запросы). Зачем? Вместе с bytes filter позволяет художественно вставлять в медиа-файлы другие медиа-файлы, сохраняя возможность докачки. Требует патчей: http://mdounin.ru/hg/nginx-compose/

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

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-

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

gunzip Разжимаем сжатые ответы на лету - если клиент не понимает gzip.

Понимают gzip - более 95%.

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

gunzip location / {

gunzip on;

proxy_pass ...

proxy_set_header Accept-Encoding gzip;

}

Экономим трафика к бекендам.

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

gunzip location / {

gunzip on;

gzip_static always;

}

Экономим диск и память под файловый кеш.

Нужен патч для gzip_static always.

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

gunzip location / {

gunzip on;

memcached_gzip_flag 2;

memcached_pass ...;

}

Экономим память в memcached. Нужен патч для memcached_gzip_flag.

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

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

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

ip tos Позволяет ставить IP TOS байт для ответов.

Потом можно лимитировать / приоритизировать трафик вашим любымым firewall'ом.

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

ip tos ip_tos 0x00;

location /video/ {

ip_tos 0x10;

}

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

upstream keepalive Поддержка постоянных соединений с бекендами.

Без патчей - хорошо работает

с memcached.

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

upstream keepalive upstream memd {

server 127.0.0.1:11211;

keepalive 10;

}

location / {

memcached_pass memd;

}

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

Почему нет keepalive'а с бекендами? • Типичное время генерации ответа бекендом - 20 ms (будем

верить в хорошее).

• Хорошее RTT до пользователя – 30 ms (ADSL). В среднем > 100 ms.

• На таком фоне установление соединения с бекендом обычно незаметно.

Вывод: нужно в специфических случаях.

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

Специфические случаи 1. Плохие бекенды, с высокой стоимостью

установления соединения. 2. "Далёкие" бекенды, с большим RTT до них. 3. Хорошие бекенды, отдающие ответ за < 1ms и

немного пакетов. Особенно если при этом реальный ответ собирается из большого количества подзапросов.

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

upstream keepalive В настоящий момент upstream keepalive умеет: 1. memcached 2. fastcgi (+ требуются патчи) 3. proxy unbuffered (+ Content-Length от бекенда) Мы работаем над улучшением ситуации.

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

Патчи 1. Багфиксы, багфиксы, багфиксы…

Для 1.0.0 - больше 20

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

Патчи 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

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

Вопросы?

Максим Дунин

http://mdounin.ru/