¿Cansado de hacer malabares entre el portal de administración de SharePoint, un sinfín de pestañas…
“Connection Refused” a HTTPS estable
¿Alguna vez te ha tocado enfrentarte a un misterioso «Connection Refused» al intentar acceder a una app por HTTPS y te has quedado con cara de no entender nada? A mí me pasó con subdominio.midominio.com
. Lo que empezó como un simple error de conexión, se convirtió en una aventura para optimizar y dejar el proyecto en un estado mucho mejor. Aquí te cuento cómo lo solucioné, desde el diagnóstico inicial hasta la automatización de procesos y la internacionalización.
—
Diagnóstico: Descifrando el misterio del «Connection Refused»
Para resolver el problema, me puse mi sombrero de detective y seguí una serie de pasos para encontrar la raíz del fallo.
- ¿Quién sirve las DNS? Lo primero fue preguntar: ¿hacia dónde apunta esta URL? Utilicé
dig subdominio.midominio.com
ynslookup
, y descubrí que la dirección apuntaba a la IP del servidor de backend. El problema estaba claro: este servidor no tenía un listener SSL. - Siguiendo el rastro de la petición: El camino ideal de la petición debía ser Cliente → DNS interno → nginx-proxy (donde está el SSL), pero en realidad, la petición estaba yendo directamente a backend-server por el puerto 80. Aquí, el error DNS era evidente.
- Revisando el servidor SSL: Como buen dev, la siguiente parada fue comprobar la configuración del proxy. En nginx-proxy revisé la sección
listen 443 ssl;
y la validez de los certificados. Para mi sorpresa, todo parecía estar en orden. - Firewall y servicios: El siguiente paso lógico era el firewall. Verifiqué que el puerto 443 no estuviese bloqueado. También confirmé que mi backend-server solo escuchaba tráfico HTTP (puertos 80 y 8080).
- ¡Bingo! El error era la DNS: Una vez que tenía todas las piezas, corregí el registro interno para que
subdominio.midominio.com
apuntase a la IP de nginx-proxy. - Verificación final: Con la DNS corregida, hice una última prueba con
curl -I https://subdominio.midominio.com
. El resultado fueHTTP/2 200
y302
. ¡El error había desaparecido!
El desvío de DNS estaba causando todo el problema. Pero en vez de dejarlo ahí, decidí que era una excelente oportunidad para mejorar el proyecto.
—
Transformando el proyecto: Del caos a la estructura
Con el error inicial resuelto, aproveché para darle al proyecto la estructura que merecía. Aquí te cuento los cambios que implementé:
1. Control de versiones con GitLab
- Creé un repositorio privado en GitLab para el proyecto.
- Le di acceso a mis compañeros, lo que facilita el trabajo en equipo y el control de versiones.
2. Saneando Composer y las dependencias
- Limpié los conflictos en
composer.json
para Symfony 2.8. - Me aseguré de que las versiones de las dependencias fueran compatibles en todos los entornos (DEV, TEST y PROD).
3. Ajustes en Doctrine ORM
- Encontré y corregí un error de
continue
que causaba problemas en PHP moderno. - Ahora la caché se limpia sin fallos.
4. Gestión de caché y permisos
- Eliminé los directorios de caché antiguos en
app/cache
. - Revisé y ajusté los permisos (
apache:apache
).
5. Creación de un script de limpieza automática
Para evitar problemas futuros, creé un script para limpiar la caché de forma automática. Es un pequeño detalle que ahorra mucho tiempo y dolores de cabeza.
#!/bin/bash
# scripts/clear_cache.sh
rm -rf app/cache/{dev,prod}
mkdir -p app/cache/{dev,prod}
chown -R apache:apache app/cache
php bin/console cache:clear --env=prod
php bin/console cache:clear --env=dev
systemctl reload httpd
6. Internacionalización (i18n): La app habla idiomas
Para que la aplicación pueda crecer sin límites, la hice multilingüe:
- Generé archivos
messages.es.yml
ymessages.fr.yml
. - Reemplacé los textos fijos por la sintaxis de traducción
{{ 'clave'|trans }}
. - Traduje las partes principales de la aplicación: login, panel de admin, gestión de usuarios, etc.
—
El resultado final: Un proyecto a prueba de balas
Lo que empezó con un error, terminó con un proyecto mucho más robusto:
- El **HTTPS** funciona perfectamente.
- El proyecto está **versionado y listo** para colaborar.
- La **caché** está estable y los procesos automatizados.
- La app es **multilenguaje** y está preparada para crecer.
¿Te ha pasado algo parecido? A veces, los errores más tontos son los que nos enseñan las lecciones más valiosas. ¡Cuéntame tu historia en los comentarios!