Проблема с X-Accel-Redirect

Igor Sysoev is at rambler-co.ru
Sun Sep 13 17:53:03 MSD 2009


On Sat, Sep 12, 2009 at 06:12:40PM -0500, Alex Solovey wrote:

> Имеется следующая конфигурация:
> - nginx 0.8.14 в качестве proxy-сервера
> - сервер приложений apache+mod_perl
> - Linux 2.6.28-15-generic (Ubuntu 9.04)
> 
> Сервер приложений для некоторых запросов отдает файлы посредством
> X-Accel-Redirect. До первого такого запроса все работает нормально. Но
> как только встретился первый X-Accel-Redirect, для последующих запросов
> nginx вместо полученного от сервера приложений ответа отсылает случайным
> образом любой из предыдущих ответов. Иногда вместо нормального ответа
> приходит мусор, состоящий из склееных вместе нескольких предыдущих ответов.
> Пример:
>     http://x.y.z/app/foo  --> ok
>     http://x.y.z/app/bar  --> ok
>     http://x.y.z/app/file --> ok (здесь используем X-Accel-Redirect)
>     http://x.y.z/app/bar  --> отдает file
>     http://x.y.z/app/foo  --> отдает file
>     http://x.y.z/app/bar  --> отдает foo
>     http://x.y.z/app/file --> отдает мусор
>         ... ждем время, достаточное для закрытия keep-alive ....
>     http://x.y.z/app/foo  --> ok
>     http://x.y.z/app/bar  --> ok
>     http://x.y.z/app/foo  --> ok
>     http://x.y.z/app/file --> ok (здесь используем X-Accel-Redirect)
>     http://x.y.z/app/foo  --> отдает мусор
> 
> Это продолжается до закрытия keep-alive соединения. После чего всё опять
> работает нормально дл первого запроса с X-Accel-Redirect. Если
> установить keepalive_timeout 0, то проблема не возникает.
> 
> Опытным путем удалось выяснить, что проблема появилась в nginx-0.8.11;
> версии 0.7.61 и 0.8.10 работают нормально.

Прилагаемый патч должен исправить эту ошибку.


-- 
Игорь Сысоев
http://sysoev.ru
-------------- next part --------------
Index: src/http/ngx_http_upstream.c
===================================================================
--- src/http/ngx_http_upstream.c	(revision 2439)
+++ src/http/ngx_http_upstream.c	(working copy)
@@ -1815,6 +1815,7 @@
         r->valid_unparsed_uri = 0;
 
         ngx_http_internal_redirect(r, uri, &args);
+        ngx_http_finalize_request(r, NGX_DONE);
         return NGX_DONE;
     }
 


More information about the nginx-ru mailing list