oscarmlage oscarmlage

Apache + Squid + Nginx

Written by oscarmlage on

¡Menuda combinación!. A decir verdad empecé jugando un poco con el maldito slowloris y al final acabé montando este batiburrillo de servidores, primero para paliar el efecto del dichoso gusano y segundo para preparar el servidor para la inminente nueva versión del blog - que me gustaría estrenar con el décimo aniversario de este humilde rinconcito -.

En un esquema inicial analógico de esos que tantos nos gustan podemos ver la pirula (pido perdón de antemano por la calidad de la foto):

Probablemente no sea necesario tener 3 servidores para este entorno, seguro que puedo poner a escuchar Nginx en el puerto 80 y redirigir todo el tráfico dinámico al 81 a la vez que responde al tráfico estático de ciertos subdominios (static*) de forma automática y en la misma instancia. Pero tenía la tarde libre y me apetecía probar una configuración rara con Squid.

Apache

La configuración de Apache es de lo más sencilla, lo único que he hecho ha sido ponerlo a escuchar en el puerto 81 por defecto, y a todos sus Virtualhosts también. No había mucho más que tocar puesto que ya tenía el mod_php y todas las dependencias instaladas.

Nginx

Nunca había jugado con él y a primera vista me gustó la sencillez de sus archivos de configuración. Tampoco tenía que hacer gran cosa, ponerlo a escuchar en el puerto 82 y poco más puesto que sólo serviría contenido estático. Creé los Virtualhosts que atenderían las peticiones estáticas, los activé vía enlace simbólico a sites-enabled y poco más. La configuración de un Virtualhost cualquiera:

server {
        listen   82;
        server_name  static.dominio.com;
        root /home/www/dominio/sd/static/;
        autoindex on;
}

Squid

Aquí vino la diversión, ¿cómo decirle a Squid que balanceara el tráfico dinámico al puerto 81 y el estático al puerto 82?. Después de leer la documentación y hacer varias pruebas con cache_peer,  y cache_peer_domain he llegado a la conclusión que la configuración "buena" es la siguiente:

cache_peer ip parent 81 0 no-query originserver name=server_1
cache_peer_domain server_1 dominio.com www.dominio.com
cache_peer ip parent 82 0 no-query originserver name=server_2
cache_peer_domain server_2 static.dominio.com

Como se puede ver, habría que cambiar ip por la ip pública correspondiente y los fqdn por los reales.

Conclusión

He pasado una tarde agradable en compañía de mis amigos los servidores web. No, en serio, al final he conseguido reproducir el escenario que me había propuesto, (aún sabiendo que se podría mejorar), he frenado los sockets incompletos de Apache y he preparado el servidor para servir estáticos de forma independiente del contenido dinámico (que en breve cambiará de PHP a Python + Django).

No ha estado mal :).