Setting up nginx on Ubuntu 12.04 LTS for a test server

This guide walks through the steps of setting up nginx on a test server for use with a WordPress site. This guide assumes you already have Ubuntu 12.04 installed.

For this guide we will be setting up nginx from source.  First we need to install the pre-requisites.

1
sudo apt-get install libpcre3-dev build-essential libssl-dev

Next you will need to download the source from the nginx download page For this article we will assume the current version is 1.2.8.

1
2
3
4
5
cd /opt/
sudo wget http://nginx.org/download/nginx-1.2.8.tar.gz
sudo tar xvzf nginx-1.2.8.tar.gz
cd /opt/nginx-1.2.8/
sudo ./configure --prefix=/opt/nginx --user=nginx --group=nginx --with-http_ssl_module

After the the configure step please review the location of the configuration files. It should be displayed in the output of the configure command. After that we can compile and install it.

1
2
sudo make
sudo make install

Now we need to create the user for the nginx process.

1
sudo adduser --system --no-create-home --disabled-login --disabled-password --group nginx

Next we need to create a startup script in /etc/init.d/nginx

1
sudo vi /etc/init.d/nginx

Then add the following to the bash script.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
#! /bin/sh
 
### BEGIN INIT INFO
# Provides:          nginx
# Required-Start:    $all
# Required-Stop:     $all
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: starts the nginx web server
# Description:       starts nginx using start-stop-daemon
### END INIT INFO
 
PATH=/opt/nginx/sbin:/sbin:/bin:/usr/sbin:/usr/bin
DAEMON=/opt/nginx/sbin/nginx
NAME=nginx
DESC=nginx
 
test -x $DAEMON || exit 0
 
# Include nginx defaults if available
if [ -f /etc/default/nginx ] ; then
        . /etc/default/nginx
fi
 
set -e
 
case "$1" in
  start)
        echo -n "Starting $DESC: "
        start-stop-daemon --start --quiet --pidfile /opt/nginx/logs/$NAME.pid \
                --exec $DAEMON -- $DAEMON_OPTS
        echo "$NAME."
        ;;
  stop)
        echo -n "Stopping $DESC: "
        start-stop-daemon --stop --quiet --pidfile /opt/nginx/logs/$NAME.pid \
                --exec $DAEMON
        echo "$NAME."
        ;;
  restart|force-reload)
        echo -n "Restarting $DESC: "
        start-stop-daemon --stop --quiet --pidfile \
                /opt/nginx/logs/$NAME.pid --exec $DAEMON
        sleep 1
        start-stop-daemon --start --quiet --pidfile \
                /opt/nginx/logs/$NAME.pid --exec $DAEMON -- $DAEMON_OPTS
        echo "$NAME."
        ;;
  reload)
          echo -n "Reloading $DESC configuration: "
          start-stop-daemon --stop --signal HUP --quiet --pidfile     /opt/nginx/logs/$NAME.pid \
              --exec $DAEMON
          echo "$NAME."
          ;;
      *)
            N=/etc/init.d/$NAME
            echo "Usage: $N {start|stop|restart|reload|force-reload}" >&2
            exit 1
            ;;
    esac
 
    exit 0

Next we’ll make the script executable and have it run at startup.

1
2
sudo chmod +x /etc/init.d/nginx
sudo /usr/sbin/update-rc.d -f nginx defaults

Now start the server

1
sudo /etc/init.d/nginx start

Now we need to configure PHP using FastCGI. Execute the following commands install FastCGI for PHP.

1
sudo apt-get install php5-cli php5-cgi psmisc spawn-fcgi

Create the following file using your favoriate linux/unix text editor at /usr/bin/php-fastcgi.

1
sudo vi /usr/bin/php-fastcgi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#!/bin/sh
 
if [ `grep -c "nginx" /etc/passwd` = "1" ]; then 
   FASTCGI_USER=nginx
elif [ `grep -c "www-data" /etc/passwd` = "1" ]; then 
   FASTCGI_USER=www-data
elif [ `grep -c "http" /etc/passwd` = "1" ]; then 
   FASTCGI_USER=http
else 
# Set the FASTCGI_USER variable below to the user that 
# you want to run the php-fastcgi processes as
 
FASTCGI_USER=
fi
 
SOCKET=/var/run/php-fastcgi/php-fastcgi.socket
PIDFILE=/var/run/php-fastcgi/php-fastcgi.pid
CHILDREN=6
PHP5=/usr/bin/php5-cgi
 
/usr/bin/spawn-fcgi -s $SOCKET -P $PIDFILE -C $CHILDREN -u $FASTCGI_USER -g $FASTCGI_GROUP -f $PHP5

At this point you want to make sure you have a folder in /var/run/php-fastcgi. If not you will need to create it and give the nginx user permission to it.

1
2
sudo mkdir /var/run/php-fastcgi
sudo chown nginx:root /var/run/php-fastcgi

Now we will create the init script for fastcgi. Create the file /etc/init.d/php-fastcgi.

1
sudo vi /etc/init.d/php-fastcgi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#!/bin/bash
 
### BEGIN INIT INFO                                                                                                                     
# Provides:          php-fastcgi                                                                                                        
# Required-Start:    $remote_fs $syslog                                                                                                 
# Required-Stop:     $remote_fs $syslog                                                                                                 
# Default-Start:     2 3 4 5                                                                                                            
# Default-Stop:      0 1 6                                                                                                              
# Short-Description: Start daemon at boot time                                                                                          
# Description:       Enable service provided by daemon.                                                                                 
### END INIT INFO                                                                                                                       
 
 
 
if [ `grep -c "nginx" /etc/passwd` = "1" ]; then 
   FASTCGI_USER=nginx
elif [ `grep -c "www-data" /etc/passwd` = "1" ]; then 
   FASTCGI_USER=www-data
elif [ `grep -c "http" /etc/passwd` = "1" ]; then 
   FASTCGI_USER=http
else 
# Set the FASTCGI_USER variable below to the user that 
# you want to run the php-fastcgi processes as
 
FASTCGI_USER=
fi
 
PHP_SCRIPT=/usr/bin/php-fastcgi
RETVAL=0
case "$1" in
    start)
      sudo -u $FASTCGI_USER $PHP_SCRIPT
      RETVAL=$?
  ;;
    stop)
      killall -9 php5-cgi
      RETVAL=$?
  ;;
    restart)
      killall -9 php5-cgi
      sudo -u $FASTCGI_USER $PHP_SCRIPT
      RETVAL=$?
  ;;
    *)
      echo "Usage: php-fastcgi {start|stop|restart}"
      exit 1
  ;;
esac      
exit $RETVAL

Now we can start the new service

1
sudo /etc/init.d/php-fastcgi start

Then we need to add it to the init scripts so it starts up on reboot.

1
sudo update-rc.d /etc/init.d/php-fastcgi defaults

Now to finalize the nginx configuration. I prefer to use a separate config file per site so I modified the /opt/nginx/conf/nginx.conf file by adding this line.

1
2
3
4
5
6
7
8
9
10
11
12
...
gzip  on;
    gzip_http_version 1.1;
    gzip_disable "MSIE [1-6]\.(?!.*SV1)";
    gzip_types text/plain text/css
               application/x-javascript text/xml
               application/xml application/xml+rss
               text/javascript;
include /opt/etc/nginx/sites-enabled/*;
 
server {
...

In addition I turned the gzip on, this is a test server so you may want to keep it off, but I prefer to keep my test server as close to production as I can. Next I create a config based on the site. Lets pretend it’s this site adamruggles.net.

1
sudo vi /opt/etc/nginx/sites-available/adamruggles.net.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
server {
    listen   80;
    server_name test.adamruggles.net www.adamruggles.net adamruggles.net;
    access_log /srv/adamruggles.net/logs/access.log;
    error_log /srv/adamruggles.net/logs/error.log;
    root /srv/adamruggles.net/public;    
 
    location / {
        try_files $uri $uri/ /index.php?$args;
        index  index.html index.htm index.php;
    }
 
    rewrite /wp-admin$ $scheme://$host$uri/ permanent;
 
    location ~ \.php$ {
        try_files $uri = 404;
        fastcgi_split_path_info ^(.+.php)(.*)$;
        fastcgi_pass unix:/var/run/php-fastcgi/php-fastcgi.socket;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME /srv/adamruggles.net/public$fastcgi_script_name;
        include /opt/nginx/conf/fastcgi_params;
    }

Some parts of this configuration are specifically for WordPress. If you’re not using WordPress the you can modify the rewrite rule and the location / try files. Review nginx’s documentation for your configuration.

Next we create a symlink (this is very similar to how the ubuntu config works and I like it).

1
sudo ln -s /opt/etc/nginx/sites-available/adamruggles.net.conf /opt/etc/nginx/sites-enabled/adamruggles.net.conf

You will obviously want to change all he references to adamruggles.net to whatever domain you’re building your website for. I usually use the ip address for testing servers since they’re virtualized and I haven’t setup DNS for my virtual machines. At this point you can restart nginx so the new configuration takes affect.

1
sudo /etc/init.d/nginx restart

If you encounter any issues following this guide please leave a comment and I’ll address your issue.


Comments are closed.