"IP fantasma: un backup en data/admin/ips/ deja nginx y Apache sin arrancar"

El síntoma

Ni nginx ni Apache arrancan. En el journal:

nginx: [emerg] host not found in "192.0.2.10.bak.20260709" of the "listen" directive
       in /etc/nginx/nginx-vhosts.conf:3

AH00526: Syntax error on line 31 of /etc/httpd/conf/extra/httpd-vhosts.conf:
       <VirtualHost> directive missing closing '>'

Fíjate en el nombre: 192.0.2.10.bak.20260709. DirectAdmin está intentando escuchar en una «IP» que en realidad es el nombre de un fichero de backup.

Si el monitor de servicios de DirectAdmin está activo, reintentará arrancarlos periódicamente y enviará un aviso por cada intento fallido. Eso llega al buzón como «nginx se cae cada hora» y hace pensar en una intermitencia — pero no es intermitente: es una caída continua. Cada correo es un reintento, no una caída nueva.

El mecanismo

DirectAdmin enumera el directorio /usr/local/directadmin/data/admin/ips/ tratando CADA NOMBRE DE FICHERO como una entidad IP. No lee un índice ni valida el formato: lo que hay en ese directorio es la lista de IPs del servidor.

Si dejas ahí un backup:

# /usr/local/directadmin/data/admin/ips/

192.0.2.10                  ← la IP legítima (diradmin:diradmin)

192.0.2.10.bak.20260709     ← un backup: DirectAdmin lo lee como OTRA IP

…al generar las configuraciones de nivel servidor concatena ambos «nombres de IP» en el token de la plantilla y produce esto:

   server {
        listen       192.0.2.10.bak.20260709

192.0.2.10:80;

        server_name  hostname.ejemplo.com 192.0.2.10.bak.20260709

192.0.2.10;

                proxy_pass http://192.0.2.10.bak.20260709

192.0.2.10:8080;

y en Apache un <VirtualHost> partido en dos líneas — de ahí el «missing closing >».

Por qué es traicionero: el daño es LATENTE

Este es el punto importante.

data/admin/ips/ solo se lee cuando se regeneran las configuraciones de nivel servidor. Mientras nadie las regenere, el fichero de más convive ahí sin causar ningún daño: días o semanas.

La avería aparece cuando algo dispara esa regeneración:

Consecuencia práctica: quien detona la mina no es quien la puso. El cuadro típico es «hice un mantenimiento rutinario y el servidor se quedó sin web» — y la conclusión fácil («lo rompió la actualización») es falsa: la actualización solo reveló un fichero que llevaba semanas ahí. Si te pasa, no cierres culpando al mantenimiento: mira el directorio.

Detección: cuesta un ls

Cualquier nombre en ese directorio que no sea una IPv4 o IPv6 válida es una mina armada:

ls -1 /usr/local/directadmin/data/admin/ips/ 2>/dev/null \

  | grep -vE '^([0-9]{1,3}\.){3}[0-9]{1,3}$|^[0-9a-fA-F:]+$'

Merece la pena incorporarlo al pre-flight de cualquier mantenimiento de paquetes o del panel, porque es precisamente ese mantenimiento el que la detona. Detectarla después es llegar tarde.

Solución

# 1. Retirar el fichero FUERA del árbol de datos (mover, no borrar)
mkdir -p /root/da-stray-backups
mv /usr/local/directadmin/data/admin/ips/192.0.2.10.bak.20260709 /root/da-stray-backups/

# 2. Regenerar las confs de NIVEL SERVIDOR
cd /usr/local/directadmin/custombuild && ./build rewrite_confs

# 3. Verificar sintaxis y arrancar
nginx -t && httpd -t
systemctl start httpd nginx

Antes de retirarlo, comprueba que el backup no contiene nada que necesites: lo habitual es que solo difiera en value= (el contador de uso que DirectAdmin recalcula solo en el tally nocturno), es decir, que sea basura sin valor.

Trampa: rewrite_confs no es lo mismo que la task queue

Este paso se falla a menudo:

Y no pierdas el tiempo editando nginx-vhosts.conf a mano: es autogenerado. Mientras la causa siga en la capa de datos, DirectAdmin lo reescribirá igual de roto en la siguiente pasada.

Dónde SÍ y dónde NO

No todo backup dentro del árbol de DirectAdmin es una bomba. Solo data/admin/ips/ tiene la semántica «un fichero = una entidad»:

Directorio Cómo lo lee DirectAdmin Un .bak ahí es…
data/admin/ips/ enumera por nombre de fichero una bomba — IP fantasma
conf/ por nombre exacto (directadmin.conf) inerte (basura)
data/admin/ por nombre exacto (cluster.conf…) inerte (basura)
data/users/<user>/ por nombre exacto (user.conf…) inerte (basura)

Dicho de otro modo: un backup en conf/ es desorden; un backup en data/admin/ips/ deja el servidor sin web.

La regla

Un backup NUNCA va dentro del árbol de datos del panel. Va fuera: /root/, /var/backups/, donde quieras — pero fuera.

Es tentador hacer cp fichero fichero.bak en el propio directorio antes de editar algo: es el reflejo de toda la vida y en el 99% de los sitios es inofensivo. En data/admin/ips/ te cuesta la web del servidor entero, y te la cuesta semanas después, cuando ya nadie relaciona una cosa con la otra.

# MAL — el backup se convierte en una IP fantasma
cp /usr/local/directadmin/data/admin/ips/192.0.2.10{,.bak}

# BIEN — el backup vive fuera del árbol
cp /usr/local/directadmin/data/admin/ips/192.0.2.10 /root/192.0.2.10.bak


Revision #1
Created 2026-07-17 14:52:47 UTC by Abkrim
Updated 2026-07-17 14:52:47 UTC by Abkrim