[feature request] X-Sendfile

Igor Sysoev is at rambler-co.ru
Mon Apr 24 17:30:03 MSD 2006


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
-------------- next part --------------
--- 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 }
 };
 


More information about the nginx-ru mailing list