Upstream split a header in FastCGI

Igor Sysoev is at rambler-co.ru
Sat Feb 18 22:56:00 MSK 2006


On Sat, 18 Feb 2006, Igor Sysoev wrote:

> On Sat, 18 Feb 2006, Grigory Batalov wrote:
>
>> On Fri, 17 Feb 2006 19:47:51 +0300 (MSK)
>> Igor Sysoev <is-G97k7egY2jIKNkxEY4oc4w at public.gmane.org> wrote:
>> 
>>>> 2006/02/17 18:57:51 [alert] 15689#0: *46 upstream split a header in 
>>>> FastCGI records while reading response header from upstream, client: 
>>>> 127.0.0.1, server: localhost, URL: "/trac/", upstream: 
>>>> "fastcgi://127.0.0.1:1027"
>> ...
>>> Это сообщение означает, что fastcgi сервер послал запись stderr
>>> в то время, пока ещё не до конца выведен заголовок ответа (он выводится
>>> в записях stdout). Хотя, судя по логу, записей (type = 7) stderr нет.
>>> 
>>> Такая обработка stderr во время чтения заголовка - это багофича nginx'а.
>>> Однако в данном случае, похоже, stderr нет.
>>> 
>>> Можно сделать следующее:
>>> 
>>> 1) в файле src/http/modules/ngx_http_fastcgi_module.c найти две строки
>>>     "upstream split a header in FastCGI records" и поменять в них
>>>     split на split1 и split2.
>>> 
>>> 2) запустить nginx с отладочныи логом (желательно поставить
>>>     worker_processes 1), сделать запрос и лог прислать мне.
>> 
>
>>  А вот это он пишет при запуске в консоли:
>> 
>> $ /usr/share/trac/cgi-bin/trac.fcgi
>> Status: 200
>> Cache-control: must-revalidate
>> Expires: Fri, 01 Jan 1999 00:00:00 GMT
>> Content-Type: text/html;charset=utf-8
>> Content-Length: 196
>
> Он выводит каждый заголовок в стдельной записи, из-за этого и
> были проблемы. Прилагаемый патч должен исправить ошибку.
> Патчится как раз то место, где стоит split2. Было бы неплохо увидить
> вывод и отладочный лог с этим патчем.

Это патч нужно откатить и применить новый.


Игорь Сысоев
http://sysoev.ru
-------------- next part --------------
--- src/http/modules/ngx_http_fastcgi_module.c	Mon Nov 28 15:45:01 2005
+++ src/http/modules/ngx_http_fastcgi_module.c	Sat Feb 18 22:54:51 2006
@@ -878,7 +878,7 @@
 
             if (f->header) {
                 ngx_log_error(NGX_LOG_ALERT, r->connection->log, 0,
-                              "upstream split a header in FastCGI records");
+                             "upstream split a header line in FastCGI records");
 
                 return NGX_HTTP_UPSTREAM_INVALID_HEADER;
             }
@@ -991,7 +991,13 @@
                                "http fastcgi header: \"%V: %V\"",
                                &h->key, &h->value);
 
-                continue;
+                if (u->buffer.pos < u->buffer.last) {
+                    continue;
+                }
+
+                /* the end of the FastCGI record */
+
+                break;
             }
 
             if (rc == NGX_HTTP_PARSE_HEADER_DONE) {
@@ -1051,7 +1057,7 @@
             }
 
             ngx_log_error(NGX_LOG_ALERT, r->connection->log, 0,
-                          "upstream split a header in FastCGI records");
+                          "upstream split a header line in FastCGI records");
 
             return NGX_HTTP_UPSTREAM_INVALID_HEADER;
         }


More information about the nginx-ru mailing list