nginx незавершаетсоединениепослевыдачиответачерезinternal_redirect()?

Igor Afanasyev afan at mail.ru
Tue Sep 8 13:49:50 MSD 2009


Всем добрый день!

Столкнулся со следующей проблемой, которая выглядит как явный баг 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?







More information about the nginx-ru mailing list