history of Nginx
grzegorz.nosek at gmail.com
Wed May 7 14:58:48 MSD 2008
On Wed, May 07, 2008 at 12:32:38PM +0200, Manlio Perillo wrote:
> What are the difference between the Apache and Nginx multiprocess model?
> Nginx used a master process and all the worker call accept on the same
> But what about Apache?
I feel sort of qualified to answer :)
Apache uses a 1:1 relation between processed requests and execution
threads (where "threads" may well be standard Unix processes, and that
was actually the only way before Apache 2.0; read "threads or processes"
when you see "threads" further down).
OK, not exactly 1:1, as Apache keeps a pool of spare threads and the
threads themselves live much longer than connections.
Since Apache 2.0 the details of process model are delegated to a module
called "MPM" (multiprocessing model, IIRC). The most popular are
mpm_prefork (simple fork()) and mpm_worker (two-tiered architecture with
a bunch of processes, each having a number of pthreads). More exotic MPMs
include e.g. mpm_perchild (workers running under different uids, passing
FDs between each other) or mpm_event.
The Apache model has an advantage of simplicity as e.g. nothing prevents
you from blocking or sleeping in handlers but in incurs a much bigger
overhead, especially regarding memory usage.
As for accepting connections, it works more or less the same in Apache
(threads sleeping on a single accept mutex).
> Do you have considered corutines?
> There are some libraries that implement coroutines in C, using POSIX
> setcontext, longjmp or custom ASM code.
> As an example one librery with a nice API:
Me personally, I find coroutines hard to wrap my mind around and I
actually prefer the nginx "horde of callbacks" model.
More information about the nginx