Nginx-ru mailing list archive (nginx-ru@sysoev.ru)
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: Проблема с X-Accel-Redirect
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
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;
}
|