Una de los requerimientos para implementar una aplicación o sitio web es tener un servidor web —o servidor HTTP— del lado del servidor que se encargue del procesamiento. Este servidor realiza conexiones bidireccionales y/o unidireccionales con el cliente y genera una repuesta a las peticiones realizadas por este. Es por tanto parte esencial de una infraestructura web. Nginx (pronunciado Engine X, por sus siglas en inglés) es en esencia un servidor web que puede ser configurado para muchas utilidades además de esta; tiene la particularidad de ser ligero y de alto rendimiento, incluso en condiciones de carga alta. Es además gratuito y de código abierto. Crece cada vez más en el mercado y está cada vez más cerca de alcanzar los altos índices de uso del servidor web Apache.

¿Qué es Nginx y qué ofrece?

Según la propia información dispuesta en su sitio web, Nginx es un servidor HTTP, un servidor proxy inverso, un servidor proxy de correo y un servidor proxy genérico para TCP/UDP. En esencia Nginx es un servidor web de alto desempeño que puede manejar una carga alta, es decir, puede funcionar si su sitio web recibe muchos visitantes y peticiones debido a la facilidad de administrar sesiones concurrentes y contenido estático. Una de las ventajas que posee Nginx es que es una implementación asíncrona, diseñada para permitir que más solicitudes sean servidas simultáneamente pasando parte del trabajo de procesamiento a los hilos de escucha. Algunos ejemplos de sitios web que utilizan Nginx como servidor web incluyen: www.wordpress.com y www.netflix.com.

En la siguiente lista se incluyen algunas de las características que ofrece Nginx:

  • Características de Nginx como servidor web:

    • sirve archivos estáticos, índices y autoindexado;
    • admite el proxy inverso acelerado con uso de cache;
    • ofrece balanceo de carga y tolerancia a fallos;
    • provee soporte acelerado con interfaces como FastCGI, uwsgi y SCGI.
    • soporta SSL y TLS SNI;
    • es compatible con IPv6;
    • su arquitectura modular permite el uso de filtros para compresión gzip, rangos de bytes, respuestas recortadas, XSLT, SSI y filtro de transformación de imágenes;
    • soporte para autenticación;
    • se pueden añadir servidores virtuales basados en nombre y en IP;
    • geolocalización vía IP;
    • contiene un módulo perl embebido.
  • Características de Nginx como servidor proxy de correo electrónico:

    • redirección de usuarios a servidores IMAP o POP3 usando un servidor de autenticación HTTP externo;
    • autenticación de usuarios utilizando un servidor de autenticación HTTP externo y redirección de conexión a un servidor SMTP interno;
    • soporte de autenticación POP3, IMAP y SMTP;
    • soporte SSL;
    • soporte para STARTTLS y STLS.
  • Características de Nginx como servidor proxy TCP/UDP:

    • proxy genérico de TCP y UDP;
    • soporte SSL y TLS SNI para TCP;
    • balanceo de carga y tolerancia a fallos;
    • control de acceso basado en dirección de clientes;
    • ejecución de funciones diferentes dependiente de la dirección del cliente;
    • limitación del número de conexiones simultáneas provenientes de una sola dirección;
    • registros de acceso de búfer, "fast log" y registro de errores de sistema;
    • geolocalización basada en IP;
    • pruebas A/B.

Además, Nginx es compatible con un número muy variado de sistemas operativos:

  • FreeBSD 3 — 10 / i386; FreeBSD 5 — 10 / amd64;
  • Linux 2.2 — 4 / i386; Linux 2.6 — 4 / amd64; Linux 3 — 4 / armv6l, armv7l, aarch64, ppc64le;
  • Solaris 9 / i386, sun4u; Solaris 10 / i386, amd64, sun4v;
  • AIX 7.1 / powerpc;
  • HP-UX 11.31 / ia64;
  • Mac OS X / ppc, i386;
  • Windows XP, Windows Server 2003.

Arquitectura de Nginx

Nginx es un servidor asíncrono construido buscando solucionar los problemas de concurrencia que experimentaban ciertos sitios. El algoritmo desarrollado para este servidor es muchísimo más eficiente y consume menos recursos.

Nginx genera procesos worker, cada uno de los cuales puede manejar miles de conexiones. Se puede lograr esto debido a la implementación de un mecanismo de bucle rápido que busca y procesa eventos continuamente. Cada conexión manejada por el worker es dispuesta dentro del bucle de eventos, donde vive con otras conexiones. Los eventos dentro de este bucle se procesan de forma asíncrona, permitiendo que el trabajo sea manejado de forma no bloqueante. Cuando una conexión se cierra, se elimina del bucle. Esta disposición asíncrona y monohilos ayuda a que —incluso con recursos limitados— Nginx sea bastante rápido en cuanto al procesamiento de conexiones. Por consiguiente, el uso de CPU y memoria tiende a bajar debido a la eficiencia en el manejo de conexiones.

Instalación de Nginx

La plataforma de documentación de {{hosting_name}} provee tutoriales de instalación de la infraestructura LEMP (Linux + Nginx + MySQL/MariaDB + PHP). Es probable que deba instalar una infraestructura de este tipo en su servidor para el funcionamiento de su sitio web.

Estructura de configuración de Nginx

El archivo de configuración de Nginx se llama nginx.conf y generalmente estará bajo el directorio /usr/local/nginx/conf, /etc/nginx o /usr/local/etc/nginx. Este archivo determina la forma en que funcionarán Nginx y sus módulos.

Si abrimos el archivo de configuración de nginx utilizando nuestro editor favorito (por ejemplo: sudo nano /etc/nginx/nginx.conf) obtendremos una salida similar a la siguiente:

user       www www;  ## Default: nobody
worker_processes  5;  ## Default: 1
error_log  logs/error.log;
pid        logs/nginx.pid;
worker_rlimit_nofile 8192;

events {
  worker_connections  4096;  ## Default: 1024
}

http {
  include    conf/mime.types;
  include    /etc/nginx/proxy.conf;
  include    /etc/nginx/fastcgi.conf;
  index    index.html index.htm index.php;

  default_type application/octet-stream;
  log_format   main '$remote_addr - $remote_user [$time_local]  $status '
    '"$request" $body_bytes_sent "$http_referer" '
    '"$http_user_agent" "$http_x_forwarded_for"';
  access_log   logs/access.log  main;
  sendfile     on;
  tcp_nopush   on;
  server_names_hash_bucket_size 128; # this seems to be required for some vhosts

  server { # php/fastcgi
    listen       80;
    server_name  domain1.com www.domain1.com;
    access_log   logs/domain1.access.log  main;
    root         html;

    location ~ \.php$ {
      fastcgi_pass   127.0.0.1:1025;
    }
  }

  server { # simple reverse-proxy
    listen       80;
    server_name  domain2.com www.domain2.com;
    access_log   logs/domain2.access.log  main;

    # serve static files
    location ~ ^/(images|javascript|js|css|flash|media|static)/  {
      root    /var/www/virtual/big.server.com/htdocs;
      expires 30d;
    }

    # pass requests for dynamic content to rails/turbogears/zope, et al
    location / {
      proxy_pass      http://127.0.0.1:8080;
    }
  }

  upstream big_server_com {
    server 127.0.0.3:8000 weight=5;
    server 127.0.0.3:8001 weight=5;
    server 192.168.0.1:8000;
    server 192.168.0.1:8001;
  }

  server { # simple load balancing
    listen          80;
    server_name     big.server.com;
    access_log      logs/big.server.access.log main;

    location / {
      proxy_pass      http://big_server_com;
    }
  }
}

En este ejemplo obtenido del propio sitio web de Nginx, observamos una estructura en forma de árbol, con secciones definidas entre llaves { } en las cuales se aplican ciertas lógicas que indican cuáles configuraciones se aplicarán. Nginx tiene dos tipos de directivas:

  • directivas simples: nombre de la directiva junto con sus parámetros separados por espacio, terminando en punto en coma (;).
  • directivas de bloque: tiene la misma estructura de una directiva simple, pero en lugar de un punto y coma proveen un conjunto de instrucciones rodeadas de llaves { }.

También se definen los contextos. Una directiva de bloque se considera un "contexto" cuando tiene otras directivas entre las llaves (por ejemplo: events, http, server y location).

Debido a que los contextos pueden estar anidados, Nginx provee un nivel de herencia de directivas. Una regla general de Nginx es que si una directiva es válida en varios alcances anidados, una declaración en un contexto más amplio será pasada a cualquier contexto hijo como valor predeterminado. Los contextos hijos pueden sobrescribir estos valores a su voluntad. Las directivas solo pueden ser usadas en los contextos para los cuales están diseñadas. Para más información al respecto puede visitar los enlaces en los recursos adicionales.

Módulos principales

Los módulos principales o "base modules" definen la configuración básica de Nginx. Se incorporan automáticamente a Nginx en tiempo de compilación. Estas directivas y bloques están disponibles siempre. Hay tres tipos de módulos principales:

  • El módulo core contiene directivas y características esenciales para el funcionamiento de Nginx. La mayoría de sus directivas deben estar colocadas en la raíz, o en otras palabras, en la parte superior del archivo de configuración. Observemos algunas de las directivas del módulo principal:

    • user - la sintaxis de esta directiva está dada por usuario nombredeusuario nombredegrupo; o usuario nombredeusuario;. Permite definir la cuenta de usuario, y opcionalmente, el grupo utilizado para iniciar los procesos worker. Se deben utilizar usuarios y grupos con privilegios limitados por razones de seguridad.
    • worker_processes: define la cantidad de procesos worker. Si un proceso está bloqueado por alguna razón, las solicitudes futuras pueden ser servidas por otro proceso worker. La sintaxis es un número entero o el valor auto. Si se utiliza este último Nginx seleccione el valor apropiado (por defecto es el número detectado de cores de CPU).
    • error_log: indica la ubicación de los archivos de registro de eventos. La sintaxis es: error_log /ruta/log level; (donde level podrá ser debug, info, notice, warn, error y crit). Si quiere desactivar el registro de errores, envíe el log a la siguiente ruta: /dev/null.
    • pid: es la ruta al archivo donde se almacenará el PID para Nginx.
  • El módulo events está contenido en el módulo principal. Se usa para establecer las opciones que afectan la forma en que Nginx maneja las conexiones a nivel general. Nginx utiliza un modelo de procesamiento de conexiones basado en eventos, de modo que las directivas definidas en este módulo determinan cómo los procesos worker deben manejar las conexiones.
    En nuestro ejemplo vemos que este módulo contiene la directiva worker_connections 4096;. Esta directiva define la cantidad de conexiones que puede manejar un proceso worker de forma simultánea.

  • El módulo configuration permite inclusiones de archivos con la directiva include. Las directivas pueden estar dispuestas en cualquier lugar del archivo de configuración y aceptan un único parámetro.

Módulo del servidor HTTP

El servidor web es configurado utilizando el módulo HTTP. Este módulo es un componente esencial y entre otras cosas, permite servir múltiples sitios web, o hosts virtuales. Está organizado en tres bloques principales:

  • http: se utiliza para definir las directivas y bloques relacionados con la función de Nginx como servidor web. Debe estar colocado en la raíz del archivo de configuración.
  • server: se utiliza para declarar un sitio web específico. Debe estar colocado dentro del bloque http. Se puede definir más de un bloque tipo server, tal como lo vemos en el ejemplo arriba, en este caso cada bloque representa un virtual host.
  • location: permite definir un grupo de ajustes que son aplicados a ciertas secciones del sitio web. Puede estar colocado dentro de un bloque servero anidarse dentro de otro bloque tipo location.

Otro bloque utilizado en nuestro ejemplo es upstream. Este se utiliza para definir y configurar servidores de "upstream". Define un grupo de determinado de servidores a los cuales Nginx puede enviar peticiones de proxy. Es útil cuando necesita configurar proxies de distintos tipos.

También se puede configurar un módulo para que Nginx trabaje como servidor proxy de correo, en este caso Nginx debe ser compilado con la opción --with-mail, lo cual activa el soporte para POP3, IMAP4 y SMTP. Sin embargo, la explicación detallada de este módulo se escapa del alcance de esta guía.

Existen muchas otras directivas y contextos de configuración en Nginx, pero las mismas no se incluyen en esta guía. Por ejemplo, existen directivas como server_name y listen para identificar bloques server e indicar datos de la dirección ip/puerto. Incluso podemos encontrar una directiva para el procesamiento condicional de directivas: if. Para más información por favor consulte los recursos adicionales al final de este manual.

Ventajas de Nginx

Algunas de las ventajas que ofrece Nginx:

  • Estadísticamente Nginx es un servidor web en crecimiento que atrae cada vez a más webmasters a nivel mundial.
  • En comparación con Apache y otros servidores web, Nginx supera ampliamente en cuanto al manejo de sesiones concurrentes, tiempo de respuesta y uso de recursos. Esto se debe a la arquitectura y manejo inteligente de conexiones.
  • Otra de las ventajas que ofrece Nginx es la arquitectura asíncrona que mejora el manejo de conexiones concurrentes.
  • El manejo de archivos estáticos es muy rápido y eficiente.
  • Es compatible con aplicaciones web usadas comúnmente, como WordPress, Joomla, Drupal, Ruby o Python.
  • Una de las características más importantes es el balanceo de cargas, que permite un escalamiento más rápido de los servidores http. El balanceo a través de Nginx permite la distribución de tráfico entre distintos servidores, permitiendo que los usuarios escalen sus aplicaciones y que obtengan redundancia http simultáneamente.
  • Además es de fácil instalación (solo un par de líneas para distribuciones Linux) y configuración a través del archivo principal "nginx.conf" y los archivos de configuración para los hosts virtuales creados (generalmente ubicados en /etc/nginx/conf.d/ejemplox.com.conf).

Recursos adicionales

Puede consultar los siguientes recursos en busca de información adicional con respecto a este tema. Aunque este material es provisto esperando que sea útil, tenga en cuenta que no podemos dar fe de la actualidad o precisión de los contenidos externos.