From arut на nginx.com Thu Jul 11 14:58:53 2024 From: arut на nginx.com (Roman Arutyunyan) Date: Thu, 11 Jul 2024 18:58:53 +0400 Subject: nginx: [emerg] no handler for server in /etc/nginx/nginx.conf:7 In-Reply-To: <1AB4CE44-6AB8-474B-8DDB-CFE59C9F4561@nginx.com> References: <26d473fa-f890-4c47-80d7-f9bcb1c1d8f2@csdoc.com> <1AB4CE44-6AB8-474B-8DDB-CFE59C9F4561@nginx.com> Message-ID: <76109E2E-0826-40EA-8E77-7EAD18C6ADC4@nginx.com> Добрый день, > On 27 Jun 2024, at 5:02 PM, Roman Arutyunyan wrote: > > Добрый день,. > >> On 5 Jun 2024, at 7:41 PM, Gena Makhomed wrote: >> >> Здравствуйте, All! >> >> есть такой конфиг: >> >> # cat /etc/nginx/nginx.conf >> >> events { >> worker_connections 10240; >> } >> >> stream { >> server { >> listen [::]:443 bind default_server ssl; >> listen 443 bind default_server ssl; >> ssl_reject_handshake on; >> } >> } >> >> при попытке его тестирования - получаю ошибку: >> >> # nginx -t >> nginx: [emerg] no handler for server in /etc/nginx/nginx.conf:7 >> nginx: configuration file /etc/nginx/nginx.conf test failed >> >> если в конфиге поменять слово stream на http >> - тогда тестирование конфига происходит без проблем. >> >> почему такое отличие, это ошибка в nginx? можно ли ее исправить, >> чтобы директива ssl_reject_handshake вела себя одинаково, >> и в контексте http и в контексте stream? > > Отличие в том, что в http есть дефолтные хендлеры, а в stream их нет т.к. семантика более общая. > > Если в конфиге есть ssl_reject_handshake, то действительно можно было бы не требовать наличие хендлера. > Однако проверять такое очень неудобно. Переносить ошибку в рантайм тоже не хочется. > В общем, наверное надо как-то улучшить, но хорошего способа пока не вижу. Будем иметь в виду, спасибо. > >> workaround: ошибки не будет, если в блок server >> в блоке stream добавить совершенно не нужную в данном >> случае и бесполезную директиву proxy_pass 127.0.0.1:443; > > Проще добавить return. > >> используется бинарная сборка nginx/1.27.0 с сайта nginx.org >> >> # dnf info nginx >> Name : nginx >> Epoch : 1 >> Version : 1.27.0 >> Release : 2.el9.ngx >> Architecture : x86_64 >> Source : nginx-1.27.0-2.el9.ngx.src.rpm >> From repo : nginx-mainline >> Summary : High performance web server >> URL : https://nginx.org/ >> >> -- >> Best regards, >> Gena >> _______________________________________________ >> nginx-ru mailing list >> nginx-ru на nginx.org >> https://mailman.nginx.org/mailman/listinfo/nginx-ru > > ---- > Roman Arutyunyan > arut на nginx.com В итоге перенесли проверку в рантайм: https://hg.nginx.org/nginx/rev/072ca4906154 Теперь ssl_reject_handshake ведет себя одинаково в http и stream. Спасибо за репорт. ---- Roman Arutyunyan arut на nginx.com ----------- следующая часть ----------- Вложение в формате HTML было извлечено… URL: From gmm на csdoc.com Thu Jul 11 16:46:00 2024 From: gmm на csdoc.com (Hennadii Makhomed) Date: Thu, 11 Jul 2024 18:46:00 +0200 Subject: nginx: [emerg] no handler for server in /etc/nginx/nginx.conf:7 In-Reply-To: <76109E2E-0826-40EA-8E77-7EAD18C6ADC4@nginx.com> References: <26d473fa-f890-4c47-80d7-f9bcb1c1d8f2@csdoc.com> <1AB4CE44-6AB8-474B-8DDB-CFE59C9F4561@nginx.com> <76109E2E-0826-40EA-8E77-7EAD18C6ADC4@nginx.com> Message-ID: <458f32c9-22a0-4234-a450-15a5690285a3@csdoc.com> On 11.07.2024 16:58, Roman Arutyunyan wrote: >>> stream { >>> server { >>> listen [::]:443 bind default_server ssl; >>> listen 443 bind default_server ssl; >>> ssl_reject_handshake on; >>> } >>> } >>> >>> при попытке его тестирования - получаю ошибку: >>> >>> # nginx -t >>> nginx: [emerg] no handler for server in /etc/nginx/nginx.conf:7 >>> nginx: configuration file /etc/nginx/nginx.conf test failed >>> >>> если в конфиге поменять слово stream на http >>> - тогда тестирование конфига происходит без проблем. >>> >>> почему такое отличие, это ошибка в nginx? можно ли ее исправить, >>> чтобы директива ssl_reject_handshake вела себя одинаково, >>> и в контексте http и в контексте stream? >> >> Отличие в том, что в http есть дефолтные хендлеры, а в stream их нет т.к. семантика более общая. >> >> Если в конфиге есть ssl_reject_handshake, то действительно можно было бы не требовать наличие хендлера. >> Однако проверять такое очень неудобно. Переносить ошибку в рантайм тоже не хочется. >> В общем, наверное надо как-то улучшить, но хорошего способа пока не вижу. Будем иметь в виду, спасибо. > В итоге перенесли проверку в рантайм: > > https://hg.nginx.org/nginx/rev/072ca4906154 > > Теперь ssl_reject_handshake ведет себя одинаково в http и stream. > > Спасибо за репорт. Роман, спасибо за фикс, но я предполагал другой вариант решения, чтобы директива ssl_reject_handshake on; кроме того, что она делает сейчас, еще и "под капотом", незаметно для пользователя добавляла бы свой фиктивный дефолтный хендлер в блок server, чтобы не надо было бы переносить проверку корректности конфигурации nginx в рантайм. Заодно, еще можно было бы выдавать варнинг или ошибку, если в блоке с директивой ssl_reject_handshake on; есть еще какие-то другие хендлеры, кроме того, который неявно добавляет директива ssl_reject_handshake on; потому что все остальыне хендлеры не будут иметь смысла в такой ситуации и не будут нормально работать. -- Best regards, Gena From arut на nginx.com Thu Jul 11 16:51:50 2024 From: arut на nginx.com (Roman Arutyunyan) Date: Thu, 11 Jul 2024 20:51:50 +0400 Subject: nginx: [emerg] no handler for server in /etc/nginx/nginx.conf:7 In-Reply-To: <458f32c9-22a0-4234-a450-15a5690285a3@csdoc.com> References: <26d473fa-f890-4c47-80d7-f9bcb1c1d8f2@csdoc.com> <1AB4CE44-6AB8-474B-8DDB-CFE59C9F4561@nginx.com> <76109E2E-0826-40EA-8E77-7EAD18C6ADC4@nginx.com> <458f32c9-22a0-4234-a450-15a5690285a3@csdoc.com> Message-ID: <7B01C4F5-BFB1-43F3-A530-6FC9598086C0@nginx.com> Добры день, > On 11 Jul 2024, at 8:46 PM, Hennadii Makhomed wrote: > > On 11.07.2024 16:58, Roman Arutyunyan wrote: > >>>> stream { >>>> server { >>>> listen [::]:443 bind default_server ssl; >>>> listen 443 bind default_server ssl; >>>> ssl_reject_handshake on; >>>> } >>>> } >>>> >>>> при попытке его тестирования - получаю ошибку: >>>> >>>> # nginx -t >>>> nginx: [emerg] no handler for server in /etc/nginx/nginx.conf:7 >>>> nginx: configuration file /etc/nginx/nginx.conf test failed >>>> >>>> если в конфиге поменять слово stream на http >>>> - тогда тестирование конфига происходит без проблем. >>>> >>>> почему такое отличие, это ошибка в nginx? можно ли ее исправить, >>>> чтобы директива ssl_reject_handshake вела себя одинаково, >>>> и в контексте http и в контексте stream? >>> >>> Отличие в том, что в http есть дефолтные хендлеры, а в stream их нет т.к. семантика более общая. >>> >>> Если в конфиге есть ssl_reject_handshake, то действительно можно было бы не требовать наличие хендлера. >>> Однако проверять такое очень неудобно. Переносить ошибку в рантайм тоже не хочется. > >>> В общем, наверное надо как-то улучшить, но хорошего способа пока не вижу. Будем иметь в виду, спасибо. > >> В итоге перенесли проверку в рантайм: >> https://hg.nginx.org/nginx/rev/072ca4906154 >> Теперь ssl_reject_handshake ведет себя одинаково в http и stream. >> Спасибо за репорт. > > > Роман, спасибо за фикс, но я предполагал другой вариант решения, > чтобы директива ssl_reject_handshake on; кроме того, что она делает > сейчас, еще и "под капотом", незаметно для пользователя добавляла бы > свой фиктивный дефолтный хендлер в блок server, чтобы не надо было бы > переносить проверку корректности конфигурации nginx в рантайм. Я не вижу большой проблемы в том что проверка перенесена в рантайм, Как минимум, это может быть полезным в процессе разработки и тестирования. Ну и нагружать ssl_reject_handshake тоже не хочется. > Заодно, еще можно было бы выдавать варнинг или ошибку, если в блоке > с директивой ssl_reject_handshake on; есть еще какие-то другие хендлеры, > кроме того, который неявно добавляет директива ssl_reject_handshake on; > потому что все остальыне хендлеры не будут иметь смысла > в такой ситуации и не будут нормально работать. Сейчас хендлеры не проверяются. Один модуль может переписать хендлер от другого модуля. ---- Roman Arutyunyan arut на nginx.com ----------- следующая часть ----------- Вложение в формате HTML было извлечено… URL: From gmm на csdoc.com Thu Jul 11 18:25:16 2024 From: gmm на csdoc.com (Hennadii Makhomed) Date: Thu, 11 Jul 2024 20:25:16 +0200 Subject: nginx: [emerg] no handler for server in /etc/nginx/nginx.conf:7 In-Reply-To: <7B01C4F5-BFB1-43F3-A530-6FC9598086C0@nginx.com> References: <26d473fa-f890-4c47-80d7-f9bcb1c1d8f2@csdoc.com> <1AB4CE44-6AB8-474B-8DDB-CFE59C9F4561@nginx.com> <76109E2E-0826-40EA-8E77-7EAD18C6ADC4@nginx.com> <458f32c9-22a0-4234-a450-15a5690285a3@csdoc.com> <7B01C4F5-BFB1-43F3-A530-6FC9598086C0@nginx.com> Message-ID: <29d960ef-8ba7-45b7-8bac-fb183c4e2e30@csdoc.com> On 11.07.2024 18:51, Roman Arutyunyan wrote: >>>> Отличие в том, что в http есть дефолтные хендлеры, а в stream их нет т.к. семантика более общая. >>>> >>>> Если в конфиге есть ssl_reject_handshake, то действительно можно было бы не требовать наличие хендлера. >>>> Однако проверять такое очень неудобно. Переносить ошибку в рантайм тоже не хочется. >> >>>> В общем, наверное надо как-то улучшить, но хорошего способа пока не вижу. Будем иметь в виду, спасибо. >> >>> В итоге перенесли проверку в рантайм: >>> https://hg.nginx.org/nginx/rev/072ca4906154 >>> Теперь ssl_reject_handshake ведет себя одинаково в http и stream. >>> Спасибо за репорт. >> Роман, спасибо за фикс, но я предполагал другой вариант решения, >> чтобы директива ssl_reject_handshake on; кроме того, что она делает >> сейчас, еще и "под капотом", незаметно для пользователя добавляла бы >> свой фиктивный дефолтный хендлер в блок server, чтобы не надо было бы >> переносить проверку корректности конфигурации nginx в рантайм. > > Я не вижу большой проблемы в том что проверка перенесена в рантайм, > Как минимум, это может быть полезным в процессе разработки и тестирования. > Ну и нагружать ssl_reject_handshake тоже не хочется. Но ведь изначально вы говорили, что "Переносить ошибку в рантайм тоже не хочется", значит есть в этом варианте какие-то недостатки? Если проверка в рантайме - то в процессе тестирования конфигурации эту ошибку - "no handler for server" - обнаружить будет невозможно? Проверка конфигурации "nginx -t" будет успешной, а ошибка будет уже после того, как эта конфигурация, якобы "не содержащая ошибок" будет применена и ошибка начнет возникать в процессе обработки запросов? В процессе разработки и тестирования - это может быть и будет удобно, но в процессе эксплуатации - это совсем неудобно, потому что хотелось бы иметь возможность обнаруживать ошибки в конфигурации еще на стадии выполнения "nginx -t", а не когда уже произошла замена конфигруации. А то, что ssl_reject_handshake нагружена дополнительным кодом - этого никто бы из пользователей nginx не заметил, и поведение nginx было бы полностью одинаковым и для http и stream - и ошибки "no handler for server" можно было бы обнаруживать еще в процессе тестирования конфигурации, а не в рантайме. Разве не так? В чем же тогда преимущество того, что проверка перенесена в рантайм? Поведение nginx теперь изменилось в худшую сторону, потому что те ошибки, которые раньше определялись сразу в процессе тестирования конфигурации - теперь уже будут обнаруживаться только в рантайме. Не понятно, почему именно такой вариант решения этой проблемы вы считаете наиболее целесообразным и наиболее оптимальным. -- Best regards, Gena From gmm на csdoc.com Tue Jul 16 09:57:29 2024 From: gmm на csdoc.com (Hennadii Makhomed) Date: Tue, 16 Jul 2024 11:57:29 +0200 Subject: nginx: [emerg] no handler for server in /etc/nginx/nginx.conf:7 In-Reply-To: <1AB4CE44-6AB8-474B-8DDB-CFE59C9F4561@nginx.com> References: <26d473fa-f890-4c47-80d7-f9bcb1c1d8f2@csdoc.com> <1AB4CE44-6AB8-474B-8DDB-CFE59C9F4561@nginx.com> Message-ID: <36149240-44be-4cce-a19b-577c49811031@csdoc.com> On 27.06.2024 15:02, Roman Arutyunyan wrote: >> stream { >> server { >> listen [::]:443 bind default_server ssl; >> listen 443 bind default_server ssl; >> ssl_reject_handshake on; >> } >> } >> >> при попытке его тестирования - получаю ошибку: >> >> # nginx -t >> nginx: [emerg] no handler for server in /etc/nginx/nginx.conf:7 >> nginx: configuration file /etc/nginx/nginx.conf test failed >> >> если в конфиге поменять слово stream на http >> - тогда тестирование конфига происходит без проблем. >> >> почему такое отличие, это ошибка в nginx? можно ли ее исправить, >> чтобы директива ssl_reject_handshake вела себя одинаково, >> и в контексте http и в контексте stream? > > Отличие в том, что в http есть дефолтные хендлеры, а в stream их нет т.к. семантика более общая. > > Если в конфиге есть ssl_reject_handshake, то действительно можно было бы не требовать наличие хендлера. > Однако проверять такое очень неудобно. Переносить ошибку в рантайм тоже не хочется. > В общем, наверное надо как-то улучшить, но хорошего способа пока не вижу. По сути, директива ssl_reject_handshake выполняет роль хендлера, потому что эта директива завершает соединение еще на уровне SSL, так что какой бы там внутри другой хендлер не был бы прописан - он не сработает - до обработки им запроса дело просто не дойдет. Хороший способ улучшить - отобразить это в коде, в явном виде. В таком случае не нужно будет убирать обязательное требование наличия хендлера и не нужно будет переносить ошибку в рантайм. Можно так сделать? -- Best regards, Gena