How to configure Apache to run PHP as FastCGI on Ubuntu 12.04 via terminal?
Thanks for previous answers they got me most of the way, but to get things working I had to combine instructions from a few places, so thought I would write up a complete set of commands.
FYI I'm running Ubuntu 14.04, Apache 2.4, and also had modphp running by default, previous instructions also left out the need to disable modphp.
I also found http://blog.starcklin.com/2013/08/install-mod-fastcgi-and-php5-fpm-on-ubuntu/ to be very informative and straightforward.
Just run the following commands in a terminal one after the other.
First install the necessary packages (I leave out php5 as this assumes it's already installed, add it back in for a first time install). Also note from Apache 2.4 up you can use the event-mpm instead of worker see http://www.vps.net/blog/2013/04/08/apache-mpms-prefork-worker-and-event/. My example shows worker, but just replace the word worker with event if you'd rather use that.
sudo apt-get install apache2-mpm-worker
sudo apt-get install libapache2-mod-fastcgi php5-fpm
Now enable mods you need, and disable those you don't.
sudo a2dismod php5 mpm_prefork
sudo a2enmod actions fastcgi alias mpm_worker
Create the php5.fcgi file and give the webserver permission to use it.
sudo touch /usr/lib/cgi-bin/php5.fcgi
sudo chown -R www-data:www-data /usr/lib/cgi-bin
Create a global config for php5-fpm
sudo nano /etc/apache2/conf-available/php5-fpm.conf
paste in the following (we'll use a socket instead of IP address)
<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/php5-fpm.sock -pass-header Authorization -idle-timeout 3600
<Directory /usr/lib/cgi-bin>
Require all granted
</Directory>
</IfModule>
Enable the php5-fpm conf
sudo a2enconf php5-fpm
Restart apache and fpm
sudo service apache2 restart && sudo service php5-fpm restart
As per other instructions paste the following into a new browseable php file on your webserver.
<?php phpinfo();
Open the file you just edited in a web browser, If you see "FPM/FastCGI" next to Server API, you are now serving PHP with FastCGI!
I finally found a nice tutorial geared at doing just this. I will outline the steps I took as I already had my LAMP stack installed but the full tutorial can be found here.
Note for the new:
In the tutorial, it begins by switching to the root user with:
sudo su
In my case I simply prefixed those commands sudo
instead of switching users, so I will be documenting my steps that way.
Begin
Step one: Install the Apache Worker MPM (Multi-Procesing Modules)
sudo apt-get install apache2-mpm-worker
This replaces the prefork I had installed which is the default when installing Apache.
Step 2: Install PHP5 and necessary modules
sudo apt-get install libapache2-mod-fastcgi php5-fpm php5
At this point you may get an error installing 'libapache2-mod-fastcgi':
Reading package lists... Done
Building dependency tree
Reading state information... Done
Package libapache2-mod-fastcgi is not available, but is referred to by another package.
This may mean that the package is missing, has been obsoleted, or is only available from another source
E: Package 'libapache2-mod-fastcgi' has no installation candidate
This part is not in the above tutorial
To reconcile this, the multiverse
repository must be added to the apt sources.
To do this:
sudo nano /etc/apt/sources.list
To which I appended the following lines:
deb http://archive.ubuntu.com/ubuntu precise multiverse
deb http://archive.ubuntu.com/ubuntu precise-updates multiverse
deb http://security.ubuntu.com/ubuntu precise-security multiverse
precise
in this case refers to my version of Ubuntu "Precise Pangolin".
So now, save those changes and back to terminal:
sudo apt-get update
and again:
sudo apt-get install libapache2-mod-fastcgi php5-fpm php5
which will (should) now work.
Now enable these Apache modules:
sudo a2enmod actions fastcgi alias
restart apache
sudo service apache2 restart
Step 3: Apache configuration
To make Apache work with PHP-FPM, we need the following configuration:
<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 -host 127.0.0.1:9000 -pass-header Authorization
<Directory /usr/lib/cgi-bin>
Require all granted
</Directory>
#directory statement mult be on multiple lines
</IfModule>
Note:
If you're using an older version of Apache (2.3.x or older), leave out the line
<Directory /usr/lib/cgi-bin> Require all granted </Directory>
You can check your installed version with the command
apache2 -version
You can put it in the global Apache configuration (so it's enabled for all vhosts), for example in /etc/apache2/conf.d/php5-fpm.conf
(this file does not exist, so you must create it), or you can place it in each vhost that should use PHP-FPM.
I choose to go the global route, so:
sudo nano /etc/apache2/conf.d/php5-fpm.conf
paste in the code block above, and save, exit.
This new file will be automatically loaded by Apache's default configuration which loads all files in the /etc/apache2/conf.d/
directory.
restart Apache:
sudo service apache2 restart
Now create the following PHP file in the document root /var/www
:
sudo nano /var/www/info.php
Add:
<?php phpinfo();
save & exit.
Now we call that file in a browser (e.g. http://your-server-ip/info.php
)
Under Server API at the top you should see FPM/FastCGI
.
Success!
For more information like how to change PHP-FPM to use a unix socket instead of the default TCP port or how to configure this for individual virtual hosts instead of all of them, see the source tutorial linked at the top.