Ho un sacco di domande riguardo a SSL, sessioni locali e bilanciamento del carico che sembrano essere interconnessi, quindi mi scuso in anticipo per la lunghezza di questa domanda.
Ho un sito Web che utilizza sessioni basate su file. La natura del sito è che la maggior parte è http, ma alcune sezioni sono ssl. Attualmente, a causa delle sessioni basate su file, è necessario che qualsiasi richiesta ssl raggiunga lo stesso server delle precedenti richieste http.
A causa dei limiti di tempo, voglio fare la cosa più semplice possibile per bilanciare il carico di traffico http e ssl aumentato.
Sembra che ci siano 2 opzioni per gli algoritmi di bilanciamento del carico appiccicoso:
- basato su ip
- basato sui cookie
La soluzione basata su ip probabilmente funzionerà, ma l'algoritmo di hashing cambierà potenzialmente il server a cui un utente va quando un server si arresta o viene aggiunto, il che è indesiderabile con l'attuale configurazione della sessione basata su file. Suppongo anche che sia tecnicamente possibile per un utente cambiare legittimamente ips durante la navigazione di un sito Web.
L'algoritmo basato sui cookie sembra migliore, ma l'incapacità di ispezionare i cookie quando crittografati da ssl sembra presentare i propri problemi.
Ho cercato su Google esempi su come caricare il bilanciamento del carico SSL e non riesco a trovare alcun esempio esplicito di configurazioni in grado di eseguire il bilanciamento del carico basato sui cookie E che può gestire un aumento del carico SSL aggiungendo un altro decodificatore SSL.
La maggior parte degli esempi espliciti che ho visto hanno il decoder ssl (di solito hardware, apache_mod_ssl o nginx) che si trova tra il client browser e il bilanciamento del carico. Gli esempi di solito sembrano avere qualcosa del genere (modificato da http://haproxy.1wt.eu/download/1.3/doc/architecture.txt ):
192.168.1.1 192.168.1.11-192.168.1.14 ------- + ----------- + ----- + ----- + ----- + | | | | | + - + - + + - + - + + - + - + + - + - + + - + - + | LB1 | | A | | B | | C | | D | + ----- + + --- + + --- + + --- + + --- + apache 4 server web economici mod_ssl HAProxy
La parte di decodifica ssl nell'esempio sopra sembra essere un potenziale collo di bottiglia che non è scalabile orizzontalmente.
Ho guardato haproxy, e sembra avere un'opzione 'mode tcp' che consentirebbe qualcosa del genere, che ti permetterebbe di avere più decodificatori ssl:
HAProxy | ------------- | | ssl-decoder-1 ssl-decoder2 | | ------------------- | | | web1 web2 web3
Tuttavia, in una tale configurazione, sembra che perderai l'ip del client perché haproxy non sta decodificando l'sl: https://cloud-support.engineyard.com/discussions/problems/335-haproxy-not-passing-x-forwarded -per
Ho anche esaminato nginx e non vedo esempi espliciti di decodificatori ssl scalabili orizzontalmente. Sembrano esserci molti esempi di persone che hanno nginx come potenziale collo di bottiglia. E almeno questo collegamento sembra suggerire che nginx non ha nemmeno l'opzione di installazione simile a quella di un alproxy in cui si perderebbe l'ip dicendo che nginx "non supporta il passaggio trasparente delle connessioni TCP a un backend" Come passare Apache Traffico SSL tramite proxy nginx? .
Domande:
- Perché non sembrano esserci più esempi di configurazioni che aggiungono più decoder ssl per gestire l'aumento del traffico?
- È perché la fase di decodifica ssl è solo un collo di bottiglia teorico e, praticamente parlando, un decodificatore sarà essenzialmente sufficiente tranne che per i siti con traffico ridicolo?
- Un'altra possibile soluzione che viene in mente è forse che chiunque abbia esigenze così elevate in ssl ha anche un archivio di sessioni centralizzato, quindi non importa quale server web colpisce il client su richieste sequenziali. Quindi è possibile abilitare mod_ssl o equivalente su ogni server web.
- La soluzione haproxy citata sopra sembra funzionare (oltre al problema dell'IP client), ma qualcuno ha trovato una soluzione appiccicosa di bilanciamento del carico basata su cookie che funzionerebbe aumentando il numero di decodificatori mantenendo l'IP client, o forse tecnicamente no possibile (poiché è necessario decodificare la richiesta per ottenere l'IP client, nel qual caso è presente un collo di bottiglia del decodificatore).
Supponendo che tutto ciò che ho detto sia vero, queste sembrano essere le mie opzioni:
- usa l'hash dell'ip (male per gli utenti che potenzialmente cambiano legittimamente ips e per gli scenari di aggiunta e rilascio del server)
- usa nginx o mod_ssl come primo programma toccando la richiesta ssl, questo sarà un potenziale collo di bottiglia di decodifica ssl
- usa haproxy come primo programma toccando la richiesta ssl, ottenendo la scalabilità orizzontale ssl, ma live senza ips registrati a livello di server web per richieste ssl (probabilmente temporaneamente ok)
- a lungo termine, passare a un archivio di sessioni mobile o centralizzato, rendendo superflue le sessioni appiccicose