Saltar al contenido
JS BRAND LAB

VPS · Cómo hacerlo

Desplegar una web (Astro o Next.js) en un VPS con nginx y HTTPS

Para publicar una web en un VPS Ubuntu necesitas cuatro piezas: nginx para servirla, tu proyecto compilado en una carpeta, un certificado HTTPS gratuito de Let's Encrypt y, si es una aplicación con servidor como Next.js, un servicio de systemd que la mantenga viva. Es lo que usamos para este sitio y otros 20; estos son los pasos.

Actualizado el 2026-11-10 · Por Rómulo Felizola · Read in English

Antes de empezar

  • Un VPS con Ubuntu 24.04 ya preparado con el checklist del primer día.
  • Un dominio con un registro A que apunte a la IP del VPS (los cambios de DNS pueden tardar en propagarse).
  • Tu proyecto compilado: dist/ en Astro o la salida standalone en Next.js.
apt install nginx certbot python3-certbot-nginx -y

Caso A: web estática (Astro, HTML)

Copia la carpeta compilada al servidor y sírvela con nginx. Así está el nuestro, simplificado:

server {
    server_name tudominio.com;
    root /srv/tudominio/sitio;
    index index.html;
    server_tokens off;

    location /_astro/ {
        add_header Cache-Control "public, max-age=31536000, immutable" always;
        try_files $uri =404;
    }
}

Los archivos de /_astro/ llevan un nombre con huella del contenido, así que pueden cachearse un año sin riesgo. Guarda el archivo en /etc/nginx/sites-available/, enlázalo en sites-enabled y recarga:

ln -s /etc/nginx/sites-available/tudominio.conf /etc/nginx/sites-enabled/
nginx -t && systemctl reload nginx

Caso B: aplicación Next.js (o cualquier app con servidor)

La aplicación se ejecuta como servicio, escucha solo en localhost y nginx le hace de proxy. El servicio (el nuestro, con un tope de memoria):

# /etc/systemd/system/miapp.service
[Service]
User=miapp
WorkingDirectory=/srv/miapp/.next/standalone
Environment="NODE_ENV=production"
Environment="PORT=3020"
Environment="HOSTNAME=127.0.0.1"
ExecStart=/usr/bin/node server.js
Restart=always
RestartSec=5
MemoryMax=400M

[Install]
WantedBy=multi-user.target
systemctl daemon-reload
systemctl enable --now miapp

Y en nginx, el bloque que reenvía el tráfico:

location / {
    proxy_pass http://127.0.0.1:3020;
    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;
}

HTTPS gratis con Let's Encrypt

certbot --nginx -d tudominio.com -d www.tudominio.com
certbot renew --dry-run

certbot edita tu configuración de nginx y activa un temporizador que renueva los certificados antes de caducar. El segundo comando comprueba que la renovación funcionará: hazlo siempre, porque un certificado caducado es una web que el navegador marca como peligrosa.

Qué comprobar al terminar

  • curl -I https://tudominio.com devuelve 200 y la cabecera con tu certificado.
  • systemctl status miapp aparece activo, y tras un reinicio del servidor sigue activo.
  • Si algo falla con un 502, sigue la guía del error 502.

Para tener dónde probarlo:VPS KVM 2 en Hostinger

Si prefieres que alguien lo monte y lo mantenga, de eso se ocupa nuestro mantenimiento web.

Preguntas frecuentes

¿Cuántas webs caben en un mismo VPS?

Con nginx puedes servir cada dominio con su propio archivo de configuración. El límite es la memoria que ocupen tus aplicaciones: mira la medición en nuestro servidor.

¿Hace falta un panel de control?

No. La página de Hostinger no lo muestra como incluido por defecto, aunque ofrece plantillas opcionales con paneles como cPanel, Plesk o CloudPanel. En nuestro servidor usamos nginx y systemd sin panel.

¿Se renueva solo el certificado?

Sí, certbot instala un temporizador de renovación. Compruébalo con certbot renew --dry-run y con systemctl list-timers.