PHP-FPM does have some advantages depending on the solution and the common path is to use Nginx with PHP-FPM. However what happens when you want to utilize the normal features of Apache, such as basics like .htaccess files, but still keep the tuning options open that come with PHP-FPM? Well, there is a module for that!
This guide is going to assume a fresh Ubuntu 14.04 server to illustrate everything from start to finish, and will assume that all sites on this server will use the same php-fpm pool.
First, installed the required packages for your web server:
[root@web01 ~]# apt-get update [root@web01 ~]# apt-get install php5-fpm apache2 libapache2-mod-fastcgi
Now update the Apache configuration to use the mpm_event_module instead of the mpm_prefork_module:
[root@web01 ~]# a2enmod actions [root@web01 ~]# apache2ctl -M | grep mpm [root@web01 ~]# a2dismod mpm_prefork [root@web01 ~]# a2dismod mpm_worker [root@web01 ~]# a2enmod mpm_event
Then tell Apache to send all PHP requests over to PHP-FPM by creating a new configuration file:
[root@web01 ~]# vim /etc/apache2/conf-available/php.conf <IfModule mod_fastcgi.c> AddHandler php5.fcgi .php Action php5.fcgi /php5.fcgi Alias /php5.fcgi /usr/lib/cgi-bin/php5.fcgi FastCgiExternalServer /usr/lib/cgi-bin/php5.fcgi -socket /var/run/php-fpm.sock -pass-header Authorization -idle-timeout 3600 <Directory /usr/lib/cgi-bin> Require all granted </Directory> </IfModule>
Enable the new Apache PHP configuration:
[root@web01 ~]# a2enconf php.conf
Confirm PHP-FPM is set to use sockets instead of TCP connections for performance purposes, and also confirm the following additional settings:
[root@web01 ~]# vim /etc/php5/fpm/pool.d/www.conf ; listen = 127.0.0.1:9000 listen = /var/run/php-fpm.sock ... listen.owner = www-data listen.group = www-data listen.mode = 0660 user = www-data group = www-data
Restart Apache and PHP-FPM to apply the changes:
[root@web01 ~]# service apache2 restart [root@web01 ~]# service php5-fpm restart
If you are using a software firewall on the server, open ports 80/443 accordingly. This example will open them up to the world. Adjust yours accordingly:
[root@web01 ~]# ufw allow 80 [root@web01 ~]# ufw allow 443
Finally, test a site to ensure PHP is working and is using PHP-FPM by creating the file below, then visiting the page at x.x.x.x/info.php:
[root@web01 ~]# vim /var/www/html/info.php <?php phpinfo(); ?>
And your done!
Using multiple PHP-FPM pools
What happens if you want to isolate each site to their own PHP-FPM pool instead of using a shared pool? That is easy enough to do. Assuming that you followed everything in this guide to get to this point, do the following.
First, disable the global Apache configuration for PHP:
[root@web01 ~]# a2disconf php.conf
Create a new PHP-FPM pool for this specific site and update it accordingly:
[root@web01 ~]# cp /etc/php5/fpm/pool.d/www.conf /etc/php5/fpm/pool.d/example.com.conf [root@web01 ~]# vim /etc/php5/fpm/pool.d/example.com.conf ; listen = 127.0.0.1:9000 listen = /var/run/www.example.com-php5-fpm.sock ... listen.owner = www-data listen.group = www-data listen.mode = 0660 user = www-data group = www-data
Then update the site’s Apache vhost to point to a new PHP-FPM pool in both the 80 and 443 stanzas. Be sure to update the socket accordingly for your site in the 2 sections below! (ie: -socket /var/run/www.example.com-php5-fpm.sock)
[root@web01 ~]# vim /etc/apache2/sites-enabled/example.com.conf <VirtualHost *:80> ServerName example.com ServerAlias www.example.com DocumentRoot /var/www/vhosts/example.com # Send PHP requests to php-fpm <IfModule mod_fastcgi.c> AddHandler php5.fcgi .php Action php5.fcgi /php5.fcgi Alias /php5.fcgi /usr/lib/cgi-bin/php5.fcgi FastCgiExternalServer /usr/lib/cgi-bin/php5.fcgi -socket /var/run/www.example.com-php5-fpm.sock -pass-header Authorization -idle-timeout 3600 <Directory /usr/lib/cgi-bin> Require all granted </Directory> </IfModule> ... <VirtualHost *:443> ServerName example.com ServerAlias www.example.com DocumentRoot /var/www/vhosts/example.com # Send PHP requests to php-fpm <IfModule mod_fastcgi.c> AddHandler php5.fcgi .php Action php5.fcgi /php5.fcgi Alias /php5.fcgi /usr/lib/cgi-bin/php5.fcgi FastCgiExternalServer /usr/lib/cgi-bin/php5.fcgi -socket /var/run/www.example.com-php5-fpm.sock -pass-header Authorization -idle-timeout 3600 <Directory /usr/lib/cgi-bin> Require all granted </Directory> </IfModule> ...
Then restart the services:
[root@web01 ~]# systemctl restart php5-fpm [root@web01 ~]# systemctl restart apache2
Finally, test a site to ensure PHP is working and is using PHP-FPM by creating the file below, then visiting the page at example.com/info.php:
[root@web01 ~]# vim /var/www/vhosts/example.com/info.php <?php phpinfo(); ?>
And your done!