Over a million developers have joined DZone.

Upstream PHP-FPM for Better Performance

Learn how to improve PHP-FPM performance using upstream and Nginx.

· Performance Zone

Download Forrester’s “Vendor Landscape, Application Performance Management” report that examines the evolving role of APM as a key driver of customer satisfaction and business success, brought to you in partnership with BMC.

PHPFPM is a mighty beast, but throw too much its way and it will crash and burn. If you’re running your application via a PHP socket, consider load balancing the traffic and passing it to multiple PHP processes. Here, you can learn how to improve PHP-FPM performance using upstream and Nginx.

In order to do that, you will first have to decide how many processes your server can afford. I tend to go with one process per processor unless I’m running it on t2.micro in which case I put two. I’d suggest you check how the CPU of your application responds to more ports and adjust accordingly. For the purpose of this example, I will be load balancing PHP-FPM on two ports.

Let’s start with setting up the PHP side of it first. Find the following file first: /etc/php5/fpm/pool.d/www.conf

Here you will see something along these lines:


; Unix user/group of processes
; The address on which to accept FastCGI requests.
; Valid syntaxes are:
; 'ip.add.re.ss:port' - to listen on a TCP socket to a specific address on
; a specific port;
; 'port' - to listen on a TCP socket to all addresses on a
; specific port;
; '/path/to/unix/socket' - to listen on a unix socket.
; Note: This value is mandatory.
listen = /var/run/php5-fpm.sock

Copy the file into /etc/php5/fpm/www-common and remove the lines I marked in red from it. The rest should stay the same. This will be a shared file that you will include in configuration for each of the ports.

Now remove /etc/php5/fpm/pool.d/www.conf altogether.

Once that’s done, create as many configuration files for each of the ports you will be running that will follow this format.

In my example, I will be creating: /etc/php5/fpm/pool.d/www-ip9001.conf and /etc/php5/fpm/pool.d/www-ip9002.conf  with following content:

listen =

Where X is the number of port, i.e. 9001 and 9002 in the example above.

Now that’s done, let’s move to the Nginx side of our application. In your site configuration make sure to add on top, before any of the server declarations:

upstream php5-fpm {    
    server localhost:9001 max_fails=3 fail_timeout=30;
    server localhost:9002 max_fails=3 fail_timeout=30;

And then replace your fastcgi_pass unix:/var/run/php5-fpm.sock; with:

fastcgi_pass php5-fpm;

Now you can restart php and Nginx and your site should have slightly more redundancy.

sudo service php5-fpm reload && sudo service nginx reload

See Forrester’s Report, “Vendor Landscape, Application Performance Management” to identify the right vendor to help IT deliver better service at a lower cost, brought to you in partnership with BMC.

devops,tips & tricks,php,php-fpm

The best of DZone straight to your inbox.

Please provide a valid email address.

Thanks for subscribing!

Awesome! Check your inbox to verify your email so you can start receiving the latest in tech news and resources.

{{ parent.title || parent.header.title}}

{{ parent.tldr }}

{{ parent.urlSource.name }}