Ordinazione: 1. nginx 2. vernice 3. haproxy 4. webserver?


50

Ho visto la gente raccomandare di combinare tutti questi in un flusso, ma sembrano avere molte funzioni sovrapposte, quindi mi piacerebbe approfondire il motivo per cui potresti voler passare attraverso 3 diversi programmi prima di colpire il tuo vero server web.

nginx:

  • ssl: si
  • comprimere: si
  • cache: si
  • pool back-end: sì

vernice:

  • ssl: no (stunnel?)
  • comprimere:?
  • cache: sì (funzione principale)
  • pool back-end: sì

HAProxy:

  • ssl: no (stunnel)
  • comprimere:?
  • cache: no
  • pool back-end: sì (funzionalità principale)

L'intenzione di concatenare tutti questi di fronte ai server Web principali è solo per ottenere alcuni dei loro vantaggi principali?

Sembra abbastanza fragile avere così tanti demoni che scorrono insieme facendo cose simili.

Qual è la tua preferenza di distribuzione e ordinazione e perché?


1
Varnish ora ha il supporto SSL: vedi blog.exceliance.fr/2012/09/10/…
MiniQuark

4
dici di dire HAProxy?
Luis Lobo Borobia,

Nginx sembra avere tutto, quindi direi solo usare nginx.
Seun Osewa,

Risposte:


60

In poche parole ...

HaProxy è il miglior bilanciamento del carico open source sul mercato.
Varnish è il miglior cacher di file statici open source sul mercato.
Nginx è il miglior server Web open source sul mercato.

(ovviamente questa è l'opinione mia e di molte altre persone)

Ma generalmente, non tutte le query passano attraverso l'intero stack.

Tutto passa attraverso haproxy e nginx / multiple nginx.
L'unica differenza è che si "bullona" sulla vernice per richieste statiche.

  • qualsiasi richiesta è bilanciata in termini di carico per ridondanza e throughput (buono, è ridondanza scalabile)
  • qualsiasi richiesta di file statici colpisce prima la cache di vernice (va bene, è veloce)
  • qualsiasi richiesta dinamica va direttamente al backend (ottimo, la vernice non viene utilizzata)

Nel complesso, questo modello si adatta a un'architettura scalabile e in crescita (elimina il proxy se non hai più server)

Spero che questo aiuti: D

Nota: in realtà introdurrò anche Pound per le query SSL: D
È possibile avere un server dedicato alla decrittografia delle richieste SSL e alla trasmissione di richieste standard allo stack back-end: D (Rende l'intero stack più veloce e più semplice)


1
Molto interessante, in particolare la parte relativa al server di decrittazione. +1
Gerry,

Risposta fantastica. Mi chiedo cosa si trovi di fronte a tutto? È HAProxy o Nginx?
Giovanni

2
@John: [Client -> HAProxy -> Vernice -> Nginx -> Contenuto statico] o [Client -> HAProxy -> Nginx (opzionale) -> Application Server (contenuto dinamico)]
MiniQuark

2
Perché dovresti cache statico e servire dinamico? Nginx è velocissimo per servire file statici. Preferisco usare uno stack come [ HAProxy-> Nginx] per statico e [ HAProxy-> Nginx-> Varnish-> Apache] per implementare una cache sulla dinamica. Terminare SSL al bilanciamento del carico come indicato con nodi di terminazione dedicati.
Steve Buzonas,

33

Prefazione

Aggiornamento nel 2016. Le cose si stanno evolvendo, tutti i server stanno migliorando, supportano tutti SSL e il Web è più sorprendente che mai.

Se non diversamente indicato, quanto segue è rivolto ai professionisti del settore e alle start-up, supportando da migliaia a milioni di utenti.

Questi strumenti e architetture richiedono molti utenti / hardware / denaro. Puoi provarlo in un laboratorio di casa o gestire un blog, ma non ha molto senso.

Come regola generale, ricorda che vuoi mantenerlo semplice . Ogni middleware aggiunto è un altro elemento fondamentale del middleware da mantenere. La perfezione non si ottiene quando non c'è nulla da aggiungere ma quando non c'è più niente da rimuovere.

Alcune implementazioni comuni e interessanti

HAProxy (bilanciamento) + nginx (applicazione php + memorizzazione nella cache)

Il server web è nginx con php in esecuzione. Quando nginx è già lì, potrebbe anche gestire la memorizzazione nella cache e i reindirizzamenti.

HAProxy ---> nginx-php
A       ---> nginx-php
P       ---> nginx-php
r       ---> nginx-php
o       ---> nginx-php
x       ---> nginx-php
y       ---> nginx-php

HAProxy (bilanciamento) + Varnish (memorizzazione nella cache) + Tomcat (applicazione Java)

HAProxy può reindirizzare a Varnish in base all'URI della richiesta (* .jpg * .css * .js).

HAProxy ---> tomcat
A       ---> tomcat
        ---> tomcat
P       ---> tomcat <----+
r       ---> tomcat <---+|
o                       ||
x       ---> varnish <--+|
y       ---> varnish <---+

HAProxy (bilanciamento) + nginx (SSL per l'host e la memorizzazione nella cache) + Webserver (applicazione)

I server web non parlano SSL anche se TUTTI DEVONO PARLARE SSL ( specialmente questo collegamento HAProxy-WebServer con le informazioni degli utenti privati ​​che passano attraverso EC2 ). L'aggiunta di un nginx locale consente di portare SSL nell'host. Una volta che nginx è lì, potrebbe anche fare un po 'di cache e riscrittura degli URL.

Nota : il reindirizzamento delle porte 443: 8080 sta avvenendo ma non fa parte delle funzionalità. Non ha senso eseguire il reindirizzamento delle porte. Il bilanciamento del carico potrebbe parlare direttamente al server web: 8080.

          (nginx + webserver on same host)
HAProxy ---> nginx:443 -> webserver:8080
A       ---> nginx:443 -> webserver:8080
P       ---> nginx:443 -> webserver:8080
r       ---> nginx:443 -> webserver:8080
o       ---> nginx:443 -> webserver:8080
x       ---> nginx:443 -> webserver:8080
y       ---> nginx:443 -> webserver:8080

middleware

HAProxy: il bilanciamento del carico

Caratteristiche principali :

  • Bilanciamento del carico (TCP, HTTP, HTTPS)
  • Algoritmi multipli (round robin, source ip, headers)
  • Persistenza della sessione
  • Terminazione SSL

Alternative simili : nginx (web server multiuso configurabile come bilanciamento del carico)
Diverse alternative : Cloud (Amazon ELB, Google load balancer), Hardware (F5, fortinet, citrix netscaler), Altro e in tutto il mondo (DNS, anycast, CloudFlare)

Cosa fa HAProxy e quando DEVI utilizzarlo?
Ogni volta che è necessario il bilanciamento del carico. HAProxy è la soluzione ideale.

Tranne quando si desidera molto economico o veloce e sporco O non si hanno le competenze disponibili, è possibile utilizzare un ELB: D

Tranne quando si è in banca / governo / simili che richiedono di utilizzare il proprio data center con requisiti rigidi (infrastruttura dedicata, failover affidabile, 2 livelli di firewall, elementi di controllo, SLA per pagare x% al minuto di downtime, tutto in uno) quindi è possibile inserire 2 F5 nella parte superiore del rack contenente i 30 server delle applicazioni.

Tranne quando si desidera superare 100k HTTP (S) [e siti multipli], è NECESSARIO disporre di multipli HAProxy con uno strato di bilanciamento del carico [globale] di fronte a loro (cloudflare, DNS, anycast). Teoricamente, il bilanciamento globale potrebbe parlare direttamente con i server web permettendo di abbandonare HAProxy. Di solito, tuttavia, DOVREBBE tenere HAProxy (s) come punti di accesso pubblici al tuo data center e ottimizzare le opzioni avanzate per bilanciare equamente tra host e ridurre al minimo la varianza.

Opinione personale : un progetto piccolo, contenuto e open source, interamente dedicato a UN VERO SCOPO. Tra la configurazione più semplice (UN file), il software open source più utile e più affidabile che ho incontrato nella mia vita.

Nginx: Apache che non fa schifo

Caratteristiche principali :

  • WebServer HTTP o HTTPS
  • Esegui applicazioni in CGI / PHP / alcuni altri
  • Reindirizzamento / riscrittura URL
  • Controllo di accesso
  • Manipolazione delle intestazioni HTTP
  • caching
  • Proxy inverso

Alternative simili : Apache, Lighttpd, Tomcat, Gunicorn ...

Apache era il web server di fatto, noto anche come un gigantesco clusterfuck di dozzine di moduli e migliaia di righe httpd.confsu un'architettura di elaborazione delle richieste interrotta. nginx rifa tutto questo, con meno moduli, una configurazione (leggermente) più semplice e una migliore architettura di base.

Cosa fa nginx e quando DEVI usarlo?
Un server web è progettato per eseguire applicazioni. Quando l'applicazione è sviluppata per essere eseguita su nginx, hai già nginx e puoi anche usare tutte le sue funzionalità.

Tranne quando l'applicazione non è progettata per essere eseguita su nginx e nginx non si trova da nessuna parte nello stack (Java shop qualcuno?), Allora c'è poco senso in nginx. È probabile che le funzionalità dei server web esistano nel tuo attuale server web e le altre attività siano meglio gestite dallo strumento dedicato appropriato (HAProxy / Varnish / CDN).

Tranne quando il tuo server web / applicazione manca di funzionalità, difficile da configurare e / o preferisci morire di lavoro piuttosto che guardarlo (Gunicorn qualcuno?), Allora puoi mettere un nginx in primo piano (cioè localmente su ciascun nodo) per eseguire l'URL riscrivere, inviare 301 reindirizzamenti, applicare il controllo degli accessi, fornire la crittografia SSL e modificare le intestazioni HTTP al volo. [Queste sono le funzionalità attese da un server web]

Vernice: il server di cache

Caratteristiche principali :

  • caching
  • Caching avanzato
  • Caching a grana fine
  • caching

Alternative simili : nginx (server web multiuso configurabile come server di cache)
Diverse alternative : CDN (Akamai, Amazon CloudFront, CloudFlare), Hardware (F5, Fortinet, Citrix Netscaler)

Cosa fa Varnish e quando DEVI usarlo?
Fa il caching, solo il caching. Di solito non vale la pena ed è una perdita di tempo. Prova invece CDN. Tieni presente che la memorizzazione nella cache è l'ultima cosa di cui dovresti preoccuparti quando gestisci un sito web.

Tranne quando si esegue un sito Web esclusivamente su immagini o video, è necessario esaminare attentamente la CDN e pensare seriamente alla memorizzazione nella cache.

Tranne quando sei costretto a usare il tuo hardware nel tuo data center (CDN non è un'opzione) e i tuoi server web sono terribili nel fornire file statici (l'aggiunta di più server web non aiuta), allora Varnish è l'ultima risorsa.

Tranne quando si dispone di un sito con contenuto generato per lo più statico ma complesso in modo dinamico (vedere i paragrafi seguenti), Varnish può risparmiare molta potenza di elaborazione sui server web.

La memorizzazione nella cache statica è sopravvalutata nel 2016

La memorizzazione nella cache è quasi senza configurazione, senza denaro e senza tempo. Abbonati a CloudFlare o CloudFront o Akamai o MaxCDN. Il tempo impiegato per scrivere questa riga è più lungo del tempo necessario per impostare la memorizzazione nella cache E la birra che sto tenendo in mano è più costosa dell'abbonamento mediano CloudFlare.

Tutti questi servizi sono pronti all'uso per static * .css * .js * .png e altro. In effetti, onorano principalmente la Cache-Controldirettiva nell'intestazione HTTP. Il primo passo della memorizzazione nella cache è configurare i server Web per l'invio delle direttive cache appropriate. Non importa quale CDN, cosa Varnish, quale browser sia nel mezzo.

Considerazioni sulle prestazioni

Varnish è stato creato in un momento in cui i server Web medi soffocavano per pubblicare un'immagine di gatto su un blog. Al giorno d'oggi una singola istanza del server web moderno asincrono e multi-thread, basato su parole d'ordine, può consegnare gattini in modo affidabile in un intero paese. Per gentile concessione di sendfile().

Ho eseguito alcuni rapidi test delle prestazioni per l'ultimo progetto a cui ho lavorato. Una singola istanza di Tomcat potrebbe servire da 21.000 a 33.000 file statici al secondo su HTTP (test di file da 20B a 12kB con un numero variabile di connessioni HTTP / client). Il traffico in uscita sostenuto è oltre 2,4 Gb / s. La produzione avrà solo interfacce da 1 Gb / s. Non posso fare di meglio dell'hardware, inutile nemmeno provare Varnish.

Caching Complex Modifica del contenuto dinamico

I server CDN e di memorizzazione nella cache di solito ignorano l'URL con parametri come ?article=1843, ignorano qualsiasi richiesta con cookie di sessione o utenti autenticati e ignorano la maggior parte dei tipi MIME incluso il application/jsonda /api/article/1843/info. Ci sono opzioni di configurazione disponibili ma di solito non sono a grana fine, piuttosto "tutto o niente".

Varnish può avere regole complesse personalizzate (vedi VCL) per definire cosa è desiderabile e cosa no. Queste regole possono memorizzare nella cache contenuto specifico per URI, intestazioni e cookie della sessione utente corrente e tipo e contenuto MIME TUTTI INSIEME. Ciò può risparmiare molta potenza di elaborazione sui server web per alcuni schemi di carico molto specifici. Questo è quando Varnish è utile e FANTASTICO.

Conclusione

Mi ci è voluto un po 'di tempo per capire tutti questi pezzi, quando usarli e come si incastrano. Spero che questo possa aiutarti.

Questo risulta essere piuttosto lungo (6 ore per scrivere. OMG!: O). Forse dovrei iniziare un blog o un libro a riguardo. Curiosità: non sembra esserci un limite alla lunghezza della risposta.


5
C'è un limite alla lunghezza della risposta, ma dovrai scrivere qualche altro libro per raggiungerla.
Michael Hampton

2
Un punto degno di nota per quanto riguarda la memorizzazione nella cache: è un modo efficace per migliorare le prestazioni di un sito quando non si ha il controllo dell'applicazione; in particolare se l'applicazione ha intestazioni cache davvero stupide (app aziendali qualcuno?). Tuttavia, devi essere molto più consapevole delle risorse autenticate.
Cameron Kerr,

@ user5994461 Mi piacerebbe leggere il tuo blog. Risposta incredibile!
oxalorg,

20

È vero che i 3 strumenti condividono funzionalità comuni. La maggior parte delle configurazioni va bene con qualsiasi combinazione di 2 tra i 3. Dipende dal loro scopo principale. È comune accettare di sacrificare un po 'di cache se sai che il tuo server delle applicazioni è veloce in statica (es: nginx). È comune sacrificare alcune funzionalità di bilanciamento del carico se si installano decine o centinaia di server e non si preoccupa di ottenere il massimo da essi né di problemi di risoluzione dei problemi. È comune sacrificare alcune funzionalità del server Web se si intende eseguire un'applicazione distribuita con molti componenti ovunque. Tuttavia, alcune persone costruiscono fattorie interessanti con tutte loro.

Dovresti tenere presente che stai parlando di 3 prodotti solidi. Generalmente non è necessario bilanciarli. Se hai bisogno di SSL frontale, allora nginx prima come proxy inverso va bene. Se non ti serve, allora la vernice sul davanti va bene. Quindi puoi inserire haproxy per bilanciare il carico delle tue app. A volte, ti consigliamo di passare anche a server farm diverse sul haproxy stesso, a seconda dei tipi di file o dei percorsi.

A volte dovrai proteggerti da attacchi DDoS pesanti e il haproxy di fronte sarà più adatto degli altri.

In generale, non dovresti preoccuparti di quale compromesso fare tra le tue scelte. Dovresti scegliere come assemblarli per ottenere la migliore flessibilità per le tue esigenze ora e in futuro. Anche se ne impili più volte, a volte può essere giusto a seconda delle tue esigenze.

Spero che questo aiuti!


1
+1 per HAProxy: l'autore risponde alle domande su Server Fault. Grazie.
Joel K,

Arenstar: Hai scritto uno di questi strumenti? Willy Tarreau è il principale sviluppatore di HAProxy.
Joel K,

Grazie per questo Willy. Hai risposto alla mia domanda ad Arenstar sopra.
Giovanni

2
Si noti che l'attuale codice di sviluppo per HAProxy ora include SSL.
Joel K,

14

Tutte le altre risposte sono precedenti al 2010, quindi aggiungendo un confronto aggiornato.

nginx

  • Un web server completo, altre funzionalità possono anche essere utilizzate. Ad esempio: compressione HTTP
  • Supporto SSL
  • Molto leggero in quanto Nginx è stato progettato per essere leggero sin dall'inizio.
  • Prestazioni di cache vicino alla vernice
  • Vicino alle prestazioni di bilanciamento del carico HAProxy

Vernice

  • ideale per scenari di memorizzazione nella cache complessi e integrazione con le applicazioni.
  • miglior file cacher statico
  • Nessun supporto SSL
  • Mangiatore di memoria e CPU

HAProxy

  • miglior bilanciamento del carico, per funzionalità di bilanciamento del carico all'avanguardia, paragonabile ai bilanciatori del carico hardware
  • SSL è supportato dalla 1.5.0
  • Più semplice, essendo solo un proxy tcp senza un'implementazione http, che lo rende più veloce e meno soggetto a bug.

Quindi il metodo migliore sembra implementarli tutti in un ordine appropriato.

Tuttavia, per scopi generali, Nginx è il migliore in quanto si ottengono prestazioni superiori alla media per tutti: memorizzazione nella cache, inversione di proxy, bilanciamento del carico , con un sovraccarico minimo sull'utilizzo delle risorse. E poi hai SSL e funzionalità complete per il web server.


6

Varnish ha il supporto per il bilanciamento del carico: http://www.varnish-cache.org/trac/wiki/LoadBalancing

Nginx supporta il bilanciamento del carico: http://wiki.nginx.org/NginxHttpUpstreamModule

Lo configurerei semplicemente con vernice + stunnel. Se avessi bisogno di nginx per qualche altro motivo, userei semplicemente nginx + vernice. Puoi fare in modo che nginx accetti le connessioni SSL e le proxy per la vernice, quindi fai parlare la vernice a nginx via http.

Alcune persone potrebbero gettare nginx (o Apache) nel mix perché si tratta di strumenti un po 'più generici di Varnish. Ad esempio, se si desidera trasformare il contenuto (ad es. Utilizzando XDV, filtri apache, ecc.) A livello proxy, è necessario uno di questi, poiché Varnish non può farlo da solo. Alcune persone potrebbero semplicemente avere più familiarità con la configurazione di questi strumenti, quindi è più facile usare Varnish come una cache semplice ed eseguire il bilanciamento del carico su un altro livello perché hanno già familiarità con Apache / nginx / haproxy come bilanciamento del carico.


A destra - "pool di back-end" doveva indicare che tutti e tre hanno caratteristiche di bilanciamento del carico. Dalla mia indagine iniziale sembra che HAProxy abbia le opzioni di bilanciamento del carico più sintonizzabili.
Joel K,

Sembra ragionevole, dal momento che è stato appositamente costruito come uno strumento di bilanciamento del carico. D'altra parte, le funzionalità di bilanciamento del carico di Varnish sono piuttosto buone e la rimozione di un processo da questo mix rende la tua configurazione più semplice con meno latenza.
Larsks,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.