Regarding HTTP chunked Body being stored in temp_file

Maxim Dounin mdounin at mdounin.ru
Sat Sep 17 17:07:32 UTC 2022


Hello!

On Fri, Sep 16, 2022 at 07:31:08AM +0000, Devashi Tandon wrote:

> Hi,
> 
> In our module code, we are processing the HTTP request body when 
> it is not stored in r->request_body->temp_file.
> 
> When I send a 9381 bytes body, NGINX doesn't store the body in 
> temp_file but in the internal buffers. Hence we are able to 
> process the body.
> 
> However, when I enable chunked encoding, the same 9381 bytes 
> body, gets stored in the r->request_body->temp_file.
> 
> To avoid getting stored in temp_file, I have to increase the 
> client_body_buffer_size to a larger value than the default. In 
> that case, chunked encoded http body is NOT stored in temp_file 
> and we are able to process it.
> 
> Is there any reason why the behaviour of client_body_buffer_size 
> is different in case of regular HTTP traffic v/s chunked encoded 
> HTTP traffic? Why do we need a larger buffer size to ensure 
> chunked encoded traffic doesn't get stored in temp_file?

The client_body_buffer_size defaults to 8192 bytes, and this means 
that nginx can store up to 8192 bytes of raw data without using 
disk buffering.  If you are lucky enough, some request body bytes 
can also happen to be in the last client header buffer (and 9381 
you are seeing suggests it's the case).

With chunked encoding you'll likely get less space in the header 
buffer due to "Transfer-Encoding: chunked" additional header.  
Further, some space in the client body buffer will be spent on the 
chunked encoding framing.  Hence when using chunked encoding 
you'll need a larger buffer to keep the body of the same size in 
memory.

-- 
Maxim Dounin
http://mdounin.ru/



More information about the nginx mailing list