ksergio.com

github-logo

  • Nginx
  • Linux
Publicado hace 1 semana

Cómo Servir tu Página Web con Nginx: Guía Paso a Paso

Cómo Servir tu Página Web con Nginx: Guía Paso a Paso
  1. Servir una pagina web simple
  2. Configurar páginas de error personalizadas
  3. Quitar sufijo .html de las rutas
  4. Usar Nginx como reverse proxy
  5. Servir contenido estático desde una carpeta dedicada
  6. Configurar HTTPS gratuito con Certbot

Servir una pagina web simple

Imagina que tienes tu web estática en /var/www/misitio/ con estos archivos:

/var/www/misitio/
	├── index.html
	├── style.css
	└── scripts.js

Configura Nginx en /etc/nginx/sites-available/misitio.conf:

server {
    listen 80;
    server_name midominio.com;

    root /var/www/misitio;
    index index.html;

    location / {
        try_files $uri $uri/ =404;
    }
}

Luego habilita el sitio, creando primero un enlace de sites-available a sites-enabled. Después comprobamos que la configuración no da error con nginx -tque nos dirá si todo esta correctamente configurado o tenemos algo mal en estos ficheros. Por ultimo recargamos nginx para que los cambios surtan efecto:

sudo ln -s /etc/nginx/sites-available/misitio.conf /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx

Con estos cambios ya deberiamos de poder servir nuestro contenido en el puerto 80 de nuestra máquina. El puerto 80 es el puerto por el que se sirven peticiones HTTP.

¡Importante! Tienes que tener este puerto expuesto al exterior para poder acceder desde otro dispositivo. Normalmente los servidores tienes acceso directo al exterior, pero si lo estas haciendo en tu ordenador seguramente tengas que hacer port forwardning en tu router. Es decir, redigir las peticiones que llegan al router a tu PC. Esto se suele hacer directamente accediendo al router y modificando su configuración.

Además, si haces esto, ten en cuenta que podrás acceder directamente con tu IP, pero si tu IP es dinámica, cambiará cada X tiempo. Es importante tener una IP estática.

Por ultimo, server_name midominio.com; le dice a nginx que si la dirección con la que se accede es http://midominio.com entonces este es el archivo que usará nginx para responder. De esta forma para la misma IP, podemos tener varios archivos con diferentes name_server y manejar diferentes sitios web.

  • root es la dirección donde tenemos guardado nuestro sitio web o contenido
  • index index.html le dice que para manejar la ruta \ será manejada por el archivo index.html.
  • location indica donde se tiene que buscar las otras diferentes rutas que se hayan puesto en la direccion. Por ejemplo: midominio.com/sobre-mi.html buscará en root el fichero sobre-mi.html y si no lo encuentra devolverá un error 404.

Configurar páginas de error personalizadas

Si intentamos acceder a una ruta que no existe, nginx intentará acceder a ese fichero en nuestro directorio root, pero si no existe, nos lanzará un error generico.

error-404-not-found

Podemos servir nuestra propia página para manejar este error o cualquier otra simplemente agregando la siguiente configuración:

server {
    listen 80;
    server_name midominio.com;

    root /var/www/misitio;
    index index.html;

    error_page 404 /404.html; # Agregamos manejo error 404
    error_page 500 502 503 504 /500.html; # Agregamos manejo errores 5xx

    location / {
        try_files $uri $uri/ =404;
    }
}

Quitar sufijo .html de las rutas

Estamos acostumbrados a que tener rutas que acaben en .html resulte feo, por eso podemos eliminarla de una forma elegante.

Si tienes páginas como about.html y quieres que se accedan con /about:

location / {
    try_files $uri $uri.html $uri/ =404;
}

Usar Nginx como reverse proxy

Además de servir contenido estático, si de alguna forma tenemos corriendo un programa que maneje estas peticiones en otro puerto (como por ejemplo express.js o flask) podemos usar redirigir las peticiones que lleguen a nuestros puertos 80 o 443 con Nginx hacia estos otros puertos.

¿Que es exactamente un reverse proxy?

Tienes un servidor con Nginx en https://midominio.com e internamente tienes varios servicios funcionando que aceptan peticiones.

El reverse proxy se encarga de recibir la petición del cliente y redirigirla al servicio correspondiente, ocultando la infraestructura interna.

1. API en `http://localhost:3000`
2. Aplicación web en `http://localhost:8080`
3. Dashboard en `http://localhost:5000`

Ejemplo de configuracion con Nginx

Con esta configuracion redirigimos las peticiones HTTP del puerto 80 hacia nuestro servicio en http://localhost:3000

server {
    listen 80;

    server_name midominio.com;

    location / {
        proxy_pass http://localhost:3000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

Servir contenido estático desde una carpeta dedicada

Podemos configurar nginx para servir contenido multimedia directamente desde una carpeta d forma eficiente.

location /media/ {
    alias /var/www/misitio/media/;
    autoindex on;
}

Si sirves archivos grandes, puedes mejorar rendimiento con configuraciones extra. Aquí simplemente sería cuestión de buscar configuraciones para servir nuestro contenido de forma más eficientes, por ejemplo videos grandes en "chunks".

location /media/ {
    alias /var/www/misitio/media/;
    autoindex on;

    # Habilitar rangos de bytes
    add_header Accept-Ranges bytes;

    # Mandar archivos grandes en bloques (no todo en memoria)
    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    output_buffers 1 512k;
    aio on;                # I/O asíncrono (si el kernel lo soporta)
    directio 8m;           # Leer directo del disco sin buffer de SO para archivos grandes
}

Configurar HTTPS gratuito con Certbot

A día de hoy el estandar es servir contenido web a travez de HTTPS en vez de HTTP.

Las peticiones HTTPS tienen la ventaja de ir encriptadas, de manera que si alguien intercepta nuestro tráfico, no podrá ver el contenido que va interiormente. Unicamente podrá ver el contenido encriptado. Así conseguimos una conexión segura.

certbot

Usaremos Certbot para generar el certificado necesario para crear estas conexiones seguras.

Aqui hay está la guía oficial para diferentes sistemas

Para distribuciones basadas en APT como son Debian o Ubuntu, podemos seguir los siguientes pasos:

sudo apt install certbot python3-certbot-nginx
sudo certbot --nginx

La utilidad de certbot nos solicitará mediante un prompt interactivo en la terminal el dominio para el cual queremos generar el certificado y nos lo instalará automaticamente por nosotros modificando nuestros ficheros de configuración de nginx.