Running LAMP Applications Using Nginx
While playing with WordPress on nginx for my last post, I discovered that a majority of the how-tos out there on running PHP/MySQL applications using nginx left a bit to desired. Here's the steps that I took to get my application (WordPress, specifically) working.
Install nginx, MySQL, and PHP
First, let's install nginx and PHP along with a few PHP libraries:
sudo apt-get install php5-mhash php5-mysql php5-odbc curl php5-curl php5-gd php5-imap nginx php5-cgi php5-cli php5-common
If you didn't already have MySQL installed on your server, you'll need that too:
sudo apt-get install mysql-server
The installer will prompt you to enter a root password. Make sure it's a fairly good password, but also be sure to record it as you'll need it later.
Install spawn-fcgi
Spawn-fcgi used to be included with lighttpd, but has been moved to its own project, so it can be downloaded separately. Unfortunately, the spawn-fcgi project is not in the Ubuntu repositories, so it has to be installed separately. First, download the tarball from the spawn-fcgi project page. As of this writing, it's on version 1.6.2. For this particular version, run the following from a directory your user can download to:
wget http://www.lighttpd.net/download/spawn-fcgi-1.6.2.tar.gz
Untar it:
tar zxf spawn-fcgi-1.6.2.tar.gz
Make sure you have the compilation tools:
sudo apt-get install build-essential
Now, navigate into the spawn-fcgi download directory and compile:
cd spawn-fcgi-1.6.2
./configure
make
Now, let's install it into /usr/bin:
cd src
sudo cp spawn-fcgi /usr/bin/
Now, let's make the init script. Copy the following example into /etc/init.d/fastcgi:
#!/bin/bash
PHP_SCRIPT=/usr/bin/php-fastcgi
RETVAL=0
case "$1" in
'start')
$PHP_SCRIPT
RETVAL=$?
;;
'stop')
killall -9 php5-cgi
RETVAL=$?
;;
'restart')
killall -9 php5-cgi
$PHP_SCRIPT
RETVAL=$?
;;
*)
echo “Usage: php-fastcgi {start|stop|restart}”
exit 1
;;
esac
exit $RETVAL
Next, let's create the script to launch the PHP CGI process. Copy the following example text into /usr/bin/php-fastcgi:
/usr/bin/spawn-fcgi -a 127.0.0.1 -p 9000 -C 5 -u www-data -g www-data -f /usr/bin/php5-cgi
Make sure the new scripts are executable:
chmod +x /usr/bin/php-fastcgi /etc/init.d/fastcgi
You should be able to start up your fastcgi process now with the following:
/etc/init.d/fastcgi start
Make the fastcgi process start at boot:
sudo update-rc.d fastcgi defaults
Setup nginx site
I used the following as my site file. A majority of it was taken from the default site and parts from other how-tos. You can rewrite the /etc/nginx/sites-available/default with this templated page (in my example, I assumed that the site is called site.com and that you are using WordPress at /var/www/wordpress). Be sure to change the "root" and "SCRIPT_FILENAME" lines.
server {
listen 80;
server_name site.com;
access_log /var/log/nginx/localhost.access.log;
location / {
root /var/www/wordpress;
index index.php;
if (-f $request_filename) {
expires 30d;
break;
}
if (!-e $request_filename) {
rewrite ^(.+)$ /index.php?q=$1 last;
}
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /var/www/nginx-default;
}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
location ~ .php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param QUERY_STRING $query_string;
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param CONTENT_TYPE $content_type;
fastcgi_param CONTENT_LENGTH $content_length;
fastcgi_param SCRIPT_FILENAME /var/www/wordpress$fastcgi_script_name;
include /etc/nginx/fastcgi_params;
}
}
Before restarting nginx, make sure everything is cool with the config and correct any errors:
sudo nginx -t
Now, restart nginx with the new changes:
sudo /etc/init.d/nginx restart
Install your application
You can now install your application as you normally would using Apache. In this example, you can download the WordPress packages to /var/www/wordpress and install from there, making sure that the files are owned by the www-data user.
Comments
Comments powered by Disqus