Cómo configurar Virtual Servers con Nginx

Nginx es una servidor web que está experimentando un crecimiento considerable. Es un servidor menos rico en funcionalidades que Apache2, pero en aquellas cosas para las que nos puede servir es mucho más eficiente en el consumo de recursos y por tanto aporta un mayor rendimiento y solvencia a nuestra página web.
NGINX Web Server
Por Internet podrás recopilar mucha información, y leer largas discusiones sobre qué servidor es mejor (Apache2 vs Nginx), el caso es que nosotros lo comparamos -para entendernos- entre el Notepad y Word; el primero es mucho más liviano y simple, el segundo es mucho más complejo en funcionalidades lo cuál exige un consumo mayor de recursos en nuestro Sistema.

Conceptos básico de la configuración de Nginx

Nginx es un servidor web HTTP mucho más simple, de modo que si estamos acostumbrado a administrar Apache2 deberemos estar atentos a algunas particularidades antes de meternos en profundidad. Lo más importante es pensar que Nginx es primeramente un sevidor proxy reverso y después un servidor HTTP; esto hace que el servidor se preocupe primero de tratar con las URL y después con los ficheros, esto cambia un poco la manera a que estamos acostumbrados a configurar las cosas con Apache2.

De modo que la configuración de Nginx se fundamenta en tres grandes bloques. El bloque-HTTP, el bloque-Servidor, y el bloque-Ubicación, se representaría de este modo: http -> server -> location.

Además de esto el bloque ubicación se divide en dos sub-bloques especiales, 

  • Bloque de eventos
  • Bloque root
Lo curioso es que el bloque eventos reside anidado dentro del bloque root. Aunque esto parece un poco complicado, inicialmente, el aspecto positivo es que la mayor parte del tiempo lo pasaremos configurando cosas fuera de estos dos bloques.
Los bloques tienen un significado semántico de clases. El bloque del servidor es lo que en Apache2 pueda ser considerado una virtual host. El bloque de ubicación por lo general todo lo referentes a la URI.

Virtual-Hosts

Para empezar las directivas más interesantes son server_name y root. La primera le dice a Nginx que utilice el bloque el bloque-Servidor cuando la cabecera HOST coincide con el nombre de la directiva server_name. A partir de ahí se define lo que debe usar como root. Veamos un ejemplo:

server {
listen 80;
server_name domain.com *.domain.com;
return 301 $scheme://www.domain.com$request_uri;
}

server {
listen 80;
server_name www.domain.com;

index index.html;
root /home/domain.com;
}

Aquí tenemos dos hosts virtuales. El primero de ellos es procesado cuando domain.com o cualquier subdominio de domain.com excepto www es enviado como encabezado HOST por el navegador. La razón de esto es que nginx siempre elegirá la coincidencia más específica, y si visitan www.domain.com entonces esto va a coincidir con el segundo bloque por precisión. 

Esto también significa que puede crear un Virtual Host predeterminado para capturar todos los dominios sin un patrón correcto. Afortunadamente esto es tan simple como añadir la directiva default_server a la directiva Listen. Esto hace que todas las solicitudes sin un encabezado de host o de otro host virtual que no coincida con el encabezado se enviarán a este Virtual Host en su lugar. Ejemplos de ello son las solicitudes con el acceso a IP directamente o si alguien apunta un dominio al azar a su IP. El server_name que verá mencionado en muchos guías no significa nada y no hace nada. Es sólo un encabezado de host no válido falso que se puede utilizar para asegurarse de que nada coincidirá con ese nombre. Se puede también de simplemente no definir un server_name :

server {
listen 80 default_server;

index index.html;
root /var/www/default;
}

Ubicaciones

Si vas a sutituir Apache2 por Nginx en este punto debes prestar especial atención. Nginx normalmente no utiliza reescrituras (mod_rewrite),  por lo general se puede lograr lo mismo usando un bloque de ubicación.

Las cosas más importantes a tener en cuenta es que las ubicaciones trabajan teniendo en cuenta la URI sin ningún parámetro de consulta y sólo si cuadra la ubicación se ejecutan las directivas. Esto también es por eso que recomendamos poner directivas en la parte superior del bloque. Una directiva raíz definida por la ubicación / no estará disponible en /imagenes - a no ser que se defina en el bloque de servidor. Aunque esto pueda parecer un retroceso comparado con la forma de trabajar que tiene Apache2 podrás ver que tiene la ventaja de evitará la duplicación de código/directivas y por tanto dolores de cabeza.

Otra consideración muy importante a tener en cuenta es cómo Nginx usará la directiva server_name para tener en cuenta la ubicación más espeficica a tener en cuenta.
Esto se explica con detalle en http://nginx.org/en/docs/http/ngx_http_core_module.html#location

Gestionando archivos PHP


Como se mencionó anteriormente, nginx no se preocupa por los archivos, sino más bien por las ubicaciones, por eso tenemos que usar una directiva try_files dentro del bloque de php. Este bloque de posición coincide con un URI que termina en .php pero al servidor no le importará si se trata de un archivo o no. 

server {
listen 80;
server_name forum.domain.com;

index index.php;
root /home/domain.com/forum;

location ~* \.php$ {
include fastcgi.conf # I include this in http context, it's just here to show it's required for fastcgi!
try_files $uri =404; # This is not needed if you have cgi.fix_pathinfo = 0 in php.ini (you should!)
fastcgi_pass 127.0.0.1:9000;
}
}

Esto no es una deficiencia de Nginx, lo que estará pasando en realidad es que los archivos que tengan la extensión .php serán parseados vía fastcgi por procesador PHP que se ejecutará en el puerto 9000.


Bueno, esto es una modesta introducción a una configuración mínima de Nginx, como siempre podemos ojear la documentación oficial y en los foros para casos especificos que necesitamos abordar.
  • 9 Los Usuarios han Encontrado Esto Útil
¿Fue útil la respuesta?

Related Articles

Transmisión de archivos mediante SFTP

SSH File Transfer Protocol El protocolo de transferencia de archivos SFTP es un protocolo que...

Secure Shell SSH

¿Qué es SSH? Secure Shell (SSH) es el protocolo por el cual te puedes conectar a tu VPS y...