Llevo ya un par de semanas pegándome con Nginx, un servidor HTTP de origen ruso que comenzó a estar en producción más o menos en el 2004, básicamente para cubrir las necesidades de los sites de porno de aquel país. Unos años más tarde ya está entre los servidores más usados y como tal, no hay más remedio que ponerse con él, para saber un poco más.

Haciendo mi trabajo me he encontrado con que este servidor tiene un comportamiento por defecto, que si no tienes en cuenta, puede darte algunos problemillas. Particularmente con Nginx sigo el mismo esquema que con Apache, sites-available/sites-enabled, por lo que en sites-enabled tenemos enlaces simbólicos a las configuraciones de los distintos servers en sites-available.

En principio no es necesario definir ningún server por defecto en el fichero de configuración. Ahora bien, si tenemos dos hosts virtuales que apuntan a la misma máquina (ip) con Nginx y uno de ellos no aparece en sites-available, Nginx por defecto nos mostrará alegremente el primero que encuentre disponible en ese mismo directorio. Vamos que no se digna a escupir ningún error, lo cual está un poco mal por su parte.

Hay una forma muy sencilla de que esto ya no nos pase más, y que si en la request se pide una dirección de virtual host cuya configuración no está en sites-enabled, nos muestre al menos una página de error.

En el fichero /usr/local/nginx/conf/nginx.conf (por comodidad yo tengo un enlace simbólico /etc/nginx a este directorio) añadimos un server por defecto, así:

server {
   listen 80 default;
   access_log /var/log/nginx/default.access.log;
   error_log /var/log/nginx/default.error.log;
   root /var/www/default/;  
   index bad_request.html;
 }

El fichero "bad_request.html" sería una página a vuestro gusto que indicara lo que creais conveniente. Y ale, ahora Nginx ya sabe lo que tiene que hacer si no encuentra la configuración del virtual host requerido. Es una forma un poco simple de solucionarlo y quizá haya alguna mejor, así que que nadie se corte en corregirme o añadir algún otro método que le parezca más apropiado. Soy una esponja :-)