Nginx (pronounced “engine X”) is a lightweight, high-performance Web server/reverse proxy and e-mail (IMAP/POP3) proxy, licensed under a BSD-like license. It runs on UNIX, GNU/Linux, BSD variants, Mac OS X, Solaris, and Microsoft Windows .

There are some required libraries and tools for installing the web server, some parameters that you will have to decide upon when compiling the binaries, and some extra configuration to do on your system.

As you can see, this time we choose to download the source code application and install it manually instead of using the package manager. There are several reasons why people choose to install it manually:
1. the package may not be available in the repositories of our Linux distribution
2. We would know more about how this f**king awesome web server system that we use work.
in addition, the rare repositories that offer to download and install latest stable Nginx version automatically using package manager ( Yum | Pacman | Aptitude | Yast); mostly contain outdated versions.

Following this guide, you may can watch the video below I’ve made before

First, let’s download our web server from http://nginx.org/download/nginx-1.0.5.tar.gz
(When I write this article the latest stable version is 1.0.5)

wget http://nginx.org/download/nginx-1.0.5.tar.gz

then copy source to /usr/local/src and extract it

tar -xvzf /usr/local/src/nginx-1.0.5.tar.gz

Note :
1. before we start the installation process, it always better to check whether port 80 is being used or not. I’ve use BackTrack distribution and by default apache uses port 80, stop it. /etc/init.d/apache2 stop or killall apache2
2. Nginx is a program written in C, so you will first need to install a compiler tool such as the GNU Compiler Collection (GCC) on your system. GCC usually comes with most distributions.
to make sure GCC is already installed on your system, simply run “gcc” ( without quote ). If you get the following output “gcc: no input files” , GCC is correctly installed on your system. Otherwise, you need to install it.

go to the folder nginx-1.0.5 under /usr/local/src directory and start compiling.

cd /usr/local/src/nginx-1.0.5
 ./configure

Info :
By default, installing Nginx will automatically install HTTP rewrite module too. This module requires PCRE (Perl Compatible Regular Expression) library for HTTP Rewrite and Core modules. Nginx uses PCRE for their regular expressions syntax.
Now depending on your choice, if you:
1. requires a rewrite module, you should install PCRE:

apt-get install libpcre3 libpcre3-dev

2. otherwise, if you do not need it. Configure nginx without HTTP rewrite module

./configure --without-http_rewrite_module

My site require those rewrite module. So i’ve decide to install PCRE to enable the Nginx HTTP rewrite module. So after installing PCRE, we should reconfigure Nginx again.

./configure

See image below. if you get following output you’ve configure nginx correctly.

Continue the installation process

make && make install

The default installation process like I did will place the nginx workspace in the /usr/local/nginx directory

create an init script for nginx

create file named “nginx” under /etc/init.d directory

nano /etc/init.d/nginx

then copy and paste the shell script below and save

#! /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=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
DAEMON=/usr/local/nginx/sbin/nginx
NAME=nginx
DESC="nginx daemon"

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 /usr/local/nginx/logs/nginx.pid \
            --exec $DAEMON -- $DAEMON_OPTS
        echo "$NAME."
        ;;
    stop)
        echo -n "Stopping $DESC: "
        start-stop-daemon --stop --quiet --pidfile /usr/local/nginx/logs/nginx.pid \
            --exec $DAEMON
        echo "$NAME."
        ;;
    restart|force-reload)
        echo -n "Restarting $DESC: "
        start-stop-daemon --stop --quiet --pidfile \
            /usr/local/nginx/logs/nginx.pid --exec $DAEMON
        sleep 1
        start-stop-daemon --start --quiet --pidfile \
            /usr/local/nginx/logs/nginx.pid --exec $DAEMON -- $DAEMON_OPTS
        echo "$NAME."
        ;;
    reload)
        echo -n "Reloading $DESC configuration: "
        start-stop-daemon --stop --signal HUP --quiet --pidfile /usr/local/nginx/logs/nginx.pid \
            --exec $DAEMON
        echo "$NAME."
        ;;
    *)
    N=/etc/init.d/$NAME
    echo "Usage: $N {start|stop|restart|force-reload}" >&2
    exit 1
    ;;
esac
exit 0

chmod +x so the scripts can be executed

chmod +x /etc/init.d/nginx

After this, you can start, stop, restart or reload nginx daemon through the script.
Let’s try run nginx server

/etc/init.d/nginx start

then you should get a gretting message “welcome to nginx!” when accessing localhost from your browser.

Installing and configuring PHP FAST CGI (spawn-fcgi) with nginx

apt-get install php5-cgi spawn-fcgi

after the installing with the package manager finished, create file named php-fastcgi under /etc/init.d directory

nano /etc/init.d/php-fastcgi

Copy and paste the shell script below.

#!/bin/bash
BIND=127.0.0.1:9000
USER=www-data
PHP_FCGI_CHILDREN=15
PHP_FCGI_MAX_REQUESTS=1000

PHP_CGI=/usr/bin/php-cgi
PHP_CGI_NAME=`basename $PHP_CGI`
PHP_CGI_ARGS="- USER=$USER PATH=/usr/bin PHP_FCGI_CHILDREN=$PHP_FCGI_CHILDREN PHP_FCGI_MAX_REQUESTS=$PHP_FCGI_MAX_REQUESTS $PHP_CGI -b $BIND"
RETVAL=0

start() {
    echo -n "Starting PHP FastCGI: "
    start-stop-daemon --quiet --start --background --chuid "$USER" --exec /usr/bin/env -- $PHP_CGI_ARGS
    RETVAL=$?
    echo "$PHP_CGI_NAME."
}
stop() {
    echo -n "Stopping PHP FastCGI: "
    killall -q -w -u $USER $PHP_CGI
    RETVAL=$?
    echo "$PHP_CGI_NAME."
}

case "$1" in
    start)
        start
        ;;
    stop)
        stop
        ;;
    restart)
        stop
        start
        ;;
    *)
    echo "Usage: php-fastcgi {start|stop|restart}"
    exit 1
    ;;
esac
exit $RETVAL

Do not forget to chmod +x so the script can be executed

then before run the php-fastcgi, build our website structure. (I chose the /var/www/nginx directory)

mkdir /var/www/nginx; cd nginx

create phpinfo file named info.php to make sure php is working with nginx

echo "<? php phpinfo ();?>"> info.php

then edit nginx configuration to fit with our website structure.

nano /usr/local/nginx/conf/nginx.conf

with the following configuration : (Note that our root public html was in /var/www/nginx)

#user  nobody;
worker_processes  1;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;

events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;

    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';

    #access_log  logs/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;

    server {
        listen       80;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
            root   /var/www/nginx;
            index  index.html index.htm;
        }

        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

        # proxy the PHP scripts to Apache listening on 127.0.0.1:80
        #
        #location ~ \.php$ {
        #    proxy_pass   http://127.0.0.1;
        #}

        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        location ~ \.php$ {
            root           html;
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  /var/www/nginx$fastcgi_script_name;
            fastcgi_param  PATH_INFO  $fastcgi_script_name;
            include        fastcgi_params;
        }

        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        #location ~ /\.ht {
        #    deny  all;
        #}
    }

    # another virtual host using mix of IP-, name-, and port-based configuration
    #
    #server {
    #    listen       8000;
    #    listen       somename:8080;
    #    server_name  somename  alias  another.alias;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}

    # HTTPS server
    #
    #server {
    #    listen       443;
    #    server_name  localhost;

    #    ssl                  on;
    #    ssl_certificate      cert.pem;
    #    ssl_certificate_key  cert.key;

    #    ssl_session_timeout  5m;

    #    ssl_protocols  SSLv2 SSLv3 TLSv1;
    #    ssl_ciphers  HIGH:!aNULL:!MD5;
    #    ssl_prefer_server_ciphers   on;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}

}

note that I replace root and fastcgi_param SCRIPT_FILENAME variable  ( see video above @ minutes 7.00)

to make sure out configuration are correct, we can run the command as follows:

/usr/local/nginx/sbin/nginx -t

if the syntax are correct, we can reload Nginx daemon using the init file we’ve made before.

/etc/init.d/nginx restart

Test accessing info.php through your browser. http://localhost/test.php
From there we can determine if nginx was was successfuly run with php or not.

You can download nginx and php-fastcgi init script from my archive if you want.
Enjoy :D