Escenario habitual: un único servidor Ubuntu con Nginx como frontal, sirviendo varios dominios independientes sobre la misma IP pública (un server{} por dominio, HTTPS con certificado propio vía Let's Encrypt/Certbot y renovación automática), con estructura separada por dominio (/var/www/<dominio>/...) y, en algunos de esos dominios o subdominios, un reverse proxy hacia microservicios internos (típicamente FastAPI/Python). Solo 80/443 expuestos al público; el resto de puertos cerrados salvo necesidad concreta.
Es una configuración estándar y muy repetible, pero el dimensionado de la máquina no siempre es intuitivo: la tentación es mirar solo el número de dominios, cuando en la práctica el consumo real depende sobre todo de cuántos procesos de microservicio conviven a la vez.
Cómodo para 1–4 dominios estáticos + 1–3 microservicios ligeros, con el stack de seguridad estándar (§4) corriendo de fondo.
Margen hasta ~10 dominios + 6–8 microservicios ligeros sin tocar la máquina. La opción por defecto si la idea es ir añadiendo dominios/servicios con el tiempo.
Nginx sirviendo estático y haciendo de proxy es barato en CPU y en RAM, incluso con TLS de por medio. El coste real está en los procesos Python: un worker (uvicorn/gunicorn) de una API ligera suele ocupar entre 100 y 250 MB en reposo según dependencias (Pydantic, SQLAlchemy, clientes HTTP…), y ese consumo es permanente mientras el proceso vive — a diferencia de Nginx, que solo tira de recursos bajo demanda. Con 5–8 microservicios activos a la vez, eso ya son 1–2 GB solo en procesos Python, antes de contar sistema operativo, Nginx y el stack de seguridad.
Horquilla aproximada, no una regla exacta. Pensada para microservicios «ligeros» (APIs CRUD, integraciones, formularios) sin base de datos pesada propia ni procesamiento intensivo.
| Escenario | Dominios estáticos | Microservicios | vCPU | RAM | Disco SSD |
|---|---|---|---|---|---|
| Solo microservicioreferencia real, sin stack de seguridad completo | 0–1 | 1–2 muy ligeros | 2 |
2 GB |
60 GB |
| Arranque | 1–3 | 0–1 ligero | 2 |
8 GB |
60 GB |
| Mínimo recomendadopunto de partida real con seguridad completa | 1–4 | 1–3 ligeros | 2 |
8 GB |
80 GB |
| Estándar con margenrecomendada para crecer | 4–10 | 4–8 ligeros | 4 |
16 GB |
160 GB |
| Crecimiento sostenido | 10–20 | 8–15 ligeros | 6 |
24–32 GB |
240 GB |
| Carga alta / servicios con estadoBD local, colas, más tráfico | >20 | >15, o alguno con CPU/BD propia | 8+ |
32 GB+ |
300 GB+ |
Con la máquina en marcha, este es el mínimo que aplicamos por defecto en cualquier servidor Ubuntu con exposición pública, no solo en el escenario multidominio:
ufw en el propio servidor. Solo 22/80/443 abiertos al público; el resto cerrado salvo necesidad concreta.PermitRootLogin no explícito en sshd_config, y Fail2Ban con jail para SSH desde el primer día.server{} por dominio, certificado Let's Encrypt independiente por dominio vía Certbot, renovación automática por el timer de systemd que instala el propio paquete (sin cron manual).systemd (no nohup/screen), arranque automático y reinicio ante fallo. Usuario Unix dedicado (no root) por servicio o al menos un usuario de despliegue sin privilegios.limit_req por ubicación en las rutas de API expuestas, para no quedar abierto a abuso desde el minuto uno./var/www/<dominio>, y código + requirements.txt de cada microservicio.