Как стать автором
Обновить

Комментарии 45

Известно что вы ненавидите Windows и её пользователей, из-за чего не поддерживаете больше одного worker'а и ввели лимит на 1024 соединения. Нет ли у вас планов перестать ненавидеть пользователей Windows и убрать искусственный лимит числа соединений?
По-моему здесь публиковалась статья, в которой раскрывалась причина 1го воркера, если мне не изменяет память связанного с блокировками i/o. И там же автор делал большую доработку ядра, чтобы обойти это ограничение.
Так ведь в моём комментарии ссылка именно на эту статью. Там же про искусственность ограничения в 1024 соединения написано.
Какими блокировками? На IOCP чуть ли не лучшая реализация асинхронности для сокетов делается. Тут как раз была статья разработчика nginx, который ничего про IOCP не знает и не хочет.
Только чтобы использовать преимущества этой чуть ли не лучшей реализации, архитектура приложения должна быть изначально заточена именно под нее. А это будет уже совсем другой продукт. Лучше иметь действительно хороший сервер под POSIX системы, чем так себе, но универсальный. Другой вопрос — почему до сих пор нет чего-либо подобного nginx, изначально написанного под Windows, но это уже совсем другая история…

Почему же нет? Есть, IIS называется.

Я бы IIS сопоставлял скорее с apache, а не с nginx. Хотя мое тесное общение с IIS остановилось на уровне 2003 сервера.

IIS не похож ни на Apache, ни на nginx. Совершенно другой принцип как конфигурации, так и работы с сетью.

Согласен, но я говорил не про похожесть, а про позиционирование продукта. Хотя, для меня лично, IIS и apache были похожи тем, что могли взаимодействовать с пользовательскими расширениями по ISAPI.
Ну не так уж сильно он от kqueue отличается, на мой взгляд.

Serge78rus Kestrel?


Лучше иметь действительно хороший сервер под POSIX системы, чем так себе, но универсальный.

Да почему "или-или"? Ребята справляются.

Ребята, конечно, справляются. Огромное спасибо им за это. Но давайте взглянем на их труд, так сказать, вооруженным взглядом (sloccount). Вот результаты по директориям проекта:

src/

Total Physical Source Lines of Code (SLOC) = 1,522
Development Effort Estimate, Person-Years (Person-Months) = 0.31 (3.73)
(Basic COCOMO model, Person-Months = 2.4 * (KSLOC**1.05))
Schedule Estimate, Years (Months) = 0.34 (4.12)
(Basic COCOMO model, Months = 2.5 * (person-months**0.38))
Estimated Average Number of Developers (Effort/Schedule) = 0.90
Total Estimated Cost to Develop = $ 41,993

src/unix

Total Physical Source Lines of Code (SLOC) = 13,355
Development Effort Estimate, Person-Years (Person-Months) = 3.04 (36.49)
(Basic COCOMO model, Person-Months = 2.4 * (KSLOC**1.05))
Schedule Estimate, Years (Months) = 0.82 (9.81)
(Basic COCOMO model, Months = 2.5 * (person-months**0.38))
Estimated Average Number of Developers (Effort/Schedule) = 3.72
Total Estimated Cost to Develop = $ 410,741

src/win

Total Physical Source Lines of Code (SLOC) = 16,774
Development Effort Estimate, Person-Years (Person-Months) = 3.86 (46.35)
(Basic COCOMO model, Person-Months = 2.4 * (KSLOC**1.05))
Schedule Estimate, Years (Months) = 0.90 (10.74)
(Basic COCOMO model, Months = 2.5 * (person-months**0.38))
Estimated Average Number of Developers (Effort/Schedule) = 4.32
Total Estimated Cost to Develop = $ 521,807

То есть большая часть кода для платформ unix и win не пересекается. О чем я и пытался сказать в своем комментарии.

Ок, не пересекается. Но теперь можно взять эту либу (написанную один раз) и использовать. Это ничем не отличается от написания своих врапперов. Собственно это оно и есть. Просто системы довольно сильно отличаются. Но суть та же.


А вообще я отвечал на кусок


Другой вопрос — почему до сих пор нет чего-либо подобного nginx, изначально написанного под Windows, но это уже совсем другая история…

Он есть. Точнее, под libuv, но зачем писать что-то под платформу, когда можно писать кроссплатформенно, не теряя ничего.

А я сейчас отвечал на
Да почему «или-или»? Ребята справляются.

Что там пересекается или нет — деталь реализации. Раз есть удобный и быстрый интерфейс для кроссплатформенной работы, грех им не пользоваться.

Да я с Вами согласен, сам довольно часто пользуюсь кроссплатформенной библиотекой POCO. Но изначальная статья об nginx, а он написан не поверх libuv, и заставить его работать под Windows так же, как и под Linux — это переписать с нуля с кучей #ifdef и прочей подобной «радости»
НЛО прилетело и опубликовало эту надпись здесь
НЛО прилетело и опубликовало эту надпись здесь
Что же касается скорости — далеко не факт.
Если мне потребуется ускорить какой то оч нужный мне сценарий работы то я могу у себя сделать что угодно, а вот с такой либой я ничего сделать не смогу.

Тогда по заветам Алана Кея и железо под себя делать надо :) А то там подкрутить в процессоре чужом тоже ничего не получится.
Учитывая бенчи майкрософта вполне на уровне nginx работает kestrel на базе как раз libuv. Что на линуксах, что на винде. Ну и в плане мейнейнерства майкрософт вряд ли вложился бы в технологию-однодневку, и при любом раскладе у нас есть ментейнер, который будет это дело развивать. В случае изменения лиценхзии, то довольно редкое событие, всегда можно ответить такой операцией, как форк. Очень удобно.

web-сервер на windows? Вы шутите?
сам по себе web-сервер на windows — не редкость, в виде IIS.
Вопрос зачем нужен nginx на windows
Linux subsystem on Windows (тот который на Windows 10) вам в помощь. Это конечно не решает все проблемы, но хоть какое-то решение.
Я не прощу решать какие-то проблемы, давным давно существует форк nginx в котором всё поправлено. Я не прошу начать собирать nginx под Windows, это и так уже делается, сборки доступны на оф. сайте. Я не прошу ничего менять. Меня интересовал исключительно искусственный лимит на число соединений — как следует из ссылки на статью, которую я привёл, это просто число в исходниках, которое меняется без каких либо сложностей.

Этот лимит вообще-то прописан в системных заголовочных файлах...

Лимит на число соединений при использовании select(), он же FD_SETSIZE, задаётся, к сожалению, только при компиляции. И при этом влияет на скорость любого вызова select(), т.к. битовые массивы соответствующего размера приходится копировать между приложением и ядром.


Значение по умолчанию для FD_SETSIZE на Windows — 64, что совсем смешно. При сборке бинарников, выкладываемых на nginx.org, мы ставим FD_SETSIZE в 1024, что выглядит разумным компромиссом между скорость и количеством возможных соединений. Особенно учитывая, что основная задача nginx/Windows — это тестирование.


Если этого мало — можно пересобрать из исходников с любым устраивающим вас значением (инструкция по самостоятельной сборке — тут). Или прислать патч, меняющие значение, используемое при стандартной сборке, как-то обосновав новое значение. Тут важно понимать, что лимит — всё равно будет, ибо select(). Вопрос только — какой именно, и что это будет означать с точки зрения производительности.

Подскажите, есть ли простой способ включить http2 с ALPN для современных браузеров на CentOS 7? Nginx из официального репозитория.

Да. Скачать SRPM, подредактировать его (включить статическую сборку с нужной версией openssl, добавить или удалить плагины и тд) и настроить автоматическую сборку и свой репозиторий. Звучит страшно, но работы на пару часов.
Плюс подхода в возможности иметь nginx с нужной версией openssl не трогая системную либу и в возможности кастомизировать пакет.
Как более легкий вариант- использовать docker с ОС, в которой нужная версия openssl.
Мы собираем Nginx под CentOS 7 с поддержкой http2.
Но нашу сборку надо использовать осторожно, т.к. много стандартных модулей отключено и много нестандартных добавлено.
Устанавливается так:
yum install http://repo.docker.ru/pub/linux/centos/7/noarch/docker-release-1-1.el7.noarch.rpm
yum install cdnnow-nginx
А есть планы собирать Real_IP по умолчанию и грузить его динамически? На freebsd жуткая боль в жопе от того, что пакет идёт без него и приходится тянуть один только nginx из портов.
разве?

# nginx -V
nginx version: nginx/1.12.1
built with OpenSSL 1.0.2k-freebsd 26 Jan 2017
TLS SNI support enabled
configure arguments: … --with-http_realip_module …
Ну у меня так же, только из портов и выбран real_ip при конфиге, даже в доках написано, что по умолчанию не собирается. Есть какой-то пакадж, который вообще всё содержит, но как-то его ставить, чтобы был только один этот к стандартному набору…
но пакет nginx собран с ним)
Вот ведь, полез проверять — и вправду собран с ним! С апреля включили в поставку. Спасибо!

Грузить динамически — точно нет. Собирать по умолчанию — возможно, в рамках оптимизации политики "что мы собираем по умолчанию", она сейчас получается сильно отличающейся от того, что мы же собираем в пакетах.

Впечатлений как от Плейбоя! Спасибо!

Вопрос по reuseport. Написано «Работает на Linux’е не очень хорошо».
Имеется в виду только указанная дальше потеря соединений при уменьшении количества рабочих процессов?
Или что-то ещё?

Да, имеется в виду потеря соединений при закрытии сокетов, и соответственно при уменьшении количества рабочих процессов. Как недавно выяснилось, это приводило также к потере соединений при тестировании конфигурации, но этот негативный эффект легко исправить (и уже).

Вы знаете, учителя делятся на две категории: одни пишут учебники, чтобы показать, какие они умные, другие — чтобы научить. Так вот, для того, чтобы людям была понятнее «идемпотентность» (а не лезли люди в словарь, изучая конфиг nginx), можно было написать
strong_equivalence
— что, согласитесь, с одной стороны интуитивно понятнее, а с другой не заставляет лезть в словарь и является сущностным переводом этого термина на «русский понятный».

А при чём тут strong_equivalence, и что именно вы понимаете под этими словами? Ведь не strong equivalence principle же?


Что такое идемпотентность — известно из математики, и явно описывается в стандарте HTTP. А чтобы не лазить в словарь, мы и в документации описали.

Честно говоря, тот факт, что в аудитории сидело много людей так или иначе связанных с вебом/бэкендом, а что такое идемпотентность знало лишь трое — меня несколько… смущает.
Странно это, лезть в словарь чтобы посмотреть одно из базовых определений стандарта HTTP (как выше написали к тому же и из математики).

Вообще говоря, корректнее говорить про safe method.
Идемподентность не всегда возможна, разумеется, да и в rfc речь идет о "CAN", когда про safe method MUST.
Например, файл мог измениться. Или это метод, который отдает текущее время.

Мне вот кажется, что если бы сказали «детерминированность», то рук было бы больше. Не синоним, но близко.
Спасибо за ответ.
Имею в виду сущность слова, от лат. idem – тот же самый и potens – сильный, мощный; букв. – равносильность, но, конечно, правда ваша, конфигу лучше быть описанным в терминологии стандарта.
Когда встретил это слово в конфиге, пришло в голову именно при помощи словаря искать суть, потому что гугл выдал примерно это:
Скриншот


Даже он не очень в курсе, что это есть в доках nginx или в стандарте HTTP.
С точки зрения веб-разработки из последних нововведений особенно порадовал $request_id, как говорится мелочь, а приятно :) Спасибо за него, для логирования и разбора полетов вещь крайне полезная и наконец-то из коробки, а не с помощью костылей.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий