Apache vs Nginx


29

Di recente ho studiato le differenze tra Apache e Nginx e sono confuso su quale dovrei scegliere.

Ho fatto qualche ricerca, ma non esiste un confronto definitivo tra i due e mi chiedevo se qualcuno qui potesse esprimere la propria opinione sulle differenze tra i due.

Le mie attuali conoscenze mi permettono di capire che mod_php è più veloce e più sicuro di fastcgi, tuttavia Apache è molto peggio quando si tratta di connessioni simultanee e consumo di memoria.

Il mio sito utilizza molti polling lunghi ma ha una base web non AJAX (ovvero Apache con polling lungo in alto).

La mia soluzione originale ai problemi di memoria di Apaches consisteva nell'inviare il polling lungo tramite node.js e quindi ottenere node.js per accedere ad Apache ogni 2 secondi, nel qual caso Apache non avrebbe una connessione aperta ma invece avrebbe node.js. Sono arrivato alla conclusione che questo potrebbe non essere abbastanza buono e sto cercando soluzioni diverse. Sono ancora interessato a sapere se la mia idea originale avrebbe funzionato.

Quindi, qual è il migliore per il web moderno? Apache o Nginx?

Aggiornamento: tutti i suggerimenti forniti erano validi e validi. Sono andato con la seconda idea originale che è quella di utilizzare un server Nginx completo. Sono soddisfatto del fatto che essendo un server dedicato non potrei soffrire di problemi di sicurezza causati da FastCGI e poiché i miei script di polling lunghi devono essere scritti in PHP, ho bisogno di un server in grado di gestire connessioni simultanee ad alto carico e Apache non può farlo indipendentemente da quanto Cambio la struttura sarà ancora fame di memoria.

Ho segnato la risposta di Martin F da quando ha dato una risposta così chiara e completa alle mie domande punti che sento che merita il voto, tuttavia, tutte e tre le risposte erano buone e valide e sicuramente esamineremo l'uso del proxy inverso per un altro sito che possiedo da quando ho appena trovato qualcosa di molto molto molto divertente che Nginx può fare nel proxy.

Grazie,

Risposte:


28

Sembra che tu abbia alcune idee sbagliate che ritengo debbano essere affrontate.

Prima di tutto, mod_php è solo leggermente più veloce, tutti i miei test hanno dimostrato che la differenza è così minuscola che non vale la pena prendere in considerazione. Dubito anche che l'aspetto della sicurezza sia rilevante per te come sembri guardare un server dedicato e mod_php ha davvero un vantaggio solo in un ambiente condiviso - in effetti, in un ambiente dedicato php-fpm avrà il vantaggio dato che PHP e il tuo server web ora funzionano come processi diversi, e questo non è nemmeno il factoring nelle fantastiche opzioni di registrazione in php- fpm come registro lento.

Se il mondo fosse in bianco e nero, direi di andare con una configurazione nginx pura e compilare php con php-fpm. Più realisticamente se hai già Apache funzionante, fai di nginx un proxy inverso per apache e potresti risparmiare qualche ora di configurazione e la differenza nelle prestazioni sarà minuscola.

Ma supponiamo che il mondo sia in bianco e nero per un secondo, perché questo rende configurazioni molto più fantastiche. Fai nginx + php-fpm per il tuo server web. Per risolvere i caricamenti, utilizzare il modulo di caricamento e caricare il modulo di avanzamento per nginx. Ciò significa che il tuo server web accetta il caricamento e passa il percorso del file su PHP quando è fatto, quindi il file non deve essere trasmesso in streaming tra nginx e PHP tramite protocollo fastcgi, dolcezza. (Ho una configurazione live e funziona alla grande, a proposito!)

Per il download degli utenti usi la funzione simile a x-send-file di nginxs chiamata x-accel-redirect, essenzialmente fai l'autenticazione in PHP e imposti un'intestazione che nginx raccoglie e inizia a trasferire quel file. PHP termina l'esecuzione e il tuo server web sta gestendo il trasferimento, dolcezza! (Ancora una volta, ho questo in una configurazione dal vivo e funziona alla grande)

Per la distribuzione di file tra server o altre operazioni di lunga durata ci rendiamo conto che PHP non è davvero adatto a questo, quindi installiamo gearman, che è un job server in grado di distribuire lavori tra lavoratori su server diversi, questi lavoratori possono essere scritti in qualsiasi linguaggio. Pertanto è possibile creare un lavoratore distribuito e generarne 5 utilizzando un totale di 200 KB di memoria anziché i 100 MB di PHP che verrebbero utilizzati. Dolce. (Ho anche questo in esecuzione dal vivo, quindi è tutto effettivamente possibile)

Nel caso in cui non lo avessi ancora capito, penso che molti dei tuoi problemi non siano affatto legati al tuo server web, la pensi in questo modo perché Apache lo costringe ad essere correlato al tuo server web a causa della sua struttura, spesso ci sono strumenti di gran lunga migliori per il lavoro di PHP e PHP è un linguaggio che lo sa e offre eccellenti opzioni per scaricare il lavoro senza mai uscire da PHP.

Consiglio vivamente nginx, ma penso anche che dovresti esaminare altre opzioni per i tuoi altri problemi, se hai un problema di ridimensionamento o prestazioni, sentiti libero di scrivermi. Non so se puoi inviare messaggi qui, ma altrimenti scrivimi a martin@bbtn.us poiché non inseguo l'errore del server per tutto ciò che non è taggato con nginx. :)


1
Accidenti che ha chiarito davvero le cose :) grazie è stata la spiegazione che stavo cercando. Penso di essere abbastanza venduto sull'apprendimento di Nginx ora da quando Apache sarebbe soffocato e sarebbe morto usando il mio sito. Fortunatamente sembra davvero abbastanza facile spostarlo. Voglio dire, le persone su node.js hanno detto di scrivere la maggior parte delle cose in questo e di eseguire il polling della classe della sessione php solo se è davvero necessario (cosa che faccio a meno che non esista un modo per rilevare quando gli utenti chiudono le finestre: P). Sì, sono in esecuzione su una server farm di grandi dimensioni, quindi sapere che non ci sono minacce alla sicurezza aiuta tonnellate, grazie per l'ottima spiegazione :)
Sammaye,

Ho guardato questo: joeandmotorboat.com/2008/02/28/… e questo: blog.webfaction.com/a-little-holiday-present e mi ha davvero fatto scherzare al pensiero di riuscire a lungo sondaggio sul contenuto del mio cuore davvero. Non un singolo problema di memoria a differenza di Apache :)
Sammaye,

Aspetta quindi il tuo detto che potrei fare un lavoratore multithread in Java e PHP in grado di aggirarlo perfettamente? Voglio dire, il problema più grande che vedo è il server dal momento che ottengo enormi problemi di memoria con Apache usando il polling lungo, che è comune ... spesso risolto da Nginx.
Sammaye,

1
In sostanza sì, ho dei lavoratori di distribuzione dei file scritti in C, usando l'estensione gearman per PHP invio un lavoro di distribuzione al server dei lavori gearman e lo invia a un lavoratore, che può essere scritto in qualsiasi lingua; PHP, Java, C, ecc. Questo lavoratore fa quindi il suo lavoro e riporta lo stato a gearman, che riporta a PHP. (a meno che non sia stato scelto un lavoro in background, nel qual caso PHP termina senza aspettarlo)
Martin Fjordvald

2
So che si tratta di un vecchio post, ma devo dire che questo è uno dei post più informativi che ho trovato sull'argomento nginx vs apache. Grazie Martin, +1.
Akoi Meexx,

5

Suggerirei di eseguire nginx come proxy inverso. Gestirà tutti i tuoi file statici e memorizzati nella cache (dove è notevolmente più veloce di Apache / meno sovraccarico di memoria) e quindi inoltrerà tutte le richieste di contenuto dinamico ad Apache.


Sì, questo è ciò che la maggior parte della gente sembra fare atm, dovrò sicuramente esaminare questo :)
Sammaye,

1
Ricorda di installare mod_rpaf per Apache in modo da poter passare attraverso gli indirizzi IP del client ai fini della registrazione (altrimenti i log di Apache mostreranno tutte le richieste come da 127.0.0.1), aggiungi quanto segue in nginx config: proxy_set_header X-Forwarded-For $ proxy_add_x_forwarded_for;
Greg Annandale,

Mi chiedo una cosa prima di provare questa sera. Se instrado da Nginx ad Apache che serve il mio PHP, ciò significa che il polling lungo avrebbe ancora gli stessi problemi di Apache o che chiamarlo in proxy inverso farebbe funzionare Apache in modo diverso in qualche modo?
Sammaye,

1

Non sono così sicuro che mod_php sia più veloce delle sue alternative, dove l'hai letto? Ho fatto alcuni test di laboratorio con nginx + php-fpm, e da quello che ho misurato batte ogni altra configurazione.

Dai un'occhiata a questa configurazione: http://interfacelab.com/nginx-php-fpm-apc-awesome/

L'ho impostato quasi allo stesso modo, tranne per il fatto che utilizzo i pacchetti PHP da http://www.dotdeb.org/ - che include un pacchetto php-fpm e uno script init pronto per l'uso. Non uso memecache o syck.


stackoverflow.com/questions/78108/… l' ho preso da qui e ho controllato il manuale di php e dice che php_mod offre un vantaggio significativo rispetto alle versioni cgi. La tua configurazione sembra buona. Sembra anche molto facile. Ci penserò :)
Sammaye,

2
Afferma che CGI è molto più lento di un modulo integrato - non FastCGI :)
pauska

1
Bene - se ti preoccupi della morte (o del timeout) del processo PHP, allora FastCGI (o PHP-FPM) è la strada da percorrere. Può uccidere il processo dei bambini morti senza interrompere altre attività.
pauska,

1
Sì. O bene, dipende. Quanti (massimo) numero di richieste lente elaborerai contemporaneamente? Impostare il numero massimo di thread PHP FPM su quello, più il numero di cgi "veloci" che si desidera siano disponibili. Ho sentito parlare di persone che gestiscono 200 bambini PHP-FPM su un server con 4 GB di RAM, quindi non mi preoccuperei troppo di questo se fossi in te. La prossima versione di PHP (5.3.3) includerà PHP-FPM di serie, in cui è incluso anche un motore adpativo - si ridimensionerà in base al numero di richieste in sospeso.
pauska,

1
Sarei facilmente in grado di funzionare su più server (forse fino a 10) ma se riesco a soddisfare 200 richieste che possono essere interrogate a lungo su un server da 4 GB questo dovrebbe quasi la metà dei 20 server avrei bisogno di eseguire Apache. hmmmm ... Dovrò provarlo stasera
Sammaye,
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.