Non-buffered backend

Igor Sysoev is at rambler-co.ru
Mon Dec 3 23:46:17 MSK 2007


On Mon, Dec 03, 2007 at 09:27:11PM +0100, Martin Schut wrote:

> First an easy question: what is does the postpone filter do? I can't find  
> it in the docs.

The postpone filter is internal filter. It is used to output responses of
several/included subrequests that run in parallel.

> On the next questions:
> 
> My current understanding of the webserver to send the response goes along  
> the following lines (I haven't spent much time reading the source yet):
> 
> 1. nginx receives the stream to send from the back-end, be it a static  
> file or one of the other back-end means and buffers this until this  
> streamis closed

No, nginx buffers until at least one configured buffer will be filled.
A client may get SSIed, gzipped, chunked, and SSLed response even
backend does not pass whole data.

> 2. nginx routes the stream through all the need modules
> 3. nginx sends the stream to the client

> I've a few questions regarding this:
> a. Are 2 & 3 indeed seperate steps or will everything be sent as soon at  
> is processed in chunks (as I actually expect).

Yes.

> b. Is it possible to not transfer control to next module (with  
> ngx_http_next_*) but to request more chunks (maybe return with NGX_AGAIN?)

Yes, but this is not enough. Writing filters is complex thing.

> c. What I actually would like to try (in a few weeks) is to skip the  
> buffering step between 1&2. I see 2 options for this: I. buffer a small  
> amount then call the modules and wait until I receive a request back for  
> more info. This has the disadvantage that the backend can not send it's  
> response at the highest rate possible if the modules are not fast enough);  

It's already implemented.

proxy_buffer   32;      # 32 bytes
proxy_buffers  4 32;

Besides, there is

proxy_buffering  off;

> II. Use 2 threads, the first to read from the backend and the second to  
> immediatly start feeding the stream into the modules. Any opinions about  
> these options and the possibility to implement this in nginx. Or maybe a  
> third possibility?

No, now nginx is not threads-safe.

Besides, using threads in this way is bad idea. The single reasonable
threads usage is to improve disk i/o parallelism.


-- 
Igor Sysoev
http://sysoev.ru/en/





More information about the nginx mailing list