2009-04-18 6 views
6

Sto per distribuire un'applicazione Django su un server Web nginx e voglio assicurarmi che sto costruendo il sistema correttamente.nginx + FastCGI per l'applicazione django --- esegui due server web o uno?

Sembra essere opinione comune che se si sta distribuendo Django su un server Apache, si dovrebbe comunque mettere un server nginx davanti all'applicazione per servire file statici, in cui nginx è più performante.

Se invece di apache per il codice Django, mi piacerebbe usare nginx + FastCGI per ospitare l'applicazione Django, c'è qualche motivo per configurare una seconda installazione di nginx per sedersi davanti al server nginx che sta servendo contenuto dinamico , per gestire il contenuto statico e il reindirizzamento al contenuto dinamico?

In particolare, ci saranno diversi parametri di configurazione per il contenuto statico e dinamico che mi farebbero desiderare di tenere separati i server, o posso ospitare tutto in una singola installazione di nginx, con alcuni degli URL mappati a django contenuto e il resto viene mappato al contenuto statico servito dalla stessa installazione di nginx?

Grazie per il vostro consiglio!

risposta

5

La maggior parte delle direttive di configurazione possono vivere all'interno di blocchi di posizione (ad esempio, non sono globali solo) ed è molto comune a fare questo è pratica. Non dovresti avere problemi a configurarlo usando solo 1 istanza di nginx.

Una delle cose grandiose di questo è che è possibile impostarlo inizialmente in questo modo e poi cambiare idea in seguito passando il blocco di posizione per passare a un server di back-end senza che nessuno di questi sia visibile al mondo esterno.

Quindi andare avanti e farlo su un server ora, sapendo che è possibile inserire in un server di backend o cluster in seguito, come è necessario aumentare.

+0

Grazie, dwc! Buon punto sull'utilizzo di un server ora, e passando il traffico più tardi per mezzo di un blocco di posizione, se ho bisogno di separare le cose un po '. – Adam

0

sono sicuro che permette di configurare tutti i contenuti statici e dinamici in un unico file di configurazione con un server nginx

+0

È vero. Il modo in cui lo fai è con più direttive "location" nel tuo blocco "server". Mi chiedo se i parametri per file statici e dinamici (keepalive, ecc.) Siano in contrasto con ogni altro e se i pattern di accesso per contenuto statico e contenuto dinamico interferiscano in qualche modo con i processi di lavoro se si trovano nello stesso daemon . – Adam

2

Direi che proxy-django al proprio server entra solo se si sta eseguendo il rollover con mod_python, ovvero: serve statico con nginx e proxy django in un'istanza apache che esegue mod_python. Gestisco felicemente django in lighttpd tramite fastcgi con lo stesso lighttpd che serve anche contenuti statici.

+0

Meraviglioso! Grazie per il consiglio a titolo di lighttpd! – Adam

4

Per rispondere alla tua domanda su come mettere un server nginx di fronte a un altro nginx: No, normalmente non c'è una buona ragione per farlo. Questo vecchio consiglio proviene da Apache, specialmente quando mod_python è stato usato con MPM di prefork di Apache. In questa configurazione ogni istanza di Django verrebbe eseguita come processo separato, all'interno di un contenitore mod_python/Apache, e questo userebbe molta RAM. L'idea era di mantenere il file statico al servizio di Apache, posizionando un server HTTP leggero basato sugli eventi come nginx di fronte ai pesanti processi di Apache. Questa RAM salvata e prestazioni migliorate. Quando si utilizza un server leggero come nginx per tutte le richieste questo è un non-problema.

nginx ha una buona gestione della riscrittura degli URL, guarda nel modulo Riscrivi.

La domanda non dice quale carico (connessioni/secondo) si aspetta, o perché si desidera utilizzare nginx in primo luogo. Se questo è per un blog su un server VPS o una configurazione simile a basso carico, cerca in Apache con mod_wsgi in modalità daemon.Questo ha prestazioni & utilizzo di RAM molto vicino a FastCGI, e mod_wsgi recentemente è diventato il modo ufficialmente consigliato di ospitare Django, vedere http://docs.djangoproject.com/en/dev/howto/deployment/modwsgi/

In generale vi suggerirei di usare Apache/mod_wsgi, se possibile, è una combinazione stabile e flessibile. Assicurati di non "ottimizzare prematuramente" usando nginx dove Apache + mod_wsgi andrebbe bene. Per una panoramica delle prestazioni di mod_wsgi in modalità demone vedere: http://code.google.com/p/modwsgi/wiki/PerformanceEstimates

nginx è impressionante, ma per una soluzione nginx Django è IMHO una misura migliore, come un bilanciatore di carico per i molti casi Apache, o di un server separato per i file statici. Entrambi questi scenari di utilizzo sono significativi solo per grandi carichi.

+0

Ottima risposta! Proverò a confrontare le prestazioni di nginx come solo proxy e nginx come bridge fastcgi una volta che avrò la possibilità. – Adam

+0

Grazie Adam. Ma quello che voglio dire è che dovresti cercare in Apache con mod_wsgi in modalità demone. mod_wsgi è un modulo caricabile di Apache, cioè funziona solo con Apache. La modalità Demone assomiglia a FastCGI in molti modi, ma utilizza l'interfaccia WSGI più ricca e moderna invece di CGI –

+1

Sto usando nginx per servire sia file statici che un processo django fastcgi sul mio pacchetto di web hosting condiviso poiché il consumo di memoria di nginx è molto inferiore (circa 30 Mb per nginx e django) rispetto a 100 Mb per apache e django) – Frozenskys