Quando devo passare a NGinx?


11

Ho un server con diversi domini e applicazioni in esecuzione, tutto tramite Apache. Va tutto bene al momento, ma ho in programma di sviluppare alcune applicazioni web ad alta intensità di prestazioni (usando C ++ con CPPCMS), a partire dal mio server per i test, forse ottenere un server separato solo per questa applicazione una volta pronta.

In ogni caso, ho sentito molto parlare di NGinx, che sembra essere più performante di Apache, quindi mi chiedevo se valesse la pena lavorarci per quel nuovo progetto. Non è chiaro nella mia mente perché non so che tipo di collo di bottiglia delle prestazioni NGinx risolve esattamente.

Non sono un potente utente di Apache, sono un povero amministratore di Linux e non sviluppo molto le app Web (ma ho nozioni). Mi dedico principalmente alla scrittura di software, quindi la parte del web server a volte è molto oscura per me. Ogni volta che devo configurare un sito Web tramite apach, ho bisogno di molto tempo per navigare nel documento per assicurarmi di non interrompere tutto.

Detto questo, penso che sto migliorando molto da questo lato, ma ho ancora bisogno di consigli. Ho visto alcuni file di configurazione di nginx in giro, e questo sembra molto più comprensibile di quelli di Apache, ma forse mi sbaglio?

Dalle informazioni che ho raccolto, NGinx sarebbe la scelta migliore quando desideri il bilanciamento del carico, quindi se hai la tua applicazione distribuita su più macchine, giusto? Mentre sto pensando alla mia applicazione per lo scalling (e le prestazioni), sembra che sia quello di cui ho bisogno, ma forse ho bisogno di sapere più cose su quando è interessante passare da Apache a NGinx. Vale la pena passare a NGinx anche per tutte le mie app attuali? Quanto costa? (Voglio dire, è costoso in tempo per passare dall'una all'altra?) Posso usare Apache e NGinx entrambi sullo stesso computer senza alcun problema?

Nota a margine : per favore non esortarmi ad usare linguaggi interpretati anziché C ++, non è correlato alla domanda. Consulta la pagina delle motivazioni di CPPCSM per vedere quale tipo di applicazione può trarne vantaggio. Comprendo perfettamente gli svantaggi (rispetto alle app in Ruby e Python, che uso già per webapps meno affamate di energia) e sto bene.

Risposte:


10

Diversi punti:

La principale differenza tra Apache e Nginx o Lighttpd (che personalmente mi piace molto) è l'architettura:

  1. Apache gestisce una connessione per processo o per thread (a seconda di mod-XYZ)
  2. Nginx e Lighttpd sono single threaded gestiscono connessioni multiple in un singolo loop di eventi.

Di conseguenza:

  1. Nginx e Lighttpd si ridimensionano molto meglio con un elevato numero di connessioni simultanee, diciamo con 1000 connessioni Apache sarebbe quasi morta poiché richiederebbe 1000 processi in mod-prefork o 1000 thread in mod-worker.

    Se stai pianificando di utilizzare le tecnologie Comet in cui ogni connessione richiede una connessione HTTP con polling lungo, Apache non sarebbe accettabile in quanto non si adatta correttamente.

  2. Nginx e Lighttpd consumano meno memoria poiché ogni connessione richiede + - due socket (HTTP e FastCGI), buffer di memoria intermedio e alcuni stati, mentre Apache avrebbe bisogno dell'intero thread incluso stack e altre cose.

Dalla mia esperienza personale nei benchmark ho fatto Lighttpd (e presumo anche Nginx) è leggermente più veloce con il backend FastCGI rispetto ad Apache, ma questo è per un basso numero di connessioni.

Ora un altro punto è quando si desidera eseguire alcuni bilanciamento del carico utilizzando le connessioni FastCGI.

Nell'architettura tradizionale c'è

                               |
                              HTTP
                               |
         Balancer (Nginx/Lighttpd/Cherooke/something-else)
            /      |           |            |      \
         HTTP    HTTP         HTTP        HTTP     HTTP
         /         |           |            |         \
 Apache+PHP   Apache+PHP   Apache+PHP   Apache+PHP   Apache+PHP   
  Server 2    Server 3     Server 4      Server 5     Server 6

Perché Apache gestisce pool di processi ognuno dei quali esegue mod-PHP (o altre modalità)

Quando usi CppCMS che gestisce i pool da solo puoi fare qualcosa di diverso:

                               |
                              HTTP
                               |
         Balancer (Nginx/Lighttpd/Cherooke/something-else)    
                           Server 1
            /      |           |            |      \
         FCGI    FCGI         FCGI        FCGI     FCGI
         /         |           |            |         \
    CppCMS App  CppCMS App  CppCMS App    CppCMS App  CppCMS App
     Server 2    Server 3     Server 4      Server 5     Server 6

Quindi fondamentalmente non è necessario un altro livello di riferimento indiretto perché CppCMS gestisce il processo, il thread e il pool di connessioni. Mentre PHP / Ruby / Perl necessitano di Apache mod-XYZ o gestiscono il proprio connettore FastCGI.


+1 Bella spiegazione completa dell'autore di CppCMS;) Ok ora vedo meglio il problema generale. Quindi il caso in cui hai un solo server (per cominciare) è HTTP-> Balancer-> FCGI-> CPPCMS, se capisco correttamente? Cosa ne pensi dei consigli del commento di Jesper Mortensen, secondo cui FastCGI non è veloce?
Klaim,

@Klaim: guarda i disegni eccellenti sopra - in questa architettura, FastCGI è usato come interconnessione tra più server, ognuno con un'istanza CppCMS multi-thread. La velocità relativa di FastCGI conta molto meno in questo caso; le tue alternative sarebbero HTTP, AJP e altri protocolli di rete che non sono 'veloci'. Questa risposta dovrebbe probabilmente essere contrassegnata come accettata e la tua domanda modificata, perché non si tratta davvero di quando ne vale la pena nginx.
Jesper M,

@Jesper Mortensen> Sono d'accordo, ma quale modifica sulla domanda suggerisci con precisione?
Klaim,

6

Nginx, parlando molto ( molto ) in generale, può ottenere un throughput molto più elevato rispetto ad Apache grazie a un diverso approccio architettonico al problema di pubblicare pagine sul Web. Nginx è stato anche creato principalmente come proxy inverso e riempie quel ruolo eccezionalmente bene (questo è il bit di bilanciamento del carico a cui hai accennato); Apache, d'altra parte, è stato creato per servire pagine Web e in seguito ha acquisito la capacità di proxy.

Detto questo, ci sono quasi certamente aree in cui Apache supererà costantemente Nginx, mentre ce ne sono altre in cui Nginx supererà costantemente Apache.

La risposta breve è che se Apache funziona per te, non è necessario cambiare. (E lo dico come un ex utente Apache che è diventato un discepolo Nginx completamente convertito.) Solo quando il traffico verso il tuo server inizia a raggiungere livelli in cui Apache sta diventando il tuo collo di bottiglia (questo è nell'ordine di alcune migliaia di connessioni simultanee, ma varia notevolmente in base alle specifiche del server e al carico del server) o se stai cercando di eseguire Apache in un ambiente povero di risorse in cui può a malapena adattarsi, il passaggio a Nginx ti offre solidi vantaggi.

Detto questo, se vuoi passare a Nginx (cosa che incoraggio!), Allora provaci. Vedrai qualche vantaggio? 9 volte su 10: No, non lo farai. Ma hai detto che ti piace di più il linguaggio dei file di configurazione di Nginx, quindi se ti fa sentire più a tuo agio nel configurare Nginx di Apache, questo è un vantaggio per te! (Personalmente, trovo che le configurazioni di Apache siano più facili da leggere in generale, ma ciò potrebbe essere dovuto al fatto che ho trascorso molti, molti anni a leggerle, e solo pochi mesi sono stati spesi su Nginx!)

Nota a margine: hai citato il tuo desiderio di creare un'app Web in C ++. Per la tua sanità mentale, ti consiglio vivamente di usare un linguaggio di livello superiore come PHP, Python o persino Java. Quindi profila il tuo codice e considera la creazione di moduli basati su C ++ per affrontare specifici colli di bottiglia (Python e PHP lo consentono entrambi piuttosto facilmente; non conosci Java). Se sei preoccupato per le prestazioni complessive, considera questo: EVE Online, il singolo MMORPG più grande non scheggiato al mondo, è costruito su una variante di Python (Stackless Python), con solo componenti chiave (ad esempio le librerie grafiche) scritte in C ++. Se Python può gestirlo, sicuramente può gestire la tua app web?


+1 Grazie. A proposito di C ++, vedi il mio commento sulla risposta di Jesper Mortensen. Inoltre, anche se Python viene utilizzato sul lato server di Eve Online (lo so molto, AFAIK), gestisce solo il codice di gioco (che è grande) e alcune altre parti sono in realtà in C ++. Il codice grafico è sul lato client, quindi C ++ è sempre obbligatorio per tali tipi di prestazioni grafiche. Come ho detto, vedi la pagina Razionale CPPCMS sul perché l'ho scelto. Se seguissi il tuo consiglio, dovrei scrivere la mia domanda due volte, mentre so già che ha molta fame. Inoltre, capisco gli svantaggi e sto bene con esso.
Klaim,

3

Nessuno può davvero rispondere alla parte "quando dovrei cambiare" - dipenderà dal tuo carico, dalle prestazioni del tuo codice applicazione, ecc.

NGinx, che sembra essere più performante di Apache

nginx utilizza un singolo processo (o un numero molto limitato di processi di lavoro) per gestire tutte le connessioni client utilizzando l'I / O con evento. Apache ha diversi "Moduli multi-elaborazione" disponibili, ma tutti si appoggiano maggiormente a molti processi / thread. Di conseguenza, Apache consumerà generalmente più RAM e CPU di nginx per la gestione delle connessioni HTTP di base. Puoi avere una panoramica dei diversi approcci di gestione della connessione nella pagina C10K di Kegel .

applicazione Web ad alte prestazioni (utilizzando C ++ con CPPCMS)

Consiglio vivamente di prendere in considerazione l'idea di eseguire la webapp di base in un linguaggio di livello superiore (Python, o forse Ruby, Scala) e di utilizzare una coda di messaggistica per inviare i ticket di lavoro alle macchine dei lavoratori che gestiscono le attività "ad alte prestazioni" in modo asincrono.

NGinx sarebbe la scelta migliore quando desideri il bilanciamento del carico,

nginx è un buon bilanciamento del carico; ma ci sono molte opzioni in quello spazio .

Posso usare Apache e NGinx entrambi sullo stesso computer senza alcun problema?

Sì. Basta eseguirli su diversi numeri di porta IP e / o indirizzi IP.


"Consiglio vivamente di prendere in considerazione l'idea di realizzare la webapp di base in un linguaggio di livello superiore"> Non ho detto che fosse una webapp di base - non è nemmeno banale. Se vedi la logica per l'uso di CPPCMS, l'autore indica alcuni casi in cui potrebbe essere utile, e io sono in quei casi. Ho preso in considerazione altre alternative, ma le ho trovate più costose rispetto al C ++, almeno nel tipo di webapp che sto scrivendo. Quindi non fa parte della domanda. Ma capisco i tuoi consigli e do lo stesso alle persone che mi chiedono se dovrebbero usare C ++ per le app web. Ho anche intenzione di usare Python per un'altra app più semplice.
Klaim,

Comunque, +1 per i dettagli.
Klaim,

@Klaim: se desideri realizzare il preteso miglioramento delle prestazioni dell '"ordine di grandezza" rispetto a un'implementazione C # / Java ben ottimizzata, verifica se puoi eseguire CppCMS e il codice dell'applicazione in corso con il tuo server web, ad esempio come plug-in per nginx / Apache. Le pagine CppCMS sembrano mostrare FastCGI come connessione tra webserver e CppCMS; e in realtà FastCGI non è ... veloce.
Jesper M,

> Idea interessante. La maggior parte dei consigli è che dovresti usare fastcgi perché è più veloce delle alternative. Verificherò se posso farlo, forse vedrò con l'autore CPPCMS perché pensa che sia il più veloce.
Klaim
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.