Dynamically Start/Stop FastCGI PHP Processes

Ok, so I’ve got a crazy idea, but it might just work.

Basically, we have a bunch of PHP pools managed with PHP-FPM. Each site
has its own single PHP-FPM worker for security reasons.

The majority of the sites don’t get much traffic, so the PHP processes
don’t need to be running eating up RAM and resources. My thought was
after N number of minutes of no requests to shut down that PHP worker
for that site. Then when a request comes in, hold the request in sort-of
a pause mode, start the worker for that site, and then forward off the
request. Sure there would be a slight delay on that first request to
spin up the worker, but should work beautifully.

Does nginx have any plugins to emulate this behavior? I.E. sort of
hooks? All I would need is a hook from nginx when a site is idle for X
number of second/minutes. For this first hook, we could write a simple
bash script which kills that PHP-FPM worker. Then another hook, when a
request comes in on a given site. Again, another bash script which first
checks if the PHP-FPM worker is up, if not, holds the requests, starts
the worker, and then forwards the request.

I was thinking at first, I can use node.js and write a middleware proxy
that sits between nginx and the PHP-FPM workers, but then quickly
realized the node.js app would have to speak cgi, and I didn’t want to
have to deal with that rubbish. :slight_smile:

Posted at Nginx Forum:

Am 15.03.2012 10:30 schrieb “justin” [email protected]:

a pause mode, start the worker for that site, and then forward off the

I was thinking at first, I can use node.js and write a middleware proxy
that sits between nginx and the PHP-FPM workers, but then quickly
realized the node.js app would have to speak cgi, and I didn’t want to
have to deal with that rubbish. :slight_smile:

What you’re looking for is php-fpm with 0 initial worker. I’m not sure
how
far its current progress but you should try asking php folks. In the
meantime you can config the pool to start with only one inital worker.

Awesome idea, but the minium appears to be 1. I tried 0 and get the
following:

Starting php-fpm: [14-Mar-2012 20:52:28] WARNING: [pool justin]
pm.start_servers is not set. It’s been set to 1.
[14-Mar-2012 20:52:28] WARNING: [pool simon] pm.start_servers is not
set. It’s been set to 1.

Posted at Nginx Forum:

Am 15.03.2012 10:53 schrieb “justin” [email protected]:

Awesome idea, but the minium appears to be 1. I tried 0 and get the
following:

Yes, it is work in progress.

Edho,

Appears to be working, commented out other directives such as
max_workers. Added the following:

pm = ondemand
pm.process_idle_timeout = 60
pm.max_children = 1

Posted at Nginx Forum:

On 03/15/2012 04:30 AM, justin wrote:

request. Sure there would be a slight delay on that first request to
I was thinking at first, I can use node.js and write a middleware proxy
that sits between nginx and the PHP-FPM workers, but then quickly
realized the node.js app would have to speak cgi, and I didn’t want to
have to deal with that rubbish. :slight_smile:

php-fpm support ‘ondemand’ governor so it will spawn processes as-needed
and kill them after specified period if not needed (keeping zero workers
for pool). This is what you are looking for.

– Piotr.

On 03/15/2012 09:39 AM, Piotr K. wrote:

On 03/15/2012 04:30 AM, justin wrote:

that sits between nginx and the PHP-FPM workers, but then quickly
realized the node.js app would have to speak cgi, and I didn’t want to
have to deal with that rubbish. :slight_smile:

php-fpm support ‘ondemand’ governor so it will spawn processes as-needed
and kill them after specified period if not needed (keeping zero workers
for pool). This is what you are looking for.

I’d be interested, whether there is something generic nginx specific,
which would allow to start / stop any fast-cgi / uwsgi service.

I think it could be rather intersting for a lot of rarely used services
where a startup penalty is not important.