Saltar al contenido
Server 2026-09-05 15 min de lectura

Cómo instalar Redis en un VPS y configurarlo para producción

Redis trabaja principalmente en memoria y suele usarse como caché, cola, almacén de sesiones o estructura de datos rápida. Instalarlo en un VPS toma minutos; configurarlo para producción exige decidir qué datos puede expulsar, qué debe sobrevivir a un reinicio y qué clientes están autorizados a ejecutar cada comando.

Cómo instalar Redis en un VPS y configurarlo para producción
#Redis#VPS#Ubuntu#Base de datos
T
Equipo Terranode
Editorial

Definir primero qué papel tendrá Redis

La configuración correcta cambia según el uso. Una caché de páginas puede perder todas sus claves y reconstruirse desde la base principal. Una cola no debería descartar trabajos para liberar RAM. Un almacén de sesiones puede tolerar cierta pérdida según la aplicación, pero expulsar una clave cerrará la sesión de un usuario. Tratar esos tres escenarios como si fueran iguales produce políticas peligrosas.

Antes de instalar, responde cuatro preguntas: ¿Redis es la fuente única de algún dato?, ¿cuánto dato puedes perder al fallar?, ¿qué latencia de recuperación acepta el servicio? y ¿qué ocurrirá cuando alcance el límite de memoria? Esas respuestas determinan persistencia, maxmemory-policy, backups y alertas.

Instalar Redis en Ubuntu

La opción sencilla es utilizar los paquetes de Ubuntu, que se actualizan junto con el sistema. Instala el servidor, habilítalo y confirma la versión activa:

bash
sudo apt update
sudo apt install -y redis-server
sudo systemctl enable --now redis-server
sudo systemctl status redis-server --no-pager
redis-server --version
redis-cli ping

La respuesta esperada al último comando es PONG. Ese resultado solo demuestra que un cliente local pudo llegar al proceso; todavía no confirma aislamiento de red, límites, ACL ni persistencia.

En Ubuntu el archivo principal suele ser /etc/redis/redis.conf. Haz una copia con permisos conservados antes de editarlo:

bash
sudo cp -a /etc/redis/redis.conf /etc/redis/redis.conf.bak
sudo nano /etc/redis/redis.conf

Valida cada cambio en una segunda terminal y usa sudo systemctl restart redis-server únicamente después de revisar la configuración. Un error de sintaxis impide el arranque; la sesión SSH abierta te permitirá restaurar la copia.

Mantener el puerto 6379 fuera de Internet

Si la aplicación vive en el mismo VPS, Redis debe escuchar solo en loopback. Conserva estas directivas:

text
bind 127.0.0.1 ::1
protected-mode yes
port 6379

Reinicia y comprueba la dirección real:

bash
sudo systemctl restart redis-server
sudo ss -ltnp | grep 6379

Deberías ver 127.0.0.1:6379 y, si IPv6 está habilitado, [::1]:6379; no 0.0.0.0:6379. No abras UFW porque la aplicación local no atraviesa el firewall para conectarse a loopback.

Cuando el cliente está en otra máquina, usa una red privada o un túnel WireGuard y enlaza Redis solo a la IP privada del servidor. Permite en el firewall una dirección de origen concreta:

bash
sudo ufw allow from 10.20.0.10 to any port 6379 proto tcp
sudo ufw status numbered

Una contraseña no convierte en segura una instancia pública. Exponer Redis agrega intentos automatizados, facilita ataques de denegación de servicio y deja el servicio a merced de cualquier futura vulnerabilidad. La defensa principal es la red; ACL y TLS agregan controles sobre los clientes autorizados.

Crear usuarios con ACL en lugar de compartir una clave

Las ACL permiten asignar a cada aplicación su propia contraseña, patrones de claves y grupos de comandos. Esto evita que un servicio dedicado a sesiones pueda borrar una cola o ejecutar comandos administrativos. Deshabilita el usuario default si todos tus clientes admiten nombre de usuario:

text
user default off
user miapp on >CAMBIA_ESTA_CLAVE_LARGA ~miapp:* +@read +@write -@dangerous

El patrón ~miapp:* restringe el usuario a claves con ese prefijo. Las categorías @read y @write conceden operaciones habituales, mientras -@dangerous niega acciones administrativas o destructivas. Esta es una base que debes probar contra los comandos reales del cliente; algunas bibliotecas necesitan PING, CLIENT SETNAME, scripts Lua o operaciones de pub/sub.

Guarda las ACL en un archivo separado para no exponer contraseñas cada vez que compartes redis.conf:

text
aclfile /etc/redis/users.acl

Protege el archivo y recarga:

bash
sudo chown redis:redis /etc/redis/users.acl
sudo chmod 640 /etc/redis/users.acl
sudo systemctl restart redis-server
redis-cli --user miapp --askpass PING

No escribas la contraseña en la línea de comandos con -a, porque puede quedar en el historial o ser visible en la lista de procesos. Usa --askpass, una variable de entorno protegida durante una tarea puntual o el gestor de secretos de la plataforma.

Elegir un límite de memoria que no ahogue al VPS

Redis guarda datos, índices internos, buffers de clientes y estructuras de replicación en RAM. maxmemory limita principalmente el conjunto de datos sujeto a expulsión; el proceso puede consumir más por fragmentación, buffers y operaciones temporales. Por eso no asignes el cien por ciento de la memoria del VPS.

En un servidor de 4 GB compartido con sistema, proxy y aplicación, empezar con 1 o 2 GB para Redis puede ser razonable, pero la cifra correcta surge de medir los demás procesos. Configura un límite explícito:

text
maxmemory 1536mb
maxmemory-policy allkeys-lru

La política debe corresponder al papel del servicio:

PolíticaQué haceUso típico
noevictionRechaza escrituras cuando llega al límiteColas o datos que no deben desaparecer
allkeys-lruExpulsa claves poco usadas de cualquier tipoCaché general con claves reconstruibles
allkeys-lfuExpulsa según frecuencia estimadaCaché donde importa conservar lo más consultado
volatile-lruSolo expulsa claves con expiraciónMezcla controlada, si todas las claves descartables tienen TTL
volatile-ttlPrioriza claves próximas a expirarCaché gobernada por vencimientos

noeviction preserva datos existentes, pero la aplicación recibirá errores de escritura y debe manejarlos. Una política allkeys-* mantiene Redis disponible sacrificando claves. Para una cola, expulsar silenciosamente trabajos es peor que rechazar una publicación y activar una alerta.

Consulta el consumo y la fragmentación:

bash
redis-cli --user miapp --askpass INFO memory
redis-cli --user miapp --askpass INFO stats

Observa used_memory, used_memory_rss, mem_fragmentation_ratio, evicted_keys y rejected_connections. Un crecimiento continuo sin aumento previsto de claves puede indicar TTL ausente, clientes con buffers grandes o una carga que guarda valores demasiado pesados.

Diseñar expiraciones y nombres de claves

Una caché sin TTL se convierte en una base de datos accidental. La aplicación debe establecer vencimientos al escribir y usar prefijos que identifiquen dueño y entorno, por ejemplo produccion:catalogo:producto:123. Evita KEYS * en producción: recorre todo el espacio de claves y bloquea el hilo principal durante el trabajo. Para inspección usa SCAN, que devuelve resultados por lotes:

bash
redis-cli --user miapp --askpass --scan --pattern 'miapp:*' | head

Comprueba claves sin expiración mediante muestreo y corrige la aplicación, no con una limpieza manual recurrente. Borrar millones de claves de golpe con DEL puede bloquear; UNLINK libera la memoria de forma asíncrona y suele ser más seguro para valores grandes.

El tamaño de cada valor importa tanto como el número de claves. Guardar respuestas JSON gigantes o archivos binarios aumenta memoria, tráfico y tiempo de serialización. Redis debe almacenar identificadores y datos de acceso frecuente; archivos y blobs suelen pertenecer a almacenamiento de objetos.

Escoger entre RDB, AOF o ninguna persistencia

RDB toma snapshots periódicos. Su recuperación es rápida y el archivo es compacto, pero una caída puede perder los cambios desde el último snapshot. AOF registra operaciones de escritura; reduce la ventana de pérdida según su política de sincronización, a cambio de más I/O y archivos mayores.

Para una caché pura puedes desactivar persistencia si la aplicación reconstruye los datos y aceptas el arranque en frío. Para sesiones, colas o datos no reconstruibles, define explícitamente el objetivo de pérdida. Una configuración común combina snapshots con AOF:

text
save 900 1
save 300 10
save 60 10000
appendonly yes
appendfsync everysec
aof-use-rdb-preamble yes

appendfsync everysec busca un equilibrio: en una caída abrupta podría perderse aproximadamente el último segundo de escrituras. always sincroniza cada operación y aumenta latencia; no delega la decisión al sistema operativo y amplía la ventana. Ningún modo promete cero pérdida ante cualquier falla de hardware.

Revisa el estado de persistencia:

bash
redis-cli INFO persistence
sudo ls -lh /var/lib/redis
sudo journalctl -u redis-server --since today

Si rdb_last_bgsave_status o aof_last_bgrewrite_status marca error, revisa espacio, permisos y memoria. Durante BGSAVE o reescritura AOF el proceso hace fork; con muchas páginas modificadas, el consumo temporal puede crecer. Deja margen y no ejecutes esas tareas cuando el VPS ya está al límite.

Hacer backups sin copiar archivos activos a ciegas

Un snapshot RDB es portable, pero copiar dump.rdb mientras Redis lo reemplaza puede capturar un estado inesperado. Solicita primero un guardado y verifica la hora del último éxito:

bash
redis-cli --user administrador --askpass BGSAVE
redis-cli --user administrador --askpass LASTSAVE
sudo cp --preserve=mode,ownership /var/lib/redis/dump.rdb /var/backups/redis-dump.rdb

El usuario de aplicación no debería tener permiso para BGSAVE; usa una cuenta operativa limitada o la conexión local administrativa. Si trabajas con AOF multiparte, respalda el directorio completo conforme al método soportado por tu versión, no solo un archivo que parezca principal.

Una copia válida debe arrancar en un entorno aislado. Levanta otra instancia en un puerto distinto, sin acceso externo, apunta a la copia y comprueba claves representativas. Registra cuánto tarda en cargar y cuánta memoria necesita. Conserva el respaldo fuera del VPS: si falla el disco o borras la máquina, una copia local desaparece con ella.

Integrar Redis con systemd y el kernel

El paquete de Ubuntu ejecuta Redis con un usuario dedicado y systemd. Conserva supervised systemd cuando corresponda y evita iniciarlo manualmente como root. Revisa límites efectivos:

bash
systemctl cat redis-server
systemctl show redis-server -p User -p Group -p LimitNOFILE

Redis puede advertir sobre vm.overcommit_memory. Evalúa el ajuste porque las operaciones de persistencia necesitan reservar memoria virtual durante fork:

bash
sysctl vm.overcommit_memory
echo 'vm.overcommit_memory = 1' | sudo tee /etc/sysctl.d/99-redis.conf
sudo sysctl --system

No desactives Transparent Huge Pages sin verificar la recomendación de tu versión y el comportamiento del host. Cualquier cambio de kernel afecta otras cargas del VPS y debe documentarse con una medición previa y posterior.

Medir latencia, clientes y comandos lentos

Redis procesa la mayoría de comandos en un hilo principal; una operación costosa retrasa a todos los clientes. El slow log registra comandos cuyo tiempo de ejecución supera el umbral configurado, sin contar el tiempo de red:

bash
redis-cli --user miapp --askpass SLOWLOG GET 20
redis-cli --user miapp --askpass LATENCY DOCTOR
redis-cli --user miapp --askpass INFO clients
redis-cli --user miapp --askpass INFO commandstats

Busca escaneos completos, scripts Lua largos, colecciones gigantes y clientes bloqueados. MONITOR muestra todos los comandos en tiempo real, pero añade carga y puede revelar datos sensibles; úsalo solo durante una investigación breve y controlada.

La latencia vista por la aplicación incluye red, pool del cliente, serialización y servidor. Si redis-cli --latency desde el mismo host es estable pero la aplicación es lenta, revisa conexiones, DNS y tamaño de valores antes de culpar a Redis.

Probar reinicios y fallos antes de producción

Escribe una clave de prueba con vencimiento, reinicia el servicio y comprueba el resultado según la política de persistencia elegida:

bash
redis-cli --user miapp --askpass SET miapp:prueba 'ok' EX 600
sudo systemctl restart redis-server
redis-cli --user miapp --askpass GET miapp:prueba
redis-cli --user miapp --askpass TTL miapp:prueba

Prueba también que una conexión desde una interfaz no autorizada falla y que el usuario de aplicación no puede ejecutar comandos administrativos. Una prueba negativa detecta reglas demasiado amplias que un PING exitoso nunca mostraría.

Si Redis alimenta una cola, pausa un worker, acumula algunos trabajos y recupéralo. Si guarda sesiones, reinicia bajo una sesión de prueba. Si funciona como caché, vacía únicamente el entorno de pruebas y mide el impacto del calentamiento. La validación debe imitar el uso real.

Resolver fallos habituales

SíntomaCausa probableAcción inicial
Connection refusedServicio detenido o dirección incorrectaRevisar systemctl, ss y URL del cliente
NOAUTH o WRONGPASSUsuario, contraseña o sintaxis ACL incorrectosProbar con redis-cli --user ... --askpass
NOPERMACL no incluye comando o patrón de claveConsultar ACL LOG con una cuenta operativa
OOM command not allowedSe alcanzó maxmemory con noevictionRevisar crecimiento, TTL y capacidad
Aumentan evicted_keysPolítica de expulsión actuando continuamenteAjustar datos, expiración o RAM según el uso
Redis no reiniciaError de configuración o archivo sin permisojournalctl -u redis-server y copia anterior
Disco crece sin controlAOF o snapshots sin espacio suficienteRevisar reescritura, retención y alertas

No soluciones un OOM elevando maxmemory hasta ocupar toda la máquina. Si Redis comparte VPS, el kernel necesita memoria para el sistema, la aplicación y la caché de archivos. La guía qué hacer cuando el VPS se queda sin RAM ayuda a distinguir una carga legítima de una fuga o un límite mal calculado.

Checklist antes de conectar la aplicación

Confirma que el proceso corre como el usuario redis, el puerto no es público, el usuario ACL accede solo a su prefijo y la política de memoria coincide con el tipo de dato. Verifica persistencia, ejecuta un reinicio, restaura un backup aislado y activa alertas sobre memoria, expulsiones, errores de guardado, conexiones rechazadas y reinicios.

Durante la primera semana registra used_memory, RSS, claves, operaciones por segundo, aciertos y fallos de caché, latencia y crecimiento de AOF/RDB. Un promedio diario puede esconder picos de importaciones o campañas; conserva resolución suficiente para ver qué ocurrió durante el incidente.

Documenta cómo rotar una credencial ACL sin cortar clientes: crea una segunda contraseña o usuario, actualiza aplicaciones, comprueba conexiones y después retira la anterior. Esta secuencia evita que una rotación de seguridad se convierta en una caída coordinada de todos los servicios.

Detectar claves grandes, hot keys y diseños que bloquean Redis

Una instancia puede tener memoria libre y aun así sufrir picos de latencia por la forma de sus claves. Una big key contiene un valor o colección desproporcionada; una hot key recibe una fracción excesiva de las operaciones. La primera encarece lectura, borrado, serialización y replicación. La segunda concentra el trabajo en un único punto aunque el conjunto total de datos sea pequeño.

Empieza con las herramientas de muestreo incluidas en redis-cli, preferiblemente durante una ventana controlada:

bash
redis-cli --user administrador --askpass --bigkeys
redis-cli --user administrador --askpass --memkeys
redis-cli --user administrador --askpass INFO keyspace
redis-cli --user administrador --askpass SLOWLOG GET 20

--bigkeys recorre el espacio con SCAN, por lo que es menos agresivo que KEYS *, pero sigue generando trabajo y debe probarse primero en una réplica o periodo de baja demanda. No pegues su salida completa en tickets públicos: los nombres pueden revelar correos, identificadores de clientes o estructura interna.

Cuando identifiques una clave sospechosa, consulta su tipo y memoria aproximada sin descargar todo el contenido:

bash
redis-cli --user administrador --askpass TYPE miapp:clave
redis-cli --user administrador --askpass MEMORY USAGE miapp:clave SAMPLES 5
redis-cli --user administrador --askpass TTL miapp:clave

La corrección depende del modelo. Divide hashes o listas gigantes por cliente, fecha o partición lógica; pagina resultados; evita guardar documentos completos cuando solo necesitas dos campos y asigna TTL a datos reconstruibles. Para eliminar una clave grande, UNLINK permite liberar memoria en segundo plano y suele afectar menos al hilo principal que DEL, aunque debes comprobar que la versión y la política de tu aplicación toleran la desaparición.

Las hot keys requieren otra respuesta: caché local de corta duración, distribución de contadores, lectura desde réplicas cuando la consistencia lo permita o rediseño del patrón de acceso. Añadir RAM no elimina una concentración de operaciones. Mide siempre desde la aplicación: una clave “popular” puede ser legítima si mantiene baja latencia y no bloquea a otros clientes.

Separar aplicaciones: los números de base no son una frontera de seguridad

Redis permite seleccionar bases numeradas, pero todas comparten proceso, memoria, CPU, configuración, persistencia y credenciales salvo que las ACL se diseñen cuidadosamente. SELECT 1 organiza nombres; no aísla una aplicación problemática ni impide que una operación administrativa afecte a las demás. Por eso no debes tratar cada número como si fuera una base independiente comparable a PostgreSQL.

Para cargas del mismo nivel de confianza, los prefijos y patrones ACL pueden ser suficientes: tienda:sesion:, tienda:cache: o facturacion:cola:*. El usuario de cada aplicación debe acceder solo a sus patrones y a los grupos de comandos necesarios. Comprueba la negativa intentando leer una clave de otro prefijo con la credencial de aplicación.

Si una carga conserva datos críticos y otra usa Redis como caché descartable, sepáralas en instancias o servidores. Necesitan políticas de expulsión incompatibles: la caché puede usar una política que retire claves, mientras una cola debe rechazar escrituras antes de borrar trabajos. Separarlas también evita que un FLUSHDB, script costoso o crecimiento súbito de una aplicación afecte la disponibilidad de la otra.

Replicación y Sentinel no reemplazan los backups

Una réplica copia el estado del primario para facilitar lecturas o recuperación ante una caída; también replica borrados accidentales, expiraciones y escrituras de un cliente comprometido. Sentinel puede detectar fallos y promover una réplica, pero no conserva por sí mismo una versión anterior de los datos. Alta disponibilidad y recuperación histórica responden a riesgos diferentes.

Antes de diseñar failover, decide qué acepta la aplicación. Una promoción puede perder las últimas escrituras que todavía no llegaron a la réplica, y un cliente mal configurado puede seguir intentando el nodo antiguo. Prueba desconexión, elección del nuevo primario, reconexión y regreso a un estado estable con tráfico de ensayo. Observa el retraso de replicación y el resultado funcional, no solo que todos los procesos estén activos.

Los backups deben salir de la misma infraestructura y conservar versiones. Para RDB o AOF, ensaya el arranque de una instancia aislada con la copia, cuenta claves representativas y valida una operación de negocio. Si Redis es solo caché, quizá la mejor recuperación sea arrancar vacío y recalentar de forma controlada; documenta esa decisión para que nadie restaure datos obsoletos durante una emergencia.

Incluye en el ensayo qué ocurre con los clientes durante la recuperación. Deben aplicar tiempos de espera, reintentos limitados y degradación controlada; un bucle de reconexión sin pausa puede saturar justo la instancia que acaba de volver. Mide cuánto tarda la aplicación en estabilizarse, no únicamente cuánto tarda Redis en responder PONG.

Redis en producción debe estar aislado por red, autenticado con ACL y limitado según el papel que cumple. Una caché puede expulsar claves reconstruibles; una cola o un almacén primario necesita rechazar escrituras, persistir y alertar antes de perder datos. La política correcta nace del impacto de una pérdida, no de una plantilla universal.

Instalar el paquete y recibir PONG es apenas el comienzo. Prueba permisos, memoria llena, reinicios y restauraciones; vigila latencia, claves expulsadas y errores de persistencia. Con esos controles, Redis puede acelerar la aplicación sin convertirse en el proceso que consume toda la RAM o en una base expuesta por accidente.

¿Listo para llevar tu sitio al siguiente nivel?

Hosting con LiteSpeed, NVMe y soporte 24/7 desde $3/mes.

Ver planes de hosting

Preguntas frecuentes