Ir al contenido principal

Moodle con varias plataformas en la misma cuenta cPanel: error 503 intermitente por saturación del pool PHP-LSAPI

Escrito por Javier Galeote

Síntomas característicos

  • Algunas plataformas Moodle del servidor dejan de cargar de forma intermitente con error 503 Service Unavailable.

  • Otras plataformas alojadas en el mismo servidor siguen funcionando con normalidad.

  • La caída aparece y desaparece sin un patrón claro para el cliente; muchas veces el servicio se restablece al reiniciar Apache/LiteSpeed/MySQL.

  • Tras un reinicio, todo vuelve a la normalidad pero el problema reaparece minutos u horas después.

  • El cliente convive con esto repitiendo varias caídas al día.

Por qué ocurre

Cuando una sola cuenta cPanel concentra varias plataformas Moodle en subdominios (por ejemplo plataforma1.tudominio.com, plataforma2.tudominio.com, etc.), todas comparten el mismo pool de procesos PHP-LSAPI.

El servidor LiteSpeed define cuántos hijos puede arrancar PHP en paralelo para esa cuenta a través del parámetro PHP_LSAPI_CHILDREN. Si ese pool se queda corto frente a la carga real, LiteSpeed empieza a rechazar peticiones con 503 y en el error_log del servidor aparecen entradas como:

connection to [uds://tmp/lshttpd/lsphpXX.sock...] ... Resource temporarily unavailable

Las causas típicas de saturación del pool en este escenario son:

  • Decenas de tareas cron de Moodle programadas todas a los 00 segundos de cada minuto, que arrancan a la vez muchos procesos php-cgi.

  • Tráfico SCORM y descargas vía pluginfile.php que mantienen conexiones largas y pesadas.

  • Subidas de archivos grandes, copias de seguridad de Moodle o reportes que se ejecutan a la vez.

  • Cron jobs personalizados mal configurados que reinician servicios del sistema con más frecuencia de la prevista.

Por qué solo se cae una parte de las plataformas

El pool PHP-LSAPI se aplica a la cuenta cPanel, no al servidor entero. Por eso las plataformas Moodle alojadas en otras cuentas del mismo servidor siguen respondiendo sin problemas: solo la cuenta que concentra muchas instalaciones agota su pool.

De ahí que el cliente vea caídas "selectivas" en sus propias plataformas y le resulte difícil de diagnosticar.

Cómo lo diagnostica soporte

Cuando un ticket reporta este patrón, el equipo técnico revisa:

  1. Los logs /usr/local/apache/logs/error_log buscando las líneas Resource temporarily unavailable apuntando al socket lsphpXX.sock.

  2. Los domlogs de los subdominios afectados para confirmar los 503 reales en URLs típicas (SCORM, pluginfile.php, login/index.php, etc.).

  3. Los cron jobs de la cuenta en /var/spool/cron/<cuenta> para detectar tareas Moodle ejecutándose en paralelo.

  4. El valor de PHP_LSAPI_CHILDREN en la configuración de LiteSpeed para la versión de PHP que usa la cuenta.

  5. Cron jobs anómalos del sistema (por ejemplo, reinicios programados de Apache que no respondan a lo esperado).

Acciones que aplica soporte

  • Ampliar el valor de PHP_LSAPI_CHILDREN para esa versión de PHP (en casos reales se ha pasado de 35 a 100) para que la cuenta pueda servir más peticiones PHP en paralelo.

  • Eliminar o reescribir cron jobs problemáticos. Un ejemplo real detectado: * */6 * * * systemctl restart httpd.service. Esa línea no reinicia "cada 6 horas", sino que reinicia Apache cada minuto durante las horas 00, 06, 12 y 18, generando interrupciones constantes.

  • Reiniciar LiteSpeed/Apache y MySQL una vez aplicados los cambios para liberar procesos colgados.

Qué puede hacer el cliente para reducir la saturación

  1. Distribuir los cron de Moodle: evitar tener todas las plataformas con el cron a los 0 * * * * (cada minuto al segundo 0). Programar minutos distintos según la plataforma reduce el pico simultáneo.

  2. Si una plataforma tiene picos previsibles (lanzamientos de cursos, exámenes con SCORM, etc.), planificarlo con soporte para escalar recursos temporalmente.

  3. Revisar cron jobs propios añadidos directamente al servidor o vía cPanel y eliminar los que no estén justificados.

  4. Cuando una sola cuenta cPanel concentra muchas instalaciones grandes de Moodle, valorar separarlas en cuentas distintas o pasar a un servidor cloud dedicado a Moodle, donde el pool y los recursos se ajustan a esa carga.

Diferencias con otros patrones de 503

  • No es lo mismo que un 503 por bots agresivos haciendo scraping (eso se ataca con reglas .htaccess y robots.txt).

  • No es lo mismo que un 503 por kernel connection limit (límite de conexiones por cliente del propio kernel).

  • No es lo mismo que un 503 por fallo del CageFS de CloudLinux (que afecta a una cuenta entera, incluido el Terminal de cPanel).

  • No es lo mismo que un 503 generalizado por actualizaciones críticas de cPanel/WHM que reinician todos los servicios.

La señal distintiva de este caso es: varias plataformas Moodle en la misma cuenta, cron simultáneos, error en el socket lsphpXX.sock y caídas que afectan solo a esa cuenta.

¿Ha quedado contestada tu pregunta?