ПРОЕКТЫ 


  АРХИВ 


Apache-Talk @lexa.ru 

Inet-Admins @info.east.ru 

Filmscanners @halftone.co.uk 

Security-alerts @yandex-team.ru 

nginx-ru @sysoev.ru 


  СТАТЬИ 


  ПЕРСОНАЛЬНОЕ 


  ПРОГРАММЫ 



ПИШИТЕ
ПИСЬМА












     АРХИВ :: nginx-ru
Nginx-ru mailing list archive (nginx-ru@sysoev.ru)

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [feature request] X-Sendfile



On Mon, 24 Apr 2006, Sergey Serov wrote:

On Monday 24 April 2006 05:37, Igor Sysoev wrote:
On Sun, 23 Apr 2006, Sergey Serov wrote:
В Apache (ч/з mod_xsendfile) и в lighttpd есть такая замечательная штука
как обработка заголовка ответа X-Sendfile через sendfile(2).
Полезно, если напр. сервер отдающий большие файлы находится далеко от
fastcgi сервера. Да и даже если близко, то нет способа для fastcgi
скрипта авторизовать юзера перед передачей большого файла без
использования редиректов.
В nginx по идее есть sendfile, но только во перловом модуле (как и в
mod_perl Апача). Т.е. обработать ответ от upstream я не могу.
Было бы замечательно, если бы и подобная функциональность была бы и у
nginx.

P.S. С помощью sendfile можно реализовать много чего, напр. у меня
кешируется динамический контент (примерно так, как у Apache2
mod_disk_cache).

nginx поддерживает более общий заголовок "X-Accel-Redirect:
/download/file".

     location  /download/ {
         internal;
         root   ...;
     }

Из ответа бэкенда при этом наследуются заголовки:

Set-Cookie
Content-Disposition
Cache-Control
Expires
Accept-Ranges


Обнаружил только одну небольшую проблему (или фичу).
Если напр. конф. такая:

location /download.cgi {
        fastcgi_pass ....
        if ($request_method != "POST") {
        return 405;
      }
}
location /download/ {
        internal;
        root ...;
}

то в /download/ уже оказывается метод != POST и юзер получает 405.
А на /download.cgi GET'ом долбится бесчисленное множество качалок, хотелось бы
чтобы они отрубались достаточно просто не доходя до нагруженного fastcgi
сервера. Как можно надежно проверить в if является ли запрос internal ?

Нужно, чтобы клиент слал только POST, он уходил на FastCGI,
а тот прислылал "X-Accel-Redirect: /download/..." ?

Прилагаемый патч, превращает POST в GET для внтутреннего редиректа и,
кроме того, позволяет вместо

    if ($request_method != "POST") {

писать

    limit_except  POST {
        deny   all;
    }



Игорь Сысоев
http://sysoev.ru
--- src/http/ngx_http_core_module.c     Tue Apr 18 17:51:12 2006
+++ src/http/ngx_http_core_module.c     Mon Apr 24 17:26:35 2006
@@ -1328,6 +1328,7 @@
     ngx_http_update_location_config(r);
 
     r->internal = 1;
+    r->method = NGX_HTTP_GET;
 
     ngx_http_handler(r);
 
@@ -2528,6 +2529,7 @@
 static ngx_http_method_name_t  ngx_methods_names[] = {
    { "GET",  (uint32_t) ~NGX_HTTP_GET },
    { "HEAD", (uint32_t) ~NGX_HTTP_HEAD },
+   { "POST", (uint32_t) ~NGX_HTTP_POST },
    { NULL, 0 }
 };
 


 




Copyright © Lexa Software, 1996-2009.