From mdounin на mdounin.ru Tue Feb 10 16:48:49 2026 From: mdounin на mdounin.ru (Maxim Dounin) Date: Tue, 10 Feb 2026 19:48:49 +0300 Subject: freenginx-1.29.5 Message-ID: Изменения в freenginx 1.29.5 10.02.2026 *) Добавление: оптимизация использования SSL_sendfile() на FreeBSD. Спасибо Глебу Смирнову. *) Исправление: бэкенды не признавались неработающими после получения ответа с кодом 500, 502, 503, 504 или 429, если соответствующий код был указан в директиве proxy_next_upstream, но передача запроса на другой сервер была невозможна. *) Исправление: расширение управления кэшированием stale-if-error не применялось, если бэкенд возвращал ответ с кодом 500, 502, 503, 504 или 429 и соответствующий код был указан в директиве proxy_next_upstream. *) Исправление: в обработке преждевременных ответов бэкендов. -- Maxim Dounin http://freenginx.org/ From peter.volkov на gmail.com Wed Feb 11 17:07:31 2026 From: peter.volkov на gmail.com (Peter Volkov) Date: Wed, 11 Feb 2026 20:07:31 +0300 Subject: =?UTF-8?B?dXBzdHJlYW0gc2VydmVyIHRlbXBvcmFyaWx5IGRpc2FibGVkIHdoaWxlIFNTTCBoYW5kcw==?= =?UTF-8?B?aGFraW5nIHRvIHVwc3RyZWFtINGF0L7RgtGPINC90LXRgiDQsdC70L7QutCwIHVwc3RyZWFt?= Message-ID: Добрый вечер. В логах вижу сообщения: 2026/02/11 16:51:24 [warn] 420642#420642: *6281985193 upstream server temporarily disabled while SSL handshaking to upstream, client: 185.YYY.YYY.180, server: pair-dvr-vhost, request: "GET /illusion_plus/1/17708/1770828666.00-1770828672.00.ts?arg_params HTTP/1.1", upstream: "https://185.XXX.XXX.51:8344/illusion_plus/1/17708/1770828666.00-1770828672.00.ts?arg_params", host: "pair-dvr-vhost" 2026/02/11 16:51:24 [error] 420642#420642: *6281985193 upstream timed out (110: Connection timed out) while SSL handshaking to upstream, client: 185.YYY.YYY.180, server: pair-dvr-vhost, request: "GET /illusion_plus/1/17708/1770828666.00-1770828672.00.ts?arg_params HTTP/1.1", upstream: "https://185.XXX.XXX.51:8344/illusion_plus/1/17708/1770828666.00-1770828672.00.ts?arg_params", host: "pair-dvr-vhost" И вот тут не понимаю, откуда у нас сообщения "upstream server temporarily disabled"? Обращение к upstream у нас задано с помощью: proxy_set_header Host ${arg_origin}.origin-chunks.domain.org; proxy_pass https://${arg_origin}.origin-chunks.domain.org:8344; Где-то я читал, и кажется логичным, что если не используется upstream name {}, то механизм "выключения" upstream сервера не будет использоваться. Так ли это? Где задать max_fails для этого случая? Мне нужно отправлять запросы на вышестоящий сервер, даже если какой-то запрос повис. Заранее благодарю за ответ, -- Peter. From mdounin на mdounin.ru Wed Feb 11 20:07:44 2026 From: mdounin на mdounin.ru (Maxim Dounin) Date: Wed, 11 Feb 2026 23:07:44 +0300 Subject: upstream server =?koi8-r?Q?temporarily?= =?koi8-r?Q?_disabled_while_SSL_handshaking_to_upstream_=C8=CF=D4=D1_=CE?= =?koi8-r?B?xdQgwszPy8E=?= upstream In-Reply-To: References: Message-ID: Hello! On Wed, Feb 11, 2026 at 08:07:31PM +0300, Peter Volkov wrote: > Добрый вечер. > > В логах вижу сообщения: > > 2026/02/11 16:51:24 [warn] 420642#420642: *6281985193 upstream server > temporarily disabled while SSL handshaking to upstream, client: > 185.YYY.YYY.180, server: pair-dvr-vhost, request: "GET > /illusion_plus/1/17708/1770828666.00-1770828672.00.ts?arg_params > HTTP/1.1", upstream: > "https://185.XXX.XXX.51:8344/illusion_plus/1/17708/1770828666.00-1770828672.00.ts?arg_params", > host: "pair-dvr-vhost" > 2026/02/11 16:51:24 [error] 420642#420642: *6281985193 upstream timed > out (110: Connection timed out) while SSL handshaking to upstream, > client: 185.YYY.YYY.180, server: pair-dvr-vhost, request: "GET > /illusion_plus/1/17708/1770828666.00-1770828672.00.ts?arg_params > HTTP/1.1", upstream: > "https://185.XXX.XXX.51:8344/illusion_plus/1/17708/1770828666.00-1770828672.00.ts?arg_params", > host: "pair-dvr-vhost" > > И вот тут не понимаю, откуда у нас сообщения "upstream server > temporarily disabled"? Обращение к upstream у нас задано с помощью: > > proxy_set_header Host ${arg_origin}.origin-chunks.domain.org; > proxy_pass https://${arg_origin}.origin-chunks.domain.org:8344; > > Где-то я читал, и кажется логичным, что если не используется upstream > name {}, то механизм "выключения" upstream сервера не будет > использоваться. Так ли это? > Где задать max_fails для этого случая? Мне нужно отправлять запросы на > вышестоящий сервер, даже если какой-то запрос повис. Это не совсем так. Важно не то, описан ли upstream явно, а то, сколько в нём серверов (точнее, IP-адресов). Если IP-адресов больше одного - то "плохие" адреса будут выключаться из-за ошибок. А чтобы задать max_fails - нужно как раз описать upstream явно. Кроме того, у вас используется proxy_pass с переменными. Если при этом нет явно заданных блоков upstream или использования того же имени в proxy_pass без переменных, то группы серверов будут создаваться динамически для каждого запроса с помощью resolver'а. В этом случае "плохие" адреса тоже будут выключаться, но так как группы серверов каждый раз новые, то это ни на что не повлияет, так что сообщение можно смело игнорировать. Если чуть подробнее, то как-то так: Поведение при явном задании группы серверов с помощью блока upstream в конфигурации и при неявном задании группы серверов с помощью использования DNS-имени в директиве proxy_pass - не отличается. Скажем, если у нас есть домен foo.example.com, и он резолвится в два IP-адреса, 192.0.2.2 и 192.0.2.3, то можно написать: proxy_pass http://foo.example.com; Или можно написать так: upstream foo.example.com { server foo.example.com; } proxy_pass http://foo.example.com; Или так: upstream foo.example.com { server 192.0.2.2; server 192.0.2.3; } proxy_pass http://foo.example.com; В последнем случае DNS не будет использоваться вообще, в первых двух - будет, в остальном эти конфигурации эквивалентны. С точки зрения внутреннего устройства первая форма записи - неявно создаёт upstream с соответствующим именем, то есть аналогична второй. Фактически, блок upstream - это то же самое DNS-имя, но с возможностью задавать дополнительные параметры, в том числе max_fails и fail_timeout. При этом отключение серверов из-за ошибок не применяется, если сервер (точнее, IP-адрес) в группе только один. Если же серверов много - то оно будет применяться, при любой форме записи. Соответственно, если хочется явно задать max_fails, то сделать это можно, задав блок upstream явно, например: upstream foo.example.com { server foo.example.com max_fails=0; } proxy_pass http://foo.example.com; Однако, с учётом того, что у вас в конфиге в директиве proxy_pass используются переменные, тут следует учитывать ещё один возможных случай: если в конфигурации нет ни явно описанного блока upstream с соответствующим именем, ни неявно созданного c помощью proxy_pass (без переменных), а используется только proxy_pass с переменными, то группа серверов будет создаваться непосредственно во время обработки запроса: имя, полученное после подстановки переменных, будет преобразовано в IP-адреса с помощью DNS-серверов, заданных директивой resolver. В этом случае поведение при обработке запроса тоже не будет отличаться, и, если IP-адресов больше одного, nginx будет пытаться "выключать" сервера из-за ошибок. Но, поскольку группа серверов каждый раз новая, на практике это ни на что не повлияет: следующий запрос будет использовать уже новую группу серверов, и в ней не будет информации о ранее случившихся ошибках. То есть в такой ситуации соответствующие сообщения можно смело игнорировать (и, наверное, стоит добавить специальную проверку, чтобы в таких случаях это предупреждение просто не выводить). Но, повторюсь, это распространяется только на случай, когда proxy_pass используется с переменными, и при этом без переменных соответствующее имя в конфиге не используется. -- Maxim Dounin http://mdounin.ru/