Optimizando un servidor web con Nginx

Una vez adquirido uno de nuestros servidores, te enseñaremos a instalarle Nginx

En la web estamos acostumbrados a ver que gran cantidad de sitios son despachados por el servidor Apache, pero es bueno saber que existen otras alternativas de igual y mejor rendimiento como lo es Nginx.

Ambos, nginx y Apache, son servidores web gratuitos, de código abierto y disponibles para varias plataformas. Apache es un servidor sumamente completo, tiene muchas funciones disponibles, pero lo cierto es que la mayoría de ellas no son usadas. La diferencia principal con nginx es que este último tiene menos funciones, pero trabaja a mayor velocidad que Apache en el 90% de los casos.

nginx es el mejor servidor web para servir archivos estáticos, y además lo hace teniendo un consumo de memoria considerablemente menor que Apache, dado que no precisa crear un proceso o hilo nuevo para cada pedido que le llega, y tampoco necesitar analizar todos los directorios de un sitio buscando archivos .htaccess, ya que carga las reglas de Rewrite directamente desde su configuración.

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:

Instalación y optimización de un servidor web con Nginx (I)

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:

  • Se ha cambiado el usuario del servidor de nobody a www-data, éste último es el usuario por defecto para servidores webs.
  • Se define el archivo donde se localizará el PID (Process ID) del servidor. Esto permite al script que hemos instalado iniciar o detener nginx.
  • Se habilita la compresión gzip para reducir el ancho de banda consumido.
  • Se define el formato que tendrán los ficheros de log.

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

Leave a Comment