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 -t
que 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.
\
será manejada por el archivo index.html.midominio.com/sobre-mi.html
buscará en root el fichero sobre-mi.html
y si no lo encuentra devolverá un error 404.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.
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;
}
}
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;
}
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.
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`
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;
}
}
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
}
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.
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.