патч для отключения заголовков "Connection: keep-alive" (еще раз)

Илья Шипицин chipitsine at gmail.com
Tue Dec 10 03:13:16 UTC 2013


Добрый день!

как-то уже писал на эту тему. дошли руки, выкатил патч в продакшен.
идея в том, что отправка заголовка "Connection: keep-alive" в
большинстве случаев не нужна.

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


желающие - приглашаются к тестированию.

данное поведение "подсмотрено" у IIS, который по любым метрикам
занимает десятки процентов "рынка":
http://news.netcraft.com/archives/2013/12/06/december-2013-web-server-survey.html
- поэтому есть уверенность, что все обойдется без побочных эффектов


diff --git a/src/http/ngx_http_header_filter_module.c
b/src/http/ngx_http_header_filter_module.c
index 707a813..759186f 100644
--- a/src/http/ngx_http_header_filter_module.c
+++ b/src/http/ngx_http_header_filter_module.c
@@ -383,7 +383,10 @@ ngx_http_header_filter(ngx_http_request_t *r)
         len += sizeof("Connection: upgrade" CRLF) - 1;

     } else if (r->keepalive) {
+
+    if ((r->http_version == NGX_HTTP_VERSION_10) || (clcf->keepalive_header)) {
         len += sizeof("Connection: keep-alive" CRLF) - 1;
+    }

         /*
          * MSIE and Opera ignore the "Keep-Alive: timeout=<N>" header.
@@ -556,8 +559,10 @@ ngx_http_header_filter(ngx_http_request_t *r)
                              sizeof("Connection: upgrade" CRLF) - 1);

     } else if (r->keepalive) {
-        b->last = ngx_cpymem(b->last, "Connection: keep-alive" CRLF,
+       if ((r->http_version == NGX_HTTP_VERSION_10) ||
(clcf->keepalive_header)) {
+               b->last = ngx_cpymem(b->last, "Connection: keep-alive" CRLF,
                              sizeof("Connection: keep-alive" CRLF) - 1);
+       }

         if (clcf->keepalive_header) {
             b->last = ngx_sprintf(b->last, "Keep-Alive: timeout=%T" CRLF,


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