Awesome
Example configuration of php-fpm
Introduction
This is an example configuration php-fpm
which is the preferred way of serving PHP with FastCGI. The old
php-cgi
is deprecated. You can even use a
patch for PHP versions prior to 5.3.3, when fpm
become an official PHP project.
Generalities
The way that php-fpm operates is through a master process that launches children processes (workers) that serve the requests. These workers can be run under a particular user. Making it appropriate for environments where there are several users each one running their own set of PHP apps.
php-fpm is pretty much a work in progress, although on one hand is IMHO the best thing to come out of PHP land in a lot of time, still lacks a lot of nice features like graceful restarts. Currently adding a new pool or reloading the config requires a full restart. Which causes some downtime. Work is in progress to provide graceful restarts/reloads like Nginx has.
It has the capacity to adjust the number of workers dynamically to the load, varying from a minimum to a specified maximum.
Load adequation
There's no algorithm for determining the number of children. It depends on your application.
A thread in the highload-php-en gives some tips on how to determine the number of children.
-
If your load is CPU bound then the rule is that the number of children should be equal to number of CPUs plus 20 %.
Example: Machine with 8 CPUs. Number of children = 10.
-
If your load is I/O bound then apply the following rule:
number_of_children = 1.2 * total_memory / average_space_per_process
Example: PHP processes occupying 256 MB of average space in a machine with 2GB of RAM that can be used for running this PHP application.
number_of_children = 1.2 * 2048 / 256
giving:
10
children.Determine the medium space occupied by a PHP process and apply the above formula. The 1.2 factor is just a security factor, to use a much abused engineering term.
Features
-
It uses a
UNIX
socket for connections from the web server to the FastCGI daemon. -
The
php.ini
is modified from the stock one that comes with the Debian package. The modifications were made by using a tiny script that I wrote for cleaning up a PHP config and that's available here on github. -
There's a single pool on this config that is run under the
www-data
user. -
Support for the status and ping functionalities of
php-fpm
. See here how to enable it for Nginx. -
Possbilitie of using three pools simultaneously to provide load balancing on the FCGI upstream.
Installation
-
Clone the git repo:
git://github.com/perusio/php-fpm-example-config
. -
Alter the
php-fpm.conf
and thepool.d/www.conf
file to your liking. Add any pool that you might want. -
Copy the files to the destination directory:
cp php5-fpm.conf /etc/php5/fpm
cp -a pool.d /etc/php5/fpm
-
(Re)start
php5-fpm
withservice php5-fpm restart
orservice php5-fpm start
if startingphp-fpm
anew.
Caveats
Remember to always do service php5-fpm restart
after adding a
new pool or modifying the configuration of an existing one.