[PATCH] Option to disable buffering in uwsgi module

Peter Smit peter at smitmail.eu
Fri Sep 30 10:20:32 UTC 2011


On Fri, Sep 30, 2011 at 1:17 PM, Maxim Dounin <mdounin at mdounin.ru> wrote:
> Hello!
>
> On Fri, Sep 30, 2011 at 01:00:12PM +0300, Peter Smit wrote:
>
>> Attached and inlined is a patch which makes it possible to disable
>> buffering for the fastcgi,scgi and uwsgi modules in the following
>> ways:
>>
>> - By using a {module}_buffering on|off configuration value
>> - By using the X-Accel-Buffering header
>>
>> This is essential for any apps that want to do comet / websocket style
>> communications.
>>
>>
>>
>> Index: ngx_http_fastcgi_module.c
>> ===================================================================
>> --- ngx_http_fastcgi_module.c (revision 4157)
>> +++ ngx_http_fastcgi_module.c (working copy)
>> @@ -228,6 +228,13 @@
>>        offsetof(ngx_http_fastcgi_loc_conf_t, upstream.store_access),
>>        NULL },
>>
>> +    { ngx_string("fastcgi_buffering"),
>> +      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,
>> +      ngx_conf_set_flag_slot,
>> +      NGX_HTTP_LOC_CONF_OFFSET,
>> +      offsetof(ngx_http_fastcgi_loc_conf_t, upstream.buffering),
>> +      NULL },
>> +
>>      { ngx_string("fastcgi_ignore_client_abort"),
>>        NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,
>>        ngx_conf_set_flag_slot,
>> @@ -602,7 +609,7 @@
>>      u->abort_request = ngx_http_fastcgi_abort_request;
>>      u->finalize_request = ngx_http_fastcgi_finalize_request;
>>
>> -    u->buffering = 1;
>> +    u->buffering = flcf->upstream.buffering;
>>
>>      u->pipe = ngx_pcalloc(r->pool, sizeof(ngx_event_pipe_t));
>>      if (u->pipe == NULL) {
>> @@ -2072,6 +2079,8 @@
>>      conf->catch_stderr = NGX_CONF_UNSET_PTR;
>>
>>      conf->keep_conn = NGX_CONF_UNSET;
>> +
>> +    conf->upstream.change_buffering = 1;
>>
>>      ngx_str_set(&conf->upstream.module, "fastcgi");
>>
>
> The fastcgi part is just wrong.
>
> You can't enable non-buffered mode for fastcgi without providing
> appropriate input filter, this will result in fastcgi response
> (i.e. with all fastcgi framing and so on) to be sent to client
> (or, rather, part of it).

My apologies, I did not realize that fastcgi had a different protocol
for return requests. I don't think I would be the right person to
provide that patch.

>
>> Index: ngx_http_scgi_module.c
>> ===================================================================
>> --- ngx_http_scgi_module.c    (revision 4157)
>> +++ ngx_http_scgi_module.c    (working copy)
>> @@ -96,6 +96,13 @@
>>        offsetof(ngx_http_scgi_loc_conf_t, upstream.store_access),
>>        NULL },
>>
>> +    { ngx_string("scgi_buffering"),
>> +      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,
>> +      ngx_conf_set_flag_slot,
>> +      NGX_HTTP_LOC_CONF_OFFSET,
>> +      offsetof(ngx_http_scgi_loc_conf_t, upstream.buffering),
>> +      NULL },
>> +
>>      { ngx_string("scgi_ignore_client_abort"),
>>        NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,
>>        ngx_conf_set_flag_slot,
>> @@ -412,7 +419,7 @@
>>      u->abort_request = ngx_http_scgi_abort_request;
>>      u->finalize_request = ngx_http_scgi_finalize_request;
>>
>> -    u->buffering = 1;
>> +    u->buffering = scf->upstream.buffering;
>>
>>      u->pipe = ngx_pcalloc(r->pool, sizeof(ngx_event_pipe_t));
>>      if (u->pipe == NULL) {
>> @@ -1038,6 +1045,8 @@
>>      /* "scgi_cyclic_temp_file" is disabled */
>>      conf->upstream.cyclic_temp_file = 0;
>>
>> +    conf->upstream.change_buffering = 1;
>> +
>>      ngx_str_set(&conf->upstream.module, "scgi");
>>
>>      return conf;
>> Index: ngx_http_uwsgi_module.c
>> ===================================================================
>> --- ngx_http_uwsgi_module.c   (revision 4157)
>> +++ ngx_http_uwsgi_module.c   (working copy)
>> @@ -123,6 +123,13 @@
>>        offsetof(ngx_http_uwsgi_loc_conf_t, upstream.store_access),
>>        NULL },
>>
>> +    { ngx_string("uwsgi_buffering"),
>> +      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,
>> +      ngx_conf_set_flag_slot,
>> +      NGX_HTTP_LOC_CONF_OFFSET,
>> +      offsetof(ngx_http_uwsgi_loc_conf_t, upstream.buffering),
>> +      NULL },
>> +
>>      { ngx_string("uwsgi_ignore_client_abort"),
>>        NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_FLAG,
>>        ngx_conf_set_flag_slot,
>> @@ -445,7 +452,7 @@
>>      u->abort_request = ngx_http_uwsgi_abort_request;
>>      u->finalize_request = ngx_http_uwsgi_finalize_request;
>>
>> -    u->buffering = 1;
>> +    u->buffering = uwcf->upstream.buffering;
>>
>>      u->pipe = ngx_pcalloc(r->pool, sizeof(ngx_event_pipe_t));
>>      if (u->pipe == NULL) {
>> @@ -1091,6 +1098,8 @@
>>      /* "uwsgi_cyclic_temp_file" is disabled */
>>      conf->upstream.cyclic_temp_file = 0;
>>
>> +    conf->upstream.change_buffering = 1;
>> +
>>      ngx_str_set(&conf->upstream.module, "uwsgi");
>>
>>      return conf;
>
> The scgi/uwsgi part looks ok.  I'll commit as soon as Igor approves.
Thanks

>
> Maxim Dounin
>
> _______________________________________________
> nginx-devel mailing list
> nginx-devel at nginx.org
> http://mailman.nginx.org/mailman/listinfo/nginx-devel
>



More information about the nginx-devel mailing list