6.0 KiB
🚀 Configuración SSE para HestiaCP
✅ Pasos para Activar SSE en tu Servidor HestiaCP
1. Verificar que el código esté en el servidor
# Subir por FTP/SFTP o Git
cd /home/tu-usuario/web/tu-dominio.com/public_html/
ls -la api/sse_events.php # Debe existir
2. Configurar Apache para SSE (si usas Apache)
Opción A: Editar .htaccess en la raíz
# Agregar al final de .htaccess
<IfModule mod_headers.c>
# SSE Headers
<FilesMatch "sse_events\.php$">
Header set Cache-Control "no-cache, no-store, must-revalidate"
Header set X-Accel-Buffering "no"
SetEnv no-gzip 1
</FilesMatch>
</IfModule>
Opción B: Crear .htaccess específico en /api/
cd /home/tu-usuario/web/tu-dominio.com/public_html/api/
nano .htaccess
Contenido:
<IfModule mod_headers.c>
Header set Cache-Control "no-cache, no-store, must-revalidate"
Header set X-Accel-Buffering "no"
SetEnv no-gzip 1
</IfModule>
# Prevenir timeout en SSE
<IfModule mod_fcgid.c>
FcgidIOTimeout 300
</IfModule>
3. Ajustar PHP-FPM (Recomendado)
Editar configuración PHP-FPM en HestiaCP:
- Panel HestiaCP → Web → tu dominio → Edit
- Backend Template: PHP-FPM
- PHP Version: 8.x
Luego editar el archivo de configuración (vía SSH):
# Ubicación típica en HestiaCP
sudo nano /etc/php/8.2/fpm/pool.d/tu-usuario.conf
# Agregar o modificar:
request_terminate_timeout = 300s
pm.max_requests = 500
Reiniciar PHP-FPM:
sudo systemctl restart php8.2-fpm
4. Verificar Nginx (si usas Nginx)
Si tu dominio usa Nginx como proxy, editar la configuración:
sudo nano /etc/nginx/conf.d/domains/tu-dominio.com.conf
Agregar dentro del bloque location ~ \.php$:
# Configuración especial para SSE
location ~ ^/api/sse_events\.php$ {
fastcgi_buffering off;
proxy_buffering off;
fastcgi_read_timeout 300s;
fastcgi_send_timeout 300s;
fastcgi_pass unix:/run/php/php8.2-fpm.sock;
include fastcgi_params;
}
Reiniciar Nginx:
sudo systemctl restart nginx
5. Probar SSE desde el servidor
# Conectar por SSH a tu servidor
ssh usuario@tu-dominio.com
# Probar SSE
curl -N -m 5 'https://tu-dominio.com/api/sse_events.php?token=demo_token'
Respuesta esperada:
event: connected
data: {"timestamp":1706300000,"user_id":"token_12345678","mode":"authenticated","status":"ready"}
: heartbeat
Si ves esto, SSE está funcionando ✅
6. Probar desde el navegador
- Abrir tu sitio:
https://tu-dominio.com/conversations.php - Abrir Consola del navegador (F12 → Console)
- Buscar:
Conectando a SSE para eventos en tiempo real... SSE URL: https://tu-dominio.com/api/sse_events.php?token=... ✅ SSE conectado (🔐 autenticado): {...}
7. Solución de Problemas
Error: "Failed to fetch" o timeout
Causa: Firewall o mod_security bloqueando Solución:
# Desactivar mod_security para SSE (temporal)
sudo a2dismod security2
sudo systemctl restart apache2
# O agregar excepción en .htaccess:
<IfModule mod_security2.c>
SecRuleEngine Off
</IfModule>
Error: "EventSource's response has a MIME type"
Causa: Headers incorrectos Solución: Verificar que sse_events.php tenga:
header('Content-Type: text/event-stream');
Error: Conexión se cierra cada 30 segundos
Causa: Timeout de proxy Solución: Aumentar timeouts en nginx.conf o apache2.conf:
# Apache
Timeout 300
KeepAliveTimeout 300
# Nginx
proxy_read_timeout 300s;
8. Configuración de Seguridad (Producción)
A. Token seguro en vez de demo_token
Editar api/sse_events.php:
// Generar token en login
$_SESSION['sse_token'] = bin2hex(random_bytes(32));
// Validar token en SSE
$token = $_GET['token'] ?? null;
if ($token && isset($_SESSION['sse_token']) && $token === $_SESSION['sse_token']) {
$authenticated = true;
}
En conversations.php:
// Usar token de sesión
const token = '<?php echo $_SESSION['sse_token'] ?? 'demo_token'; ?>';
const sseUrl = `${baseUrl}/api/sse_events.php?token=${token}&t=${Date.now()}`;
B. Restringir acceso por IP (opcional)
En .htaccess:
<FilesMatch "sse_events\.php$">
# Solo permitir desde localhost o IPs específicas
Require ip 127.0.0.1
Require ip tu.ip.publica
</FilesMatch>
9. Monitoreo
Ver conexiones SSE activas:
# Ver procesos PHP activos
ps aux | grep sse_events
# Ver logs de errores
tail -f /var/log/php8.2-fpm.log
tail -f /var/log/apache2/error.log
tail -f /var/log/nginx/error.log
10. Performance
Para muchos usuarios simultáneos:
# Aumentar límites PHP-FPM
sudo nano /etc/php/8.2/fpm/pool.d/tu-usuario.conf
pm = dynamic
pm.max_children = 50
pm.start_servers = 10
pm.min_spare_servers = 5
pm.max_spare_servers = 20
pm.max_requests = 500
🎯 Checklist de Verificación
- Archivo
api/sse_events.phpsubido al servidor .htaccessconfigurado con headers SSE- PHP-FPM timeout aumentado a 300s
- Nginx/Apache configurado (si aplica)
- Test con curl funciona (muestra "event: connected")
- Test desde navegador funciona (console.log muestra "✅ SSE conectado")
- Token de seguridad configurado (no usar demo_token en producción)
- Firewall/mod_security permite conexiones largas
📞 Soporte HestiaCP
Si tienes problemas:
- Panel HestiaCP: https://tu-dominio.com:8083
- Logs: Panel → Log Files
- SSH: Usuario y contraseña en el panel
- Documentación: https://docs.hestiacp.com/
✅ Resultado Esperado
Una vez configurado correctamente:
ANTES (desarrollo local):
http://localhost:8000/api/sse_events.php
❌ Timeout (servidor PHP built-in no soporta SSE)
AHORA (producción HestiaCP):
https://tu-dominio.com/api/sse_events.php
✅ Conectado - eventos en tiempo real < 1 segundo
¡Tu sistema de notificaciones en tiempo real estará funcionando! 🚀