Instalando Nginx (Engine-X) en Debian

Antes de instalar Nginx debemos de actualizar el repositorio del sistema, agregando los links necesarios para descargar la última versión de Nginx.
Actualización del repositorio en Debian
Actualizamos el repositorio de apt para poder descargar la última versión de Nginx.

vim /etc/apt/sources.list

Y agregamos las siguientes líneas.

deb http://nginx.org/packages/debian/ squeeze nginx
deb-src http://nginx.org/packages/debian/ squeeze nginx

En la siguiente url: http://nginx.org/packages/ están disponibles los paquetes para varias distribuciones de Linux.
Ahora para permitir que apt obtenga la lista de paquetes de las fuentes que especificamos ejecutamos el siguiente comando para actualizar el repositorio de apt.

apt-get update

Después de actualizado el repositorio procedemos a la instalación de Nginx.

apt-get install nginx

Verificamos que hayamos instalado la última versión (Chequear versión contra su página oficial en ingles)

root@server:~# nginx -v
      nginx version: nginx/1.2.3

Configurar Nginx como Webserver

Para realizar este paso ya debemos haber instalado Nginx, ver Instalando Nginx (Engine-X) en Debian.
Nginx soporta PHP sólo a través de FastCGI, por eso debemos de instalar y configurar spawn-fcgi he instalar el paquete de PHP php5-cgi.

FastCGI
Es la evolución de CGI (Common Gateway Interface), un protocolo concebido para responder a la demanda de páginas dinámicas. Hoy fast-cgi permite conectar (vía TCP) un servidor web cómo Nginx con otro servidor independiente que ejecuta las aplicaciones. En este caso aplicaciones que están desarrolladas en PHP y el servidor de aplicación es php-cgi.

Instalamos los paquetes requeridos

apt-get update
apt-get install php5-cli php5-cgi spawn-fcgi php5-common
apt-get install php5-curl php5-gd php5-json php5-mcrypt php5-sqlite php5-mysql

Creando directorios
En esta guía, el dominio “example.com” se utiliza como un sitio de ejemplo. Debe sustituir su propio nombre de dominio en los pasos de configuración siguiente. En primer lugar, crearemos los directorios para alojar los sitios y los logs de los mismos.

mkdir -p /var/www/example.com/htdocs
mkdir -p /var/www/example.com/logs
chown -R nginx.nginx /var/www/example.com

Creamos un archivo con la configuración para FastCGI y un script de arranque para el mismo.

vim /usr/bin/php-fastcgi

Le agregamos el siguiente contenido.

#!/bin/bash

FASTCGI_USER=nginx
FASTCGI_GROUP=nginx
ADDRESS=127.0.0.1
PORT=9000
PIDFILE=/var/run/php-fastcgi/php-fastcgi.pid
CHILDREN=6
PHP5=/usr/bin/php5-cgi

/usr/bin/spawn-fcgi -a $ADDRESS -p $PORT -P $PIDFILE -C $CHILDREN -u $FASTCGI_USER -g $FASTCGI_GROUP -f $PHP5

Marcamos el archivo recién creado como ejecutable.

chmod +x /usr/bin/php-fastcgi

Creamos el archivo de arranque para php-fastcgi llamado /etc/init.d/php-fastcgi con el siguiente contenido:

vim /etc/init.d/php-fastcgi
#!/bin/bash

PHP_SCRIPT=/usr/bin/php-fastcgi
FASTCGI_USER=nginx
FASTCGI_GROUP=nginx
PID_DIR=/var/run/php-fastcgi
PID_FILE=/var/run/php-fastcgi/php-fastcgi.pid
RET_VAL=0

case "$1" in
    start)
      if [[ ! -d $PID_DIR ]]
      then
        mkdir $PID_DIR
        chown $FASTCGI_USER:$FASTCGI_GROUP $PID_DIR
        chmod 0770 $PID_DIR
      fi
      if [[ -r $PID_FILE ]]
      then
        echo "php-fastcgi already running with PID `cat $PID_FILE`"
        RET_VAL=1
      else
        $PHP_SCRIPT
        RET_VAL=$?
      fi
  ;;
    stop)
      if [[ -r $PID_FILE ]]
      then
        kill `cat $PID_FILE`
        rm $PID_FILE
        RET_VAL=$?
      else
        echo "Could not find PID file $PID_FILE"
        RET_VAL=1
      fi
  ;;
    restart)
      if [[ -r $PID_FILE ]]
      then
        kill `cat $PID_FILE`
        rm $PID_FILE
        RET_VAL=$?
      else
        echo "Could not find PID file $PID_FILE"
      fi
      $PHP_SCRIPT
      RET_VAL=$?
  ;;
    status)
      if [[ -r $PID_FILE ]]
      then
        echo "php-fastcgi running with PID `cat $PID_FILE`"
        RET_VAL=$?
      else
        echo "Could not find PID file $PID_FILE, php-fastcgi does not appear to be running"
      fi
  ;;
    *)
      echo "Usage: php-fastcgi {start|stop|restart|status}"
      RET_VAL=1
  ;;
esac
exit $RET_VAL

Marcamos el archivo recién creado como ejecutable.

chmod +x /etc/init.d/php-fastcgi

Configuramos para que php-fastcgi arranque junto con el sistema, (arranque automático)

update-rc.d php-fastcgi defaults

Iniciamos el servicio

/etc/init.d/php-fastcgi start

Ahora procedemos a crear la configuración del virtual host para el dominio de prueba example.com.

vim /etc/nginx/sites-available/example.com.conf

Y le agregamos el siguiente contenido.

server {
    server_name www.example.com example.com;
    access_log /var/www/example.com/logs/access.log;
    error_log /var/www/example.com/logs/error.log;
    root /var/www/example.com/htdocs;

    location / {
        index  index.html index.htm index.php;
    }

    location ~ \.php$ {
        include /etc/nginx/fastcgi_params;
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME /var/www/example.com/htdocs$fastcgi_script_name;
    }
}

Ahora pasamos a editar el archivo de configuración principal de Nginx /etc/nginx/nginx.conf.
Dentro del contexto http hacemos el include que levantará todos los sitios habilitados linkeados en el directorio sites-enabled.

...
http {
    include       /etc/nginx/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  /var/log/nginx/access.log  main;
    sendfile        on;
    #tcp_nopush     on;
    keepalive_timeout  65;
    #gzip  on;
    include /etc/nginx/conf.d/*.conf;
    #Incluimos los sitios habilitados
    include /etc/nginx/sites-enabled/*.conf;
}

Posteriormente creamos un link simbólico en /etc/nginx/sites-enabled para el host configurado previamente.

ln -s /etc/nginx/sites-available/example.com.conf /etc/nginx/sites-enabled/

Después de creado el link reiniciamos Nginx o simplemente le indicamos que vuelva a leer su configuración.

/etc/init.d/nginx restart OR nginx -s reload

Prueba de PHP con FastCGI
Finalmente para poder probar este proyecto creamos un archivo llamado index.php para realizar la prueba.

vim /var/www/example.com/htdocs/index.php

Y le agregamos el siguiente contenido.

<?php phpinfo(); ?>

Solo resta probarlo con el browser que mas prefieran.