Доступен (http://mailman.nginx.org/pipermail/nginx-announce/2016/00017...) выпуск основной ветки высокопроизводительного HTTP-сервера nginx 1.9.11, в котором реализованы следующие изменения:
- Добавлена поддержка динамически загружаемых модулей (http://nginx.org/en/docs/ngx_core_module.html#load_module). Модуль оформляется в виде разделяемой библиотеки и загружается при помощи директивы load_module (например, "load_modulemodules/ngx_mail_module.so");
- В resolver (http://nginx.org/en/docs/http/ngx_http_core_module.html#reso...) добавлена поддержка отправки DNS-запросов с использованием протокола TCP;- Исправлена ошибка, из-за которой переменная $request_length не учитывала размер заголовков запроса при использовании HTTP/2;
- Исправлена ошибка в модуле ngx_http_v2_module.URL: http://mailman.nginx.org/pipermail/nginx-announce/2016/00017...
Новость: https://www.opennet.ru/opennews/art.shtml?num=43839
Ух, заживём! Сразу пробовать на ngx_brotli.
Да, динамический brotli прекрасно работает. Протестировано на https://zavedu.org/
Еще немного и хтаксес запилят
Ну да, про a patchy server все хором подумали при LoadModule...
Зато сколько было кривляний перед тем как запилить...
Скоро будет жирнее индейца ))
> Скоро будет жирнее индейца ))cherokee или apache?
> cherokee или apache?apache2
ещёбы создали бы репозиторий сторонних модулей с проверкой качества было бы хорошо, а то блин модсек текёт как лань
"течёт", позорище
граммарнаци?
> Добавлена поддержка динамически загружаемых модулей. Модуль оформляется
> в виде разделяемой библиотеки и загружается при помощи директивы
> load_module (например, "load_module modules/ngx_mail_module.so");И в каком месте он динамический, если его надо прописывать в конфиге и если он загружается в момент запуска? Или можно сделать что-нибудь типа "nginx -s load_module modules/foo.so"?
/etc/init.d/nginx upgradeну да
> /etc/init.d/nginx upgradeСпасибо тебе, мой анонимный друг.
Не совсем понятно, что именно происходит внутри инит-скрипта. Пришлось гуглить. Нашёл вот такое: http://nginx.org/en/docs/control.html#upgrade Там написано, что бинарник nginx аккуратно перегружается и заново читает конфиг.
Но вопрос остаётся: возможно ли подгрузить/выгрузить модуль без правки конфигов и перезапуска серванта.
Нет. У nginx'а динамически загружаемые в значении Dynamic linked, а не "подгружаемые в любой момент времени" - видимо издержки перевода.Но ты всегда можешь написать патч и отправить им, заодно обосновав нафига этот функционал нужен в веб-сервере, который можно если что и перезапустить.
> Но ты всегда можешь написать патч и отправить имМогу... Не не могу.
> нафига этот функционал нужен в веб-сервере, который можно если что и перезапустить.
А нафига модули нужны в ядре ОС, которое можно если что и перезапустить?
>> Но ты всегда можешь написать патч и отправить им
> Могу... Не не могу.Можешь купить nginx plus и заплатить за добавление такого функционала.
>> нафига этот функционал нужен в веб-сервере, который можно если что и перезапустить.
> А нафига модули нужны в ядре ОС, которое можно если что и
> перезапустить?Затем что веб-сервер перезапускается незаметно для пользователей за время меньше секунды, без разрыва соединений. Вот когда ОС можно будет перезагрузить за время меньше секунды без остановки пользовательского ПО и разрыва соединений - тогда и там можно будет поднять вопрос целесообразности загрузки модулей на лету.
Эта откуда такая инфа ? Без разрыва соединений....Чет графики коннектов говорят об обратном :)
Аноним правильно говорит. При upgrade запущенный инстанс сервера запускает ещё одну копию, но уже с новым конфигом, сам перестаёт принимать новые соединения, ждёт завершения всех установленных соединений и умирает. А новый инстанс с момента запуска начинает принимать и обрабатывать все новые соединения и не обращает никакого внимания на старый инстанс.Ни единого разрыва ©
> Эта откуда такая инфа ? Без разрыва соединений....
> Чет графики коннектов говорят об обратном :)Без разрыва уже установленных TCP соединений - не совсем верно, конечно.
Точнее будет сказать - аккуратно передав все LISTEN сокеты новому процессу.
То есть без ситуаций, когда 80 порт никто не слушает.
Магии никакой нет, просто аккуратное обращение с сокетами.
Инфа отсюда: http://nginx.org/ru/docs/control.html
> nginx аккуратно перегружается и заново читает конфигМастер-процесс nginx переносит новые входящие соединения на новый запущенный бинарь воркера, ожидает завершения соединений на старом воркере и его гробит.
>> nginx аккуратно перегружается и заново читает конфиг
> Мастер-процесс nginx переносит новые входящие соединения на новый запущенный бинарь воркера,
> ожидает завершения соединений на старом воркере и его гробит.Да. Поэтому я использовал слово "аккуратно".
> Не совсем понятно, что именно происходит внутри инит-скрипта. Пришлось гуглить.А почитать init-скрипт?
>> Не совсем понятно, что именно происходит внутри инит-скрипта. Пришлось гуглить.
> А почитать init-скрипт?Я сказал "не совсем понятно" исключительно из вежливости. У меня нет доступа к init-скриптам Анонима и мне, собственно, глубоко пофигу, что у него там написано. В убунтoвском инит-скрипте nginx-a я уже как-то натыкался на баг и с тех пор перегружаю вебсервер без него. Поэтому я хочел узнать, какой командой можно загружать/выгружать модули.
В том месте, что теперь вместо разных пакетов(скомпилированных с разным составом модулей):
nginx
nginx-full
nginx-extras
nginx-light
и т.д.можно будет сделать 1 единственный пакет, который заменяет их все:
nginx
А ненужные модули просто НЕ ПОДКЛЮЧАЮТСЯ при (ре)старте сервера
> В том месте, что теперь вместо разных пакетов(скомпилированных с разным составом модулей):
> можно будет сделать 1 единственный пакет, который заменяет их все:
> nginx
> А ненужные модули просто НЕ ПОДКЛЮЧАЮТСЯ при (ре)старте сервераЖдём n2ebable? Скорее бы.
Тебе смишно, а мейнтейнерам пакета с такой расширяемостью как у
nginx - слезы. Индеец в этом отношении действительно удобнее, сложно спорить.
Не это делает их динамическими.Я не хочу при старте/рестарте сервера. Я хочу динамически. Как из командной строки или из другой программы в произвольный момент времени загрузить/выгрузить произвольный модуль?
> Не это делает их динамическими.
> Я не хочу при старте/рестарте сервера. Я хочу динамически. Как из командной
> строки или из другой программы в произвольный момент времени загрузить/выгрузить произвольный
> модуль?Динамические в значении dynamic library, а не в значении "загружаю в произвольный момент".
Если хочется динамически в смысле без рестарта - патчи welcome или fork делай и пили там.
А что это тебе даст? Ну загрузил ты модуль, болтается он в памяти, дальше что? Неужели непонятно, что пользы от этого без правки конфига практически никакой нет. А если конфиг правишь, то тебе все равно придется сделать reload.
> А что это тебе даст? Ну загрузил ты модуль, болтается он в
> памяти, дальше что? Неужели непонятно, что пользы от этого без правки
> конфига практически никакой нет. А если конфиг правишь, то тебе все
> равно придется сделать reload.Именно потому, что нельзя изменить параметры работы веб-сервера без перегрузки (а reload это "аккуратная" перезагрузка без даунтайма), я и говорю, что модули не являются динамическими. Если бы можно было попросить веб-сервер заново прочитать конфиг (т.е. изменить параметры своей работы) на лету, совсем без перегрузки, то можно было бы ставить вопрос: "А можно изменить параметры работы веб-сервера без повторного прочтения конфигов?".
А так, да, в нынешней ситуации мой вопрос не имеет смысла.
не путайте понятие консоли управления и конфиг файл, это вам не циска
> И в каком месте он динамический, если его надо прописывать в конфиге
> и если он загружается в момент запуска? Или можно сделать что-нибудь
> типа "nginx -s load_module modules/foo.so"?Динамический он в том смысле, что слинкован динамически в виде отдельного .so файла, а не статически (внутри главного бинарника).
В тексте новости так и написано:
> Модуль оформляется в виде разделяемой библиотекиЕсли что, вот хорошее объяснение:
О разнице между динамическими и статическими библиотекам
http://www.amse.ru/courses/cpp2/2010_11_01_lib.htmlНе каждый сервис может подгружать so файлы "на лету".
Куда проще рестартануть сервис с новым списком библиотек.
В nginx и так все сделано для очень мягкого и незаметного рестарта.
Вторая хорошая новость за неделю. Что-то очень плохое теперь должно случиться
> Вторая хорошая новость за неделю. Что-то очень плохое теперь должно случитьсяуже случилось, обновление Java 8u74 :)
разве она не у вантузятников?
ElasticSearch, Cassandra, PrestoDB и остальная big-data лабудень…
> Вторая хорошая новость за неделю. Что-то очень плохое теперь должно случитьсяЧтобы не случилось ничего плохого, после хорошей новости следует совершить жертвоприношение айти-богам.
> Чтобы не случилось ничего плохого, после хорошей новости следует совершить жертвоприношение айти-богам.Ритуальный фулл-бэкап, шифрованный 8ью раундами 8Кбитным ключом, в полночь в полнолуние вокруг костра в /dev/null ! Через левое плечо со свитком GPLv3 в правой руке. //Да, спасибо, регулярно.
Модуль https://github.com/kvspb/nginx-auth-ldap тоже собирается для динамической загрузки, но только после правки config к виду http://pastebin.com/6deuf84h
> Модуль https://github.com/kvspb/nginx-auth-ldap тоже собирается для динамической загрузки,
> но только после правки config к виду http://pastebin.com/6deuf84hНормальные люди diff кладут, а не "к виду"
Нормальные люди говорят спасибо, а не нудят.
> Нормальные люди говорят спасибо, а не нудят.Спасибо. А можно diff получить? Ещё раз спасибо.
:-)
Пожалуйста: https://goo.gl/ZIfZB8
Или так:
--- config.orig 2016-02-11 09:36:55.932906200 +0500
+++ config 2016-02-11 09:41:05.000000000 +0500
@@ -1,14 +1,16 @@
ngx_addon_name=ngx_http_auth_ldap_module
-HTTP_MODULES="$HTTP_MODULES ngx_http_auth_ldap_module"
-NGX_ADDON_SRCS="$NGX_ADDON_SRCS $ngx_addon_dir/ngx_http_auth_ldap_module.c"
-CORE_LIBS="$CORE_LIBS -lldap"
+ngx_module_libs=-lldap
-case "$NGX_PLATFORM" in
- Darwin:*|FreeBSD:*|Linux:*|SunOS:*)
- CORE_LIBS="$CORE_LIBS -llber"
- ;;
-esac
-
-CFLAGS="$CFLAGS"
-CFLAGS="$CFLAGS"
+if [ $ngx_module_link = DYNAMIC ] ; then
+ ngx_module_name="ngx_http_auth_ldap_module"
+ ngx_module_srcs="$ngx_addon_dir/ngx_http_auth_ldap_module.c"
+ . auto/module
+elif [ $ngx_module_link = YES ] ; then
+ ngx_module_type=HTTP
+ ngx_module_name=ngx_http_auth_ldap_module
+ ngx_module_incs=
+ ngx_module_deps=
+ ngx_module_srcs="$ngx_addon_dir/ngx_http_auth_ldap_module.c"
+ . auto/module
+fi
Спасибо.Эй, юзер cadmi, барин жалует тебе ейный diff. Прямо с барского плеча. Кланяйся барину. Ну, или хотя бы скажи "спасибо". Как видишь, помогает.