FastCGI multiplexing?

Denis F. Latypoff denis at gostats.ru
Mon Jan 14 20:14:59 MSK 2008


Hello Manlio,

Monday, January 14, 2008, 10:54:53 PM, you wrote:

> Igor Clark ha scritto:
>> On 14 Jan 2008, at 13:46, Manlio Perillo wrote:
>> 
>>> Igor Clark ha scritto:
>>>> Hi Igor and everyone,
>>>> I'm toying with some ideas for a multithreaded FastCGI application, 
>>>> intended to work with nginx.
>>>> Seems that FCGI request/connection multiplexing would be an extremely 
>>>> valuable feature.
>>>> I can't find any reference to this on the wiki, in the mailing list 
>>>> or on Google - I assume this is because nginx, like Apache, doesn't 
>>>> support FastCGI multiplexing. Is this correct? If so, are there any 
>>>> plans to implement it at some point in the future?
>>>
>>> As far as I know the multiplexing support in FastCGI is broken "by 
>>> design".
>>>
>>> Read this response one of the authors of Twisted gave me about FastCGI 
>>> (among other questions):
>>> http://twistedmatrix.com/pipermail/twisted-web/2006-April/002598.html
>> 
>> Thanks Manlio, that's very interesting. Lack of flow control in the 
>> protocol is obviously an issue for multiplexing; now that it's been 
>> pointed out, it seems bizarre that it should have been missed out. One 
>> wonders if the intention was for the application to send an HTTP 503 
>> over the FCGI connection in the event of overloading? 

> Maybe they just though that overflow is not possible, who knows.
> TCP, as an example, has some form of flow control (but usually FastCGI 
> uses an UDP connection)


>> I guess this would 
>> require a web server module to back off from overloaded application 
>> instances based on their HTTP status code - which seems like trying to 
>> patch up the shortcomings of the transport in the application.
>> 
>> It's a shame; it seemed that removing all the TCP overhead between the 
>> web server and the application server would be a good thing, but perhaps 
>> FCGI just isn't the way. 

> But with FCGI you can just execute one request at a time, using a 
> persistent connection.

> The problems, with nginx, are:
> 1) the upstream module does not supports persistent connections.
>     A new connection is created for every request.
>     In fact the http proxy supports HTTP 1.0 with the backend.
> 2) nginx does not supports some forms of connections queue with upstream
>     servers.
>     This means that if nginx is handling 500 connections, then it will
>     make 500 concurrent connections to the upstream server, and likely
>     the upstream server (usually "a toy") will not be able to handle this


> Fixing this will require a redesign of the upstream module.

OR

create a special layer (say multiplexing proxy) which holds all 500
concurrent connections and pass only number of connections which fcgi backlog
allows.

OR

create a second fastcgi library which is non-blocking and threaded: main process
is accepts and process requests, all other threads are run app (similar to
mod_wsgi, isn't it?)


>> I'm still just researching the area at the 
>> moment though so any further thoughts or experiences would be very welcome.
>> 
>> Is there any plan to implement HTTP/1.1 & keepalive connections in 
>> nginx's conversations with upstream servers? Can't see anything in the 
>> wiki or feature request list.
>> 


> Igor Sysoev has expressed his intentions to add support for persistent 
> upstream connections, try searching the mailing list archives.

>> Cheers,
>> Igor
>> 
>> -- 
>> Igor Clark // POKE // 10 Redchurch Street // E2 7DD // +44 (0)20 7749 
>> 5355 // www.pokelondon.com
>> 


-- 
Best regards,
 Denis                            mailto:denis at gostats.ru






More information about the nginx mailing list