nginx незавершаетсоединениепослевыдачиответачерезinternal_redirect()?
Igor Sysoev
is at rambler-co.ru
Tue Sep 8 14:17:33 MSD 2009
On Tue, Sep 08, 2009 at 09:49:50AM +0000, Igor Afanasyev wrote:
> Всем добрый день!
>
> Столкнулся со следующей проблемой, которая выглядит как явный баг nginx.
>
> Конфигурация:
> CentOS,
> nginx/0.8.14 c perl-модулем
> perl 5.8.8
>
> Есть простейший Perl-модуль, который настроен на обработку URL определенного
> типа:
>
> =[foo.pm]==============================
> package foo;
>
> use nginx;
>
> sub handler {
> my $r = shift;
> $r->internal_redirect('/foo.shtml');
> return OK;
> }
>
> 1; # return true
> =[/foo.pm]=============================
>
> Упрощенный site.conf (выписал те директивы, которые имеют отношение к делу):
>
> =[site.conf]===========================
> perl_modules /path/to/my/lib
> perl_require foo.pm
>
> location ~* \.xml$ {
> perl foo::handler;
> }
>
> location ~* \.shtml$ {
> expires -1;
> ssi on;
> root /var/www/html;
> }
>
> =[/site.conf]==========================
>
> Когда делаю "wget -S http://localhost/foo.shtml", все нормально, файл отдается.
>
> Когда делаю "wget -S http://localhost/bar.xml", nginx отдает заголовки и само
> тело файла foo.shtml (условно, 500 байт -- это wget показывает), но потом
> соединение не закрывается и wget ждет окончания посылки файла бесконечно (до
> таймаута wget). При этом в заголовках не прописан размер файла foo.shtml.
>
> В error_log (который у меня включен в режиме debug) видна такая картина:
>
> =[error_log]===========================
> 2009/09/08 05:09:59 [notice] 29032#0: *1 "^/(.*)\.shtml$" matches "/foo.shtml",
> client: XX.XX.XX.XX, server: XXXXXX.com, request: "GET /bar.xml HTTP/1.1", host:
> "XXXXXX.com:81"
> =[/error_log]==========================
>
> Т.е. internal_redirect() срабатывает, правило location срабатывает. в access_log
> при этом записи никакой не появляется (пока клиент не отвалится по таймауту).
>
> Пробовал отключать gzip, ssi и прочее -- проблема не исчезает. Даже не знаю,
> куда копать. Есть смысл ставить nginx 0.7.61?
В 0.7.61 должно работать. Для 0.8.14 нужен прилагаемый патч.
--
Игорь Сысоев
http://sysoev.ru
-------------- next part --------------
Index: src/http/ngx_http_upstream.c
===================================================================
--- src/http/ngx_http_upstream.c (revision 2430)
+++ src/http/ngx_http_upstream.c (working copy)
@@ -363,6 +363,7 @@
u = r->upstream;
if (u && u->cleanup) {
+ r->main->count++;
ngx_http_upstream_cleanup(r);
*u->cleanup = NULL;
}
Index: src/http/modules/perl/ngx_http_perl_module.c
===================================================================
--- src/http/modules/perl/ngx_http_perl_module.c (revision 2430)
+++ src/http/modules/perl/ngx_http_perl_module.c (working copy)
@@ -262,6 +262,7 @@
if (uri.len) {
ngx_http_internal_redirect(r, &uri, &args);
+ ngx_http_finalize_request(r, NGX_DONE);
return;
}
More information about the nginx-ru
mailing list