Cómo configurar los Server Blocks Nginx (virtual hosts) en Ubuntu

Introducción

Cuando se usa el servidor web Nginx, server blocks(similar a los virtual hosts en Apache) se pueden usar para encapsular los detalles de configuración y hospedar más de un dominio fuera de un solo servidor.

En esta guía, analizaremos cómo configurar server blocks en Nginx en un servidor Ubuntu 14.04.

Prerrequisitos

Vamos a utilizar un usuario no root con privilegios sudo en este tutorial.

También necesitarás tener Nginx instalado en tu servidor. Si deseas un conjunto completo de LEMP (Linux, Nginx, MySQL y PHP) en tu servidor, puede seguir alguna guía para configurar un conjunto de LEMP en Ubuntu 14.04. Si solo necesitas Nginx, puede instalarlo escribiendo:

sudo apt-get update
sudo apt-get install nginx

Cuando hayas cumplido estos requisitos, puedes continuar con esta guía.

Para fines de demostración, vamos a configurar dos dominios con nuestro servidor Nginx. Los nombres de dominio que usaremos en esta guía son example.com y test.com.

Puedes encontrar una guía sobre cómo configurar nombres de dominio con una sencilla búsqueda en Google. Si no tiene dos nombres de dominio para jugar, usa nombres ficticios por ahora y te mostraremos más adelante cómo configurar tu computadora local para probar tu configuración.

Paso uno: configurar nuevos directorios root de documentos

De forma predeterminada, Nginx en Ubuntu 14.04 tiene un server block habilitado de forma predeterminada. Está configurado para mostrar documentos fuera de un directorio en:

/usr/share/nginx/html

No usaremos el valor predeterminado ya que es más fácil trabajar con cosas en el directorio /var/www. El paquete Nginx de Ubuntu no usa /var/www como su raíz de documentos por defecto debido a una política de Debian sobre paquetes que utilizan /var/www .

Como somos usuarios y no mantenedores de paquetes, podemos decirle a Nginx que aquí es donde queremos que estén nuestras roots de documentos. Específicamente, queremos un directorio para cada uno de nuestros sitios dentro del directorio /var/www y tendremos un directorio bajo estos llamados html para mantener nuestros archivos reales.

Primero, necesitamos crear los directorios necesarios. Podemos hacer esto con el siguiente comando. La –p indica que en mkdir se creen los directorios principales necesarios en el camino:

sudo mkdir -p /var/www/example.com/html
sudo mkdir -p /var/www/test.com/html

Ahora que has creado los directorios, debemos transferir la propiedad a nuestro usuario habitual. Podemos usar la variable de entorno $USER para sustituir la cuenta de usuario en la que estamos actualmente conectados. Esto nos permitirá crear archivos en este directorio sin permitir que nuestros visitantes creen contenido.

sudo chown -R $USER:$USER /var/www/example.com/html
sudo chown -R $USER:$USER /var/www/test.com/html

Los permisos de nuestras webs root ya deberían ser correctos si no has modificado su valor umask, pero podemos asegurarnos escribiendo:

sudo chmod -R 755 /var/www

Nuestra estructura de directorios ahora está configurada y podemos seguir adelante.

Paso dos – Crear páginas de muestra para cada sitio

Ahora que tenemos nuestra estructura de directorios configurada, debemos crear una página predeterminada para cada uno de nuestros sitios para que tengamos algo que mostrar.

Crea un archivo index.html en tu primer dominio:

nano /var/www/example.com/html/index.html

Dentro del archivo, crearemos un archivo realmente básico que indica a qué sitio estamos accediendo actualmente. Se verá así:

<html>
<head>
<title> ¡Bienvenido a Example.com ! 
</title>
</head>
<body>
<h1> ¡Éxito! ¡Server Block de example.com está funcionando! </h1>
</body>
</html>

Guarda y cierra el archivo cuando hayas terminado.

Dado que el archivo para nuestro segundo sitio será básicamente el mismo, podemos copiarlo en nuestra segunda raíz de documentos de esta manera:

cp /var/www/example.com/html/index.html /var/www/test.com/html/

Ahora, podemos abrir el nuevo archivo en nuestro editor y modificarlo para que se refiera a nuestro segundo dominio:

nano /var/www /test.com/html/index.html
<html>
<head>
<title> ¡Bienvenido a Test.com ! 
</title>
</head>
<body><h1> ¡Éxito! ¡server block del servidor test.com está funcionando! </h1>
</body>
</html>

Guarda y cierra este archivo cuando hayas terminado. Ahora tienes algunas páginas para mostrar a los visitantes de nuestros dos dominios.

Paso tres – crear archivos de server block para cada dominio

Ahora que tenemos el contenido que deseamos mostrar, necesitamos crear realmente los server blocks que le indiquen a Nginx cómo hacerlo.

Por defecto, Nginx contiene un server block llamado default que podemos usar como plantilla para nuestras propias configuraciones. Comenzaremos diseñando el server block de nuestro primer dominio, que luego copiaremos para nuestro segundo dominio y haremos las modificaciones necesarias.

Crear el primer archivo de server block

Como se mencionó anteriormente, crearemos nuestro primer archivo de server block del servidor copiando el archivo predeterminado:

sudo cp /etc/nginx/sites-available/default /etc/nginx/sites-available/example.com

Ahora, abre el nuevo archivo que creaste en tu editor de texto con privilegios de root:

sudo nano /etc/nginx/sites-available/example.com

Ignorando las líneas comentadas, el archivo se verá similar a esto:

server {
    listen 80 default_server;
    listen [::]:80 default_server ipv6only=on;
 
    root /usr/share/nginx/html;
    index index.html index.htm;
 
    server_name localhost;
 
    location / {
        try_files $uri $uri/ =404;
    }
}

Primero, tenemos que ver las directivas listen. Solo uno de nuestros server blocks puede tener la especificación default_server. Esto especifica qué bloque debe enviar una solicitud si el server_name solicitado no coincide con ninguno de los server blocks disponibles.

Eventualmente, vamos a deshabilitar la configuración predeterminada del server block, por lo que podemos colocar la opción default_server en este server block o en la de nuestro otro sitio. Voy a dejar la opción default_server habilitada en este server block, pero puedes elegir lo que sea mejor para tu situación.

Lo siguiente que tendremos que ajustar es la raíz del documento, especificada por la directiva root. Debe apuntar a la raíz del documento del sitio que creaste:

root /var/www/example.com/html;

Nota: Cada instrucción en Nginx debe terminar con un punto y coma (;), así que verifica cada una de sus líneas si tienes problemas.

A continuación, queremos modificar las solicitudes server_name para que coincidan con nuestro primer dominio. Adicionalmente, podemos agregar cualquier alias que queramos hacer coincidir. Agregaremos un alias www.example.com para demostrar:

server_name example.com www.example.com;

Cuando hayas terminado, tu archivo se verá así:

server 
{listen 80 default_server;
listen [::]:80 default_server ipv6only=on;

root /var/www/example.com/html;
index index.html index.htm;
 
server_name example.com www.example.com;
location / {
try_files $uri $uri/ =404;
}
}

Eso es todo lo que necesitamos para una configuración básica. Guarda y cierra el archivo para salir.

Crear el segundo archivo de server block

Ahora que tenemos nuestra configuración inicial de server block, podemos usar eso como base para nuestro segundo archivo. Cópialo para crear un nuevo archivo:

sudo cp /etc/nginx/sites-available/example.com /etc/nginx/sites-available/test.com

En este nuevo archivo, tendremos que revisar las directivas listen nuevamente. Si dejaste la opción default_server habilitada en el último archivo, deberás eliminarla en este archivo. Además, deberás deshacerte de la opción ipv6only=on, ya que solo se puede especificar una vez por combinación de dirección/puerto:

listen 80;
listen [::]:80;

Ajusta la directiva root de documentos para que apunte a root de documentos de tu segundo dominio:

root /var/www/test.com/html;

Ajusta el server_name para que coincida con tu segundo dominio y cualquier alias:

server_name test.com www.test.com;

Tu archivo debería verse algo así con estos cambios:

server {
listen 80;
listen [::]:80;
 
root /var/www/test.com/html;
index index.html index.htm;
 
server_name test.com www.test.com;
location / {
try_files $uri $uri/ =404;
}
}

Cuando hayas terminado, guarda y cierra el archivo.

Paso cuatro – habilitar los server blocks y reiniciar Nginx

Ahora que has creado tus server blocks, necesitamos habilitarlos.

Podemos hacer esto creando enlaces simbólicos desde estos archivos al directorio sites-enabled, que Nginx lee durante el inicio.

Podemos crear estos enlaces escribiendo:

sudo ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/
sudo ln -s /etc/nginx/sites-available/test.com /etc/nginx/sites-enabled/

Estos archivos están ahora en el directorio habilitado. Sin embargo, el archivo de server block predeterminado que usamos como plantilla también está habilitado actualmente y entrará en conflicto con nuestro archivo que tiene el conjunto default_server de parámetros.

Podemos deshabilitar el archivo de server block predeterminado simplemente eliminando el enlace simbólico. Todavía estará disponible como referencia en el directorio sites-available, pero Nginx no lo leerá al inicio:

sudo rm /etc/nginx/sites-enabled/default

También necesitamos ajustar una configuración muy rápidamente en el archivo de configuración predeterminado de Nginx. Ábrelo escribiendo:

sudo nano /etc/nginx/nginx.conf

Solo necesitamos descomentar una línea. Encuentra y elimina el comentario de esto:

server_names_hash_bucket_size 64;

Ahora, estamos listos para reiniciar Nginx para habilitar los cambios. Puedes hacerlo escribiendo:

sudo service nginx restart

Nginx ahora debe estar mostrando ambos nombres de dominio.

Paso cinco – Configurar archivo de hosts locales (opcional)

Si no has estado usando los nombres de dominio que posees y, en cambio, has estado usando valores ficticios, puedes modificar la configuración de tu computadora local para permitirte probar temporalmente la configuración de server block de Nginx.

Esto nos permitirá que otros visitantes vean tu sitio correctamente, pero te dará la posibilidad de llegar a cada sitio de forma independiente y probar tu configuración. Básicamente, esto funciona al interceptar solicitudes que normalmente irían al DNS para resolver nombres de dominio. En su lugar, podemos configurar las direcciones IP a las que queremos que vayan nuestras computadoras locales cuando solicitamos los nombres de dominio.

Asegúrate de estar operando en tu computadora local durante estos pasos y no en tu servidor VPS. Necesitarás tener acceso root, ser miembro del grupo administrativo o poder editar los archivos del sistema para hacer esto.

Si estás usando una computadora Mac o Linux en casa, puedes editar el archivo necesario escribiendo:

sudo nano /etc/hosts

Si estás en Windows, puedes encontrar instrucciones para modificar su archivo de hosts aquí.

Necesita la dirección IP pública de tu servidor y los dominios que deseas enrutar al servidor. Suponiendo que la dirección IP pública de mi servidor es 111.111.111.111, las líneas que agregaría a mi archivo se verían así:

127.0.0.1 localhost
127.0.0.1 guest-desktop
111.111.111.111 example.com
111.111.111.111 test.com

Este interceptará cualquier solicitud de example.com y test.com y enviarlos a tu servidor, que es lo que queremos si en realidad no somos propietarios de los dominios que estamos utilizando.

Guarda y cierra el archivo cuando hayas terminado.

Paso Seis – Prueba tus resultados

Ahora que está todo configurado, debes probar que los server block funcionan correctamente. Puedes hacerlo visitando los dominios en tu navegador web:

http://example.com

Deberías ver una página que luce así:

Si visitas tu segundo nombre de dominio, deberías ver un sitio ligeramente diferente:

http: //test.com

Si ambos sitios funcionan, has configurado con éxito dos server blocks independientes con Nginx.

En este punto, si ajustaste tu archivo hosts en tu computadora local para probar, probablemente querrás eliminar las líneas que agregaste.

Si necesitas acceso de nombre de dominio a tu servidor para un sitio público, es probable que desees comprar un nombre de dominio para cada uno de tus sitios.

Conclusión

Ahora deberías tener la capacidad de crear server blocks para cada dominio que desees alojar desde el mismo servidor. No hay límites reales en la cantidad de server blocks que puedes crear, siempre que tu hardware pueda manejar el tráfico.