Nginx (Pronunciado engine-x) es un servidor HTTP de alto rendimiento, gratuito, software libre y proxy inverso, así como un servidor proxy IMAP/POP3. Desarrollado por Igor Sysoev. Acualmente el 12.18% de las webs usan nginx como servidor HTTP. Sus aspectos más destacables son el rendimiento, estabilidad, simplicidad de configuración y un bajo consumo de recursos. En este artículo explicaré como instalar nginx desde el código fuente.

Índice



Instalando dependencias

Antes de poder compilar nginx, es necesario instalar unos cuantos paquetes:

# apt-get install build-essential libssl-dev libpcre3-dev

El paquete build-essential contiene las herramientas básicas para compilar programas desde código fuente, las otras dos librerías son necesarias para nginx durante el proceso de compilación.

Descargar y compilar Nginx

$ wget http://nginx.org/download/nginx-1.2.6.tar.gz

Descomprimimos el fichero:

$ tar zxvf nginx-1.2.6.tar.gz

Una vez descomprimido, entramos en el directorio y compilamos:

$ cd nginx-1.2.6
~/nginx-1.2.6$ ./configure --sbin-path=/usr/local/sbin --with-http_ssl_module --without-mail_pop3_module --without-mail_imap_module --without-mail_smtp_module --with-http_stub_status_module
~/nginx-1.2.6$ make
~/nginx-1.2.6$ sudo make install

Para consultar qué modulos hay disponibles hay que visitar la pagina oficial de Nginx y decidir cuales queremos habilitar. Con la opción --sbin-path=/usr/local/sbin establecemos la ruta en la que se instalará el ejecutable. Tras compilar se mostrará información de la localización de los distintos ficheros:

nginx path prefix: "/usr/local/nginx"
nginx binary file: "/usr/local/sbin"
nginx configuration prefix: "/usr/local/nginx/conf"
nginx configuration file: "/usr/local/nginx/conf/nginx.conf"
nginx pid file: "/usr/local/nginx/logs/nginx.pid"
nginx error log file: "/usr/local/nginx/logs/error.log"
nginx http access log file: "/usr/local/nginx/logs/access.log"
nginx http client request body temporary files: "client_body_temp"
nginx http proxy temporary files: "proxy_temp"
nginx http fastcgi temporary files: "fastcgi_temp"
nginx http uwsgi temporary files: "uwsgi_temp"
nginx http scgi temporary files: "scgi_temp"

Es necesario descargar un script que permita detener, reiniciar e iniciar nginx, podemos descargar el siguiente:

$ wget https://raw.github.com/JasonGiedymin/nginx-init-ubuntu/master/nginx
$ sudo mv nginx /etc/init.d/nginx
$ sudo chmod +x /etc/init.d/nginx
$ sudo chown root:root /etc/init.d/nginx

En el tercer comando otorgamos permiso de ejecución al script, con el cuarto hacemos al usuario root propietario del mismo.

Si queremos que nginx se inicie automáticamente al iniciar el sistema, hay que añadirlo a los runlevel correspondientes:

# update-rc.d nginx defaults

Ahora estamos en condiciones de ejecutar nginx:

# /etc/init.d/nginx start
[ ok ] Starting Nginx Server...:.

Listo, nos dirigimos a nuestro navegador y escribimos en la barra de direcciones localhost. Si todo ha ido bien deberíamos ver esta pantalla:

Usando firebug se puede comprobar que efectivamente se está corriendo un servidor nginx:

Modificando la configuración por defecto

Sustituimos la configuración por defecto por esta:

user  www-data;
worker_processes  1;

pid        /var/run/nginx.pid;

error_log  logs/error.log;

events {
    worker_connections  1024;
}

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

    gzip on;
    gzip_buffers 16 8k;
    gzip_disable "MSIE [1-6]\.";
    gzip_proxied any;
    gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;

    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;
    keepalive_timeout  3;
    index              index.html index.htm;

    server {
        listen       80;
        server_name localhost;
        root html;

 access_log  logs/host.access.log  main;

        # Deny all attempts to access hidden files such as .htaccess, .htpasswd, .DS_Store (Mac).
        location ~ /\. {
                deny all;
                access_log off;
                log_not_found off;
        }

    }
}

Los cambios más relevantes sobre la configuración por defecto son:

Cambiamos los permisos de los ficheros que contienen la web y reiniciamos nginx para aplicar los cambios:

$ sudo chown -R www-data:www-data html/
$ sudo service nginx destroy && sudo service nginx start

Instalar php5-fpm

En lugar de instalar php5, instalaremos php5-fpm (FastCGI Process Manager), una implementación alternativa con algunas características adicionales.

En ubuntu, ejecutamamos el siguiente comando:

# apt-get install php5-fpm

En debian agregamos el repositorio al sources.list:

deb http://packages.dotdeb.org stable all
deb-src http://packages.dotdeb.org stable all

Agregamos la llave GnuPG del repositorio:

apt-get update
wget http://www.dotdeb.org/dotdeb.gpg
cat dotdeb.gpg | sudo apt-key add -

Instalamos php:

# apt-get install php5-cli php5-suhosin php5-fpm php5-cgi php5-mysql

Lo iniciamos:

# /etc/init.d/php5-fpm start

Para lograr que nginx interprete php, hay que hacer algunas modificaciones a la configuración:

user  www-data;
worker_processes  1;

pid        /var/run/nginx.pid;

error_log  logs/error.log;

events {
    worker_connections  1024;
}

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

    gzip on;
    gzip_buffers 16 8k;
    gzip_disable "MSIE [1-6]\.";
    gzip_proxied any;
    gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;

    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;
    keepalive_timeout  3;
    index              index.php index.html index.htm;

    upstream php {
        server 127.0.0.1:9000;
    }

    server {
        listen       80;
        server_name localhost;
        root html;

  access_log  logs/host.access.log  main;

        # Deny all attempts to access hidden files such as .htaccess, .htpasswd, .DS_Store (Mac).
        location ~ /\. {
                deny all;
                access_log off;
                log_not_found off;
        }

        location ~ \.php$ {
                include fastcgi_params;
                fastcgi_index index.php;
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                fastcgi_pass php;
        }
    }
}

Los principales cambios realizados son los siguientes:

Para terminar, añadimos los siguientes parámetros al final del archivo /usr/local/nginx/fastcgi_params:

fastcgi_connect_timeout 60;
fastcgi_send_timeout 180;
fastcgi_read_timeout 180;
fastcgi_buffer_size 128k;
fastcgi_buffers 4 256k;
fastcgi_busy_buffers_size 256k;
fastcgi_temp_file_write_size 256k;
fastcgi_intercept_errors on;

Para aplicar los cambios, reiniciamos nginx:

# service nginx restart

Con esto, deberíamos tener instalado un servidor corriendo con nginx y ejecutando archivos php.

Referencias