La siguiente serie de artículos son el fruto de un trabajo realizado para la facultad en la asignatura Ingeniería de Servidores de la Universidad de Granada (ETSIIT [Escuela Técnica Superior de Ingenierías Informática y de Telecomunicación] )

A lo largo de esta guía se pretende mostrar cómo instalar desde cero un servidor web con Nginx, realizando las operaciones necesarias para lograr el mayor rendimiento y seguridad posibles con programas tales como php-fpm, APC, y el módulo pagespeed de Google para optimizar los recursos web.

Tabla de contenidos

Hace tiempo se vío en este blog cómo instalar y configurar Nginx con php5-fpm, en los próximos artículos se intentará explicar de forma más detallada cómo llevar a cabo éste proceso junto con algunas mejoras adicionales en términos de optimización. Es necesario informar al lector que todas las recomendaciones aquí explicadas se basan únicamente en la experiencias del autor.



Compilar e instalar Nginx

Preparando el entorno

Lo primero que debemos hacer es instalar las dependencias necesarias para la compilación, para ello:

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

Tras esto descargamos la última versión de nginx, al momento de escribir este texto la 1.4.4:

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

Descomprimimos el archivo:

tar xzvf nginx-1.4.4.tar.gz

Antes de compilar cambiaremos un valor en el código fuente como medida de seguridad por ocultación. El valor a cambiar es la cadena asignada a la cabecera que indica el servidor usado en las peticiones HTTP. En concreto el archivo a cambiar es el alojado en src/http/ngx_http_header_filter_module.c, concretamente en la línea 48:

static char ngx_http_server_string[] = "Server: nginx" CRLF;
static char ngx_http_server_full_string[] = "Server: " NGINX_VER CRLF;

Cambiamos estas dos líneas a algo del estilo:

static char ngx_http_server_string[] = "Server: Mi servidor Web" CRLF;
static char ngx_http_server_full_string[] = "Server: Mi servidor Web" CRLF;

Ya solo queda compilarlo e instalarlo, de momento necesitaremos los módulos siguientes:

--with-http_gzip_static_module --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 --with-http_realip_module

Aquí estamos habilitando la compresión de las páginas con gzip, SSL para conexiones seguras, deshabilitando el módulo de correo POP3, IMAP y SMTP. Dependiendo de las necesidades de nuestro servidor, deberemos activar o desactivar algunos módulos. Más tarde necesitaremos recompilar para añadir el módulo pagespeed. La lista de todos los módulos disponibles se puede consultar en la documentación de nginx.

Compilar

Ya está todo listo para compilar e instalar, dentro del directorio de nginx ejecutamos:

./configure --with-http_gzip_static_module --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 --with-http_realip_module

Tras esto deberíamos ver un resumen de la operación realizada:

Configuration summary
  + using system PCRE library
  + using system OpenSSL library
  + md5: using OpenSSL library
  + sha1: using OpenSSL library
  + using system zlib library

  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"

Para compilar e instalar:

make -j 4 && make install

Tras esto, es necesario descargar el script que permite iniciar, detener, reiniciar y recargar nginx mediante el comando service, podemos descargarlo desde

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

Con esto hemos descargaro el script, lo hemos movido al directorio en el que será llamado al inicio del sistema, dado permisos de ejecución y asignado a root como propietario. Hecho esto, para iniciar nuestro servidor web hay que ejecutar el comando:

service nginx start

Como se muestra en la siguiente figura nginx, podemos comprobar que nginx está funcionando correctamente dirigiéndonos a la dirección localhost, donde veremos lo siguiente:

Configuración

Ya que está todo listo, vamos a realizar unos cuantos ajustes a la configuración por defecto:

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 del directorio donde se alojan los recursos web a este último usuario y reiniciamos nginx:

chown -R www-data:www-data /usr/local/nginx/html/
service nginx destroy && service nginx start

Tabla de contenidos

Índice