Tengo un montón de preguntas con respecto a SSL, sesiones locales y equilibrio de carga que parecen estar interconectadas, por lo que me disculpo de antemano por la extensión de esta pregunta.
Tengo un sitio web que utiliza sesiones basadas en archivos. La naturaleza del sitio es que la mayor parte es http, pero algunas secciones son ssl. Actualmente, debido a las sesiones basadas en archivos, es necesario que cualquier solicitud de SSL llegue al mismo servidor que cualquier solicitud http anterior.
Debido a limitaciones de tiempo, quiero hacer lo más fácil posible para equilibrar la carga y aumentar el tráfico http y ssl.
Parece que hay 2 opciones para algoritmos de equilibrio de carga fijos:
- basado en ip
- basado en cookies
La solución basada en IP probablemente funcionará, pero el algoritmo de hash cambiará potencialmente el servidor al que va un usuario cuando un servidor deja de funcionar o se agrega, lo que no es deseable con la configuración actual de la sesión basada en archivos. También supongo que es técnicamente posible que un usuario cambie legítimamente ips mientras navega por un sitio web.
El algoritmo basado en cookies parece mejor, pero la incapacidad de inspeccionar la cookie cuando está encriptada por SSL aparentemente presenta sus propios problemas.
He buscado en Google ejemplos sobre cómo cargar el equilibrio de carga SSL, y parece que no puedo encontrar ejemplos explícitos de configuraciones que puedan hacer un equilibrio de carga basado en cookies Y que puedan lidiar con un aumento de la carga SSL agregando otro decodificador SSL.
La mayoría de los ejemplos explícitos que he visto tienen el decodificador ssl (generalmente hardware, apache_mod_ssl o nginx) ubicado entre el cliente del navegador y el equilibrador de carga. Los ejemplos generalmente parecen tener algo como esto (modificado de http://haproxy.1wt.eu/download/1.3/doc/architecture.txt ):
192.168.1.1 192.168.1.11-192.168.1.14 ------- + ----------- + ----- + ----- + ----- + El | El | El | El | El | + - + - + + - + - + + - + - + + - + - + + - + - + El | LB1 | El | A | El | B | El | C | El | D | + ----- + + --- + + --- + + --- + + --- + Apache 4 servidores web baratos mod_ssl haproxy
La parte de decodificación de SSL en el ejemplo anterior parece ser un posible cuello de botella que no es escalable horizontalmente.
He examinado haproxy, y parece tener una opción 'mode tcp' que permitiría algo como esto, que le permitiría tener múltiples decodificadores ssl:
haproxy El | ------------- El | El | ssl-decoder-1 ssl-decoder2 El | El | ------------------- El | El | El | web1 web2 web3
Sin embargo, en tal configuración, parece que perdería la IP del cliente porque haproxy no está decodificando el ssl: https://cloud-support.engineyard.com/discussions/problems/335-haproxy-not-passing-x-forward -para
También he examinado nginx, y tampoco veo ningún ejemplo explícito de decodificadores ssl escalables horizontalmente. Parece que hay muchos ejemplos de personas que tienen nginx como un posible cuello de botella. Y al menos este enlace parece sugerir que nginx ni siquiera tiene la opción de una configuración similar a un haproxy en la que se pierde la ip al decir que nginx "no admite el paso transparente de conexiones TCP a un servidor" Cómo pasar Apache Tráfico SSL a través del proxy nginx? .
Preguntas:
- ¿Por qué no parece haber más ejemplos de configuraciones que agreguen más decodificadores SSL para lidiar con el aumento del tráfico?
- ¿Es porque el paso de decodificación ssl es solo un cuello de botella teórico, y prácticamente hablando, un decodificador será esencialmente suficiente, excepto para sitios con tráfico ridículo?
- Otra posible solución que viene a la mente es que cualquiera con necesidades de SSL tan elevadas también tiene un almacén de sesiones centralizado, por lo que no importa a qué servidor web acceda el cliente en solicitudes secuenciales. Entonces podría habilitar mod_ssl o equivalente en cada servidor web.
- La solución de haproxy citada anteriormente parece funcionar (además del problema de IP del cliente), pero alguien ha encontrado una solución equilibradora de carga de software basada en cookies que funcionaría al aumentar el número de decodificadores mientras se mantiene la IP del cliente, o es que técnicamente no posible (porque tiene que decodificar la solicitud para obtener la IP del cliente, en cuyo caso, tenemos un cuello de botella de decodificador).
Suponiendo que todo lo que he dicho es cierto, estas parecen ser mis opciones:
- use el hash de ip (malo para los usuarios que potencialmente cambian legítimamente ips, y para escenarios de agregar y quitar servidores)
- use nginx o mod_ssl como el primer programa que toca la solicitud de SSL, esto será un posible cuello de botella de decodificación de SSL
- use haproxy como el primer programa que toca la solicitud de SSL, ganando escalabilidad horizontal de SSL, pero vive sin ips registrados en el nivel del servidor web para solicitudes de SSL (probablemente temporalmente aceptable)
- a largo plazo, avance hacia una tienda de sesiones móvil o centralizada, haciendo innecesarias las sesiones adhesivas