[Devel] Nginx при обновлении большого числа пакетов APT

Evgeny Sinelnikov sin на etersoft.ru
Пт Июл 29 06:36:54 MSD 2011


Здравствуйте,

хочу сообщить, что вчера мы, в очередной раз, столкнулись с проблемой
обновления большого числа пакетов аптом, при подключенном
http-репозитории, когда на севере установлен nginx. Суть проблемы в
том, что при загрузке пакетов, скачивание некоторых пакетов
периодически отваливается...

Get:99 http://download.etersoft.ru i586/classic xorg-dri-savage
4:7.10.3-alt2 [829kB]
Get:100 http://download.etersoft.ru i586/classic xorg-dri-mga
4:7.10.3-alt2 [835kB]
Err http://download.etersoft.ru i586/classic xorg-dri-mga 4:7.10.3-alt2
  Error reading from server - read (104 Connection reset by peer)
Get:101 http://download.etersoft.ru i586/classic xorg-dri-nouveau
4:7.10.3-alt2 [1273kB]
Get:102 http://download.etersoft.ru i586/classic xorg-drv-nouveau
2:0.0.16-alt4 [77.4kB]
...
Get:199 http://download.etersoft.ru i586/classic thunderbird
3.1.9-alt1.20110409 [9581kB]
Get:200 http://download.etersoft.ru noarch/classic firefox-yandexbar
5.2.3-alt1 [1693kB]
Err http://download.etersoft.ru noarch/classic firefox-yandexbar
5.2.3-alt1
  Error reading from server - read (104 Connection reset by peer)
Get:201 http://download.etersoft.ru i586/classic xulrunner-2.0
2.0.1.0-alt1 [1268kB]
Get:202 http://download.etersoft.ru i586/classic firefox-4.0 4.0.1-alt1 [1228kB]
...
Get:299 http://download.etersoft.ru i586/classic libpulseaudio
0.9.22-alt3 [431kB]
Get:300 http://download.etersoft.ru i586/classic libSDL 1.2.14-alt6
[169kB]
Err http://download.etersoft.ru i586/classic libSDL 1.2.14-alt6
  Error reading from server - read (104 Connection reset by peer)
Get:301 http://download.etersoft.ru i586/classic libjasper
1.900.1-alt2.qa2 [124kB]
Get:302 http://download.etersoft.ru i586/classic libopenraw-gnome
0.0.8-alt2 [4799B]
...

Просмотрев код nginx и поотлаживая его, на воспроизводимом примере
(примерно каждый 100 пакет, как видно выше, стабильно отваливался), я
нашёл точку, в которой возникает беда. Беда возникает при отключении
соединения. В keep_alive режиме соединение на сервере закрывалось не
сразу, а после некоторого числа итераций. Собственно проблема с
закрытием возникает из-за использования в nginx SO_LINGER, небольшое
описание этого режима я нашёл здесь:
  http://kalinin.ru/programming/network/29_10_00.shtml

В итоге я сделал такой патч:
diff --git a/nginx/src/http/ngx_http_request.c
b/nginx/src/http/ngx_http_request.c
index 2cef4fa..e2973c8 100644 (file)
--- a/nginx/src/http/ngx_http_request.c
+++ b/nginx/src/http/ngx_http_request.c
@@ -2146,7 +2146,7 @@ ngx_http_finalize_connection(ngx_http_request_t *r)
         ngx_http_set_keepalive(r);
         return;

-    } else if (r->lingering_close && clcf->lingering_timeout > 0) {
+    } else if (clcf->lingering_timeout > 0) {
         ngx_http_set_lingering_close(r);
         return;
     }

Изменение доступно здесь:
http://git.altlinux.org/people/sin/packages/nginx.git
http://git.etersoft.ru/people/sin/packages/nginx.git

Суть патча в том, чтобы не использовать принудительное отключение
соединения при использовании опции lingering_timeout. Мне, при нашей
скорости обмена, оказалось достаточно lingering_timeout равного 1.
Исходного поведения можно добиться выставив lingering_timeout в 0.


-- 
Sin (Sinelnikov Evgeny)


Подробная информация о списке рассылки Devel