Configurar un VPS Ubuntu para publicar tu web
Configura un VPS Ubuntu 24.04 LTS nuevo para servir una web estática con Nginx y HTTPS. El recorrido separa las claves SSH, el usuario administrador, el cortafuegos y la verificación final. Si ya tienes una aplicación en producción, prepara antes un entorno de pruebas.
En esta guía
Prepara el servidor, el dominio y la recuperación
Necesitas un VPS nuevo con IPv4 pública, SSH en el puerto 22, una cuenta inicial con sudo y un dominio que controles. Los comandos de tu ordenador utilizan Bash en Linux, macOS o WSL; los del servidor se ejecutan dentro de SSH. Sustituye 203.0.113.10 por tu IP y app.example.com por tu dominio: son ejemplos reservados para documentación.
El usuario inicial de los ejemplos es ubuntu; usa el indicado por tu proveedor. Abre la consola de recuperación antes de cambiar acceso o reglas de red. Detente si las rutas del ejemplo ya pertenecen a otro sitio. En imágenes Ubuntu de Oracle Cloud no debes aplicar la rama UFW: sigue las reglas específicas de esa imagen.
Crea una clave y verifica la identidad del servidor
En tu ordenador, crea una clave dedicada con contraseña. Si el archivo ya existe, utiliza otro nombre en todos los pasos. Solo el archivo .pub es público; la clave privada se queda en tu equipo.
mkdir -p ~/.ssh
ssh-keygen -t ed25519 -f ~/.ssh/ubuntu_vps
cat ~/.ssh/ubuntu_vps.pubServidor aún no creado: proporciona esta clave pública al crear la instancia Ubuntu 24.04. Confirma el usuario inicial y continúa con la verificación de la huella. Omite la copia con la clave antigua.
Servidor vacío que ya existe: conserva abierta la sesión que funciona. Desde otra terminal de tu ordenador, copia la nueva clave pública mediante ese acceso. Cambia existing_vps_key por tu clave actual; si entras con contraseña o agente SSH, omite esa opción -i sin modificar la autenticación del servidor.
scp -i ~/.ssh/existing_vps_key ~/.ssh/ubuntu_vps.pub ubuntu@203.0.113.10:ubuntu-vps-admin.pubEn la sesión existente del servidor, valida el archivo y añádelo a las claves autorizadas de tu propia cuenta inicial. El bloque conserva las entradas anteriores. Si no tienes acceso, resuélvelo primero desde la recuperación del proveedor.
if ssh-keygen -lf ~/ubuntu-vps-admin.pub; then
mkdir -p ~/.ssh
chmod 700 ~/.ssh
printf '\n' >> ~/.ssh/authorized_keys
cat ~/ubuntu-vps-admin.pub >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
fiEn ambos casos, verifica la huella de la clave del servidor desde la consola de confianza. Para una clave Ed25519 del servidor:
sudo ssh-keygen -lf /etc/ssh/ssh_host_ed25519_key.pubDesde tu ordenador, conecta y acepta la huella solo si coincide con el mismo tipo de clave mostrado por la consola.
ssh -i ~/.ssh/ubuntu_vps ubuntu@203.0.113.10Copia también el archivo público para preparar la cuenta administradora del siguiente paso:
scp -i ~/.ssh/ubuntu_vps ~/.ssh/ubuntu_vps.pub ubuntu@203.0.113.10:ubuntu-vps-admin.pubCrea un administrador y comprueba otra sesión
En la cuenta inicial del servidor, comprueba que la versión es Ubuntu 24.04 y revisa memoria y disco. Lee la propuesta de actualización antes de aceptarla. Este ejemplo crea deploy: si ya existe, no sobrescribas sus claves ni reutilices el bloque sin revisar la cuenta.
cat /etc/os-release
free -h
df -h /
sudo apt update
sudo apt upgrade
sudo adduser deploy
sudo usermod -aG sudo deploy
sudo install -d -m 700 -o deploy -g deploy /home/deploy/.ssh
sudo install -m 600 -o deploy -g deploy ~/ubuntu-vps-admin.pub /home/deploy/.ssh/authorized_keysMantén abierta la sesión inicial y conecta desde una segunda terminal de tu ordenador:
ssh -i ~/.ssh/ubuntu_vps deploy@203.0.113.10En la nueva sesión comprueba los permisos:
sudo whoamiLa respuesta esperada es root. No cierres el acceso anterior ni desactives contraseñas hasta haber probado la nueva cuenta y el acceso de recuperación. Los pasos restantes utilizan esta cuenta administradora.
Instala Nginx y revisa los dos niveles de cortafuegos
En el VPS, instala y activa el servidor web:
sudo apt install nginx
sudo systemctl enable --now nginxEn el panel del proveedor permite TCP 80 y 443 para la web. Restringe SSH a tu IP administrativa cuando sea posible. Comprueba todas las reglas asociadas: una regla restrictiva no anula otra que permita el mismo tráfico.
Rama UFW: solo para una imagen Ubuntu genérica donde el proveedor admita UFW y no exista otro gestor incompatible. No la ejecutes en las imágenes OCI Ubuntu. Si SSH utiliza otro puerto, ajusta primero la regla correspondiente. Conserva abierta la consola de recuperación.
sudo apt install ufw
sudo ufw allow 22/tcp
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw enable
sudo ufw status verbosePrueba inmediatamente otra conexión SSH. Permitir un puerto en el VPS no lo abre en el cortafuegos del proveedor, ni al revés.
Publica una página en un sitio Nginx separado
Usa estas rutas solo si no existen. Sustituye app.example.com dentro de la configuración por tu dominio. El ejemplo crea un archivo de prueba, una configuración específica y su enlace de activación.
sudo install -d -m 755 /var/www/first-site
printf '%s\n' '<!doctype html><html lang="es"><title>Primer despliegue</title><h1>Esta página funciona en un VPS Ubuntu</h1></html>' | sudo tee /var/www/first-site/index.html
sudo tee /etc/nginx/sites-available/first-site >/dev/null <<'EOF'
server {
listen 80;
listen [::]:80;
server_name app.example.com;
root /var/www/first-site;
index index.html;
location / {
try_files $uri $uri/ =404;
}
}
EOF
sudo ln -s /etc/nginx/sites-available/first-site /etc/nginx/sites-enabled/first-site
sudo nginx -tContinúa únicamente si nginx -t termina correctamente. Si falla, corrige el archivo señalado antes de recargar:
sudo systemctl reload nginxDesde tu ordenador puedes comprobar el servidor sin esperar a DNS:
curl --resolve app.example.com:80:203.0.113.10 http://app.example.com/Debes recibir el HTML de prueba de este sitio. Una respuesta del sitio predeterminado indica que el nombre solicitado o la selección de configuración no coincide.
Apunta DNS y activa HTTPS
Crea el registro A del dominio hacia la IPv4 pública y espera a que resuelva correctamente. Publica un registro AAAA solo si IPv6 funciona de extremo a extremo. Para este primer ejercicio, verifica el acceso directo al origen; un proxy añade otra capa de configuración.
Comprueba desde otra red que el dominio llega al sitio por HTTP en el puerto 80. Después ejecuta en el VPS:
sudo apt install certbot python3-certbot-nginx
sudo certbot --nginx -d app.example.com --redirect
sudo nginx -t
sudo certbot renew --dry-run
systemctl list-timers --all certbot.timerIntroduce el correo y acepta los términos de Certbot solo después de revisarlos. Confirma que la prueba de renovación termina correctamente y que aparece el temporizador. Un certificado emitido una vez no demuestra que pueda renovarse.
Verifica la web desde fuera y después de reiniciar
Desde tu ordenador comprueba la redirección HTTP, la respuesta HTTPS y el contenido:
curl -I http://app.example.com/
curl -I https://app.example.com/
curl -fsS https://app.example.com/Espera una redirección hacia HTTPS y una respuesta correcta de tu página. Verifica también la cadena de confianza del certificado en el navegador, sin ignorar errores de TLS.
Cuando el VPS todavía sea de pruebas y no atienda trabajo importante, reinícialo de forma deliberada y repite SSH, HTTPS y la comprobación de Nginx. Un reinicio interrumpe las sesiones. Guarda configuración y contenido fuera del servidor y prueba su restauración.
Qué revisar cuando una comprobación falla
Desplaza la tabla para ver todas las columnas →
| Problema | Primera comprobación |
|---|---|
| SSH no conecta | IP, puerto, reglas de red y consola del proveedor |
| Se muestra otra web | server_name, Host solicitado y configuración activada |
| El certificado no se emite | DNS público, puerto 80, registro AAAA y acceso al dominio |
| Nginx no recarga | Resultado de nginx -t y archivo indicado |
| La web no vuelve después del reinicio | Servicios habilitados, registros y dependencias |
Para un fallo de acceso, sigue el diagnóstico por mensaje SSH. Corrige el punto concreto sin reinstalar a ciegas ni sustituir una configuración que todavía funciona.
Preguntas y respuestas
¿Puedo usarlo en un VPS que ya tiene una web?
Esta guía parte de un servidor nuevo. En uno existente, inventaría los sitios, puertos, usuarios y copias antes de adaptar los comandos; algunas rutas y nombres podrían estar ocupados.
¿Esto instala WordPress, Node.js o una base de datos?
No. Publica una web estática. Una aplicación dinámica necesita su runtime, permisos, procesos y procedimiento de copia de datos propios.