Introduzione
I server Web sono stati una parte fondamentale di Internet sin dagli albori del World Wide Web. Il software del server Web riceve richieste da client remoti e serve i client con pagine Web archiviate su hardware, come server dedicati.
In questo articolo di confronto, leggerai le differenze tra i due server Web open source più popolari oggi:Apache e Nginx.
Informazioni sul server Apache
Apache HTTP Server (o Apache in breve) è un software per server Web open source sviluppato dalla Apache Software Foundation. Inizialmente è stato progettato come server Web basato su processi, ma a partire dalla versione 2.0 e dall'introduzione dei moduli di elaborazione multipla, può essere configurato sia come server basato su processi che threaded. L'architettura modulare del server consente anche funzionalità come la gestione del protocollo modulare.
Un'altra caratteristica essenziale dell'architettura di Apache sono i filtri, che consentono ai moduli di interagire con il contenuto creato da altri moduli. Questa interazione include crittografia, scansioni antivirus e compressione di contenuti sia statici che dinamici.
Nota: Il server HTTP Apache funziona meglio su Linux. Scopri come installare Apache su CentOS. Per Ubuntu, leggi Come installare Apache Web Server su Ubuntu. Per la gestione di base del server Web Apache, scopri come avviare, arrestare e riavviare Apache.
Informazioni sul server Nginx
Nginx (pronunciato engine-x) è un server web open source sviluppato da Nginx, parte di F5, Inc.
Come server HTTP, Nginx utilizza un'architettura (asincrona) basata su eventi altamente scalabile che consente prestazioni elevate e un footprint di memoria ridotto.
Nginx può anche funzionare come proxy inverso, bilanciamento del carico, proxy di posta e cache HTTP. In alcuni casi d'uso, Nginx funge anche da acceleratore web o terminatore SSL/TLS.
Nota: Come Apache, Nginx è anche più compatibile con Linux. Per installare Nginx su CentOS, fare riferimento a Come installare Nginx su CentOS. Per installarlo su Ubuntu, leggi Come installare Nginx su Ubuntu. Per le istruzioni di base sulla gestione di Nginx, scopri come avviare, arrestare e riavviare Nginx.
Apache vs Nginx:una rapida panoramica
Di seguito una rapida panoramica dei principali punti di confronto tra Apache e Nginx.
Categorie | Apache | Nginx |
---|---|---|
Costo | Disponibile gratuitamente | Il prodotto principale, OSS Nginx, è disponibile gratuitamente. Nginx Plus è un'opzione a pagamento, con supporto e funzionalità aggiuntive. |
Licenza | Licenza Apache 2.0 | Licenza BSD a 2 clausole |
Scritto in | C, XML | C |
Sistemi operativi | Linux, Microsoft Windows, altri sistemi simili a Unix, OpenVMS | Linux, macOS, Microsoft Windows, altri sistemi simili a Unix, HP-UX, IBM AIX |
Architettura | Modulare, basato su processi/filettato | Modulare, basato su eventi |
Configurazione | Distribuito | Centralizzato |
Interpretazione | Principalmente basato su file | Principalmente basato su URI |
Caratteristiche | - Moduli multi-elaborazione - Supporto per la configurazione per directory - Proxy inverso con memorizzazione nella cache - Bilanciamento del carico compatibile con IPv6 - Supporta HTTP/2 - Supporto XML Supporto FTP (con un modulo separato) | - Servire file statici e di indice - Apri la cache del descrittore di file - Proxy inverso accelerato con memorizzazione nella cache - Bilanciamento del carico e tolleranza ai guasti - IPv6 supportato, non abilitato per impostazione predefinita - Supporta HTTP/2 - Inoltro della posta - Memorizzazione nella cache HTTP |
Supporto | - Documentazione del server HTTP Apache - Elenco utenti del server HTTP Apache - IRC - Overflow dello stack - Supporto commerciale da parte di fornitori di terze parti | - Mailing list gestita dalla community - IRC - Overflow dello stack - Supporto ufficiale a pagamento per Nginx Plus |
Architettura
Il server HTTP Apache presenta un piccolo server core e diversi moduli. I moduli vengono compilati staticamente o caricati dinamicamente.
Al momento dell'avvio, Apache avvia più processi server. Lo scopo di tali processi è condividere il carico di lavoro. Il processo principale è il processo principale , mentre altri sono processi figlio . Ogni processo figlio crea un numero predeterminato di thread del server che gestiscono le richieste in arrivo.
Per ottimizzare il server per il sistema operativo, Apache utilizza il Multi-Processing Module (MPM) . Lo scopo di questo modulo è collegarsi alle porte di rete, accettare richieste e gestire la gestione delle richieste assegnando processi figlio per eseguire queste attività. Apache installa l'MPM più adatto all'ambiente in base al sistema operativo rilevato e alle sue capacità.
Le librerie di Apache Portable Runtime (APR) sono un'altra parte importante di un server Apache. Gli APR forniscono un livello OS multipiattaforma. Questo livello funge da API universale per gli sviluppatori, eliminando la necessità di codificare problemi o funzionalità specifici della piattaforma.
Nginx presenta un'architettura basata sugli eventi che consente un facile ridimensionamento su hardware moderno.
Come Apache, Nginx ha un processo principale primario . Lo scopo di questo processo è controllare il collegamento della porta e la lettura della configurazione. Tuttavia, a differenza di Apache, i processi creati dal processo master sono progettati sulla base di un modello di processo prevedibile, il cui obiettivo principale è utilizzare al meglio le risorse hardware.
- Il caricatore di cache è un processo che viene eseguito all'avvio e carica la cache basata su disco in memoria.
- Il gestore della cache assicura che le voci della cache del disco rientrino nei limiti di dimensione definiti.
- I processi di lavoro eseguire operazioni di lettura e scrittura e gestire le connessioni di rete.
I processi di lavoro iniziano con l'ascolto e l'attesa degli eventi. Ogni volta che viene richiesta una nuova connessione in entrata, viene avviato un evento. Dopo aver stabilito la connessione, Nginx crea un descrittore di file che occupa solo una piccola quantità di memoria del processo di lavoro. Questa caratteristica rende Nginx significativamente più scalabile di Apache, che utilizza l'approccio basato sui processi, in cui ogni connessione separata consuma una grande quantità di risorse.
Moduli
Sia Apache che Nginx utilizzano approcci basati su moduli. Tuttavia, l'implementazione è diversa.
Apache dispone di moduli caricati dinamicamente che possono essere utilizzati ogni volta che ce n'è bisogno. Il server supporta molti moduli diversi, sia ufficiali che di terze parti. Ciò rende Apache una piattaforma molto personalizzabile che gli utenti possono adattare alle proprie esigenze.
Nginx i moduli devono essere integrati nel core e non possono essere caricati dinamicamente. Per includere moduli non standard, gli utenti devono compilare il proprio server dal sorgente. Sebbene questa mancanza di flessibilità possa sembrare limitante, significa anche una maggiore sicurezza poiché consentire l'integrazione dinamica dei moduli pone problemi di sicurezza.
Prestazioni
Utilizzando una varietà di moduli di elaborazione multipla supportati, Apache può essere eseguito in tre modalità:
- Modalità basata sul processo.
- Processo ibrido e modalità thread.
- Modalità evento ibrido.
L'utente può configurare Apache in base alle proprie esigenze. Pertanto, le risorse del server vengono utilizzate in modo efficace per un caso d'uso particolare.
Apache presenta una serie di ottimizzazioni per aumentarne il throughput e la scalabilità. Alcune di queste ottimizzazioni fanno parte della configurazione del server predefinita e gli amministratori del server possono configurare il resto in base alle esigenze specifiche del proprio sistema. L'ottimizzazione delle prestazioni può risolvere molti dei problemi di configurazione di runtime e di compilazione di Apache.
Nginx è un server web creato appositamente per superare Apache. Riesce a farlo in diverse categorie, come il tempo di connessione, il numero di richieste ricevute al secondo, la velocità di trasferimento e il tempo impiegato per elaborare una richiesta.
Gli amministratori del server possono ottimizzare ulteriormente Nginx per le prestazioni modificando la configurazione del server per adattarla alle specifiche del sistema. La regolazione dei processi e delle connessioni di lavoro, l'abilitazione della compressione Gzip e la memorizzazione nella cache dei file statici migliora notevolmente le prestazioni di Nginx.
Contenuti statici e dinamici
Apache elabora contenuti sia statici che dinamici utilizzando moduli caricati dinamicamente e non dipende da componenti esterni.
Sebbene entrambi i server mostrino prestazioni simili nel caricamento dinamico dei contenuti, Nginx utilizza molta meno memoria e gestisce circa quattro volte più richieste al secondo per servire file statici. Ciò è dovuto principalmente al fatto che l'interprete per il contenuto dinamico non è parte integrante di un server Nginx. Al contrario, il server passa tutte le richieste di pagine Web dinamiche a un processo esterno, attende che il processo restituisca il contenuto e quindi invia il contenuto al client. Sebbene ciò renda più complicata l'elaborazione delle pagine dinamiche, semplifica il processo di pubblicazione delle pagine statiche.
Configurazione distribuita e centralizzata
Apache la configurazione è distribuita. Il server fornisce supporto per un file .htaccess per facilitare questo tipo di configurazione.
Il .htaccess
file è un file di configurazione a livello di directory supportato da diversi server Web, utilizzato per gestire i problemi di accesso ai siti Web, come il reindirizzamento degli URL, l'abbreviazione degli URL, il controllo dell'accesso (per diverse pagine Web e file) e altro ancora. Il principale vantaggio di questo approccio è che le modifiche apportate in .htaccess
vengono immediatamente applicati al sistema. La modifica del file di configurazione principale richiede il riavvio del sistema per applicare le modifiche.
Inoltre, su server che ospitano più siti web, .htaccess
consente a ciascuno degli utenti di apportare modifiche alla configurazione del proprio sito Web senza alterare il file di configurazione principale del server.
Nginx la configurazione è centralizzata e non supporta .htaccess
. Il motivo è che si utilizza .htaccess
ha anche diversi svantaggi. Un aspetto importante è la perdita di prestazioni:ogni volta che un server riceve una richiesta HTTP, deve controllare tutte le directory principali che possono ospitare un .htaccess
file, per vedere se lo contengono. Un'altra preoccupazione significativa è la sicurezza. Consentire agli utenti non privilegiati di modificare la configurazione del server può essere pericoloso se non implementato correttamente.
Poiché non esiste una configurazione a livello di directory in Nginx, gli utenti eseguono tutte le modifiche alla configurazione scrivendo le direttive nel file di configurazione principale, nginx.conf
. Le modifiche vengono applicate dopo che il server è stato ricaricato.
Architettura di gestione delle connessioni
Apache gestisce le richieste dei clienti utilizzando i suoi moduli multi-elaborazione. Il vantaggio principale di ciò è che l'architettura di gestione della connessione può essere sostituita senza sforzo ogni volta che è necessario. Questi moduli sono:
mpm_prefork_module
– Il modulo prefork crea processi con un thread per ogni richiesta che deve essere gestita. Ogni processo figlio può supportare una connessione. Sebbene il numero di processi creati sia maggiore del numero di richieste, questo modulo funziona bene. Il problema principale dei moduli è che grandi volumi di richieste influiscono negativamente sulle prestazioni e aumentano significativamente il consumo di RAM.mpm_worker_module
– Il modulo di lavoro crea processi figlio. Ogni processo figlio gestisce più thread, con ogni thread che supporta una connessione. Poiché i thread sono più efficienti dei processi, questo modulo è più favorevole alle prestazioni rispetto al modulo prefork.mpm_event_module
– Il modulo eventi presenta un meccanismo simile al meccanismo del modulo di lavoro. Tuttavia, tenta anche di risolvere il "mantenere in vita". ' problema:il fatto che Apache, dopo aver completato la prima richiesta del client, mantiene l'intero processo figlio o thread in attesa di ulteriori richieste da parte del client. Il modulo eventi risolve questo problema facendo in modo che un thread listener designato monitori lo stato dei socket.
Nginx gestisce le connessioni utilizzando un algoritmo asincrono, non bloccante, basato su eventi. Utilizzando una funzione di loop rapido, i processi di lavoro del server possono gestire molte connessioni contemporaneamente ricercando ed elaborando continuamente eventi.
Quando un lavoratore stabilisce una connessione, la connessione si unisce al ciclo di eventi, dove subisce un'elaborazione asincrona. Quando la connessione si chiude, esce dal loop. Questo tipo di gestione della connessione consente a Nginx di scalare e utilizzare le risorse in modo economico.
Interpretazione basata su file e URI
Apache interpreta principalmente le richieste come risorse del filesystem, utilizzando la Directory
e File
blocchi. Il server inizia con DocumentRoot
e prova a localizzare il file utilizzando la parte della richiesta che segue l'host e il numero di porta.
Apache offre modi alternativi per soddisfare la richiesta quando non è possibile trovare la corrispondenza corretta attraverso il file system:
Alias
mappa gli URL alle posizioni del filesystem. Consente di archiviare i documenti altrove che inDocumentRoot
.Redirect
mappa un vecchio URL in un nuovo URL. Il server chiede al client di trovare la risorsa ricercata in una posizione diversa.Location
i blocchi consentono di lavorare con gli URI.
Contrariamente ad Apache, il cui design riflette principalmente le esigenze di un server Web, l'architettura Nginx consente di utilizzare il server come proxy. Pertanto, Nginx si occupa principalmente di URI.
Nginx utilizza blocchi di server e posizioni come blocchi di configurazione primari:
- Un blocco server è un sottoinsieme del file di configurazione che definisce il server virtuale per la gestione delle richieste. Poiché i server virtuali possono essere assegnati per gestire tipi di connessione specifici, gli amministratori del server possono assegnare diversi blocchi per diversi nomi di dominio, porte e indirizzi IP.
- Un blocco di posizione fa parte di un blocco di server che gestisce le richieste per varie risorse e URI. Instrada le richieste alla posizione corretta nel file system.
Poiché più blocchi possono agire come singole istanze del server Web, Nginx dispone di un sistema per trovare la corrispondenza migliore per ogni richiesta. Questa operazione viene eseguita utilizzando listen
direttiva, che trova possibili corrispondenze di blocco, e il server_name
direttiva, che sceglie la corrispondenza migliore.
Quando Nginx funziona con file statici, associa le richieste al filesystem. Tuttavia, il server esegue questa operazione solo dopo aver selezionato il server e i blocchi di posizione e aver connesso la radice del documento e l'URI. Il fatto che Nginx non si occupi del filesystem finché non è pronto a soddisfare la richiesta è uno dei motivi per cui non presenta un .htaccess
file equivalente.
Memorizzazione nella cache
Apache offre la memorizzazione nella cache per migliorare le prestazioni di un server. Esistono tre tipi di memorizzazione nella cache:
- Memorizzazione nella cache HTTP RFC2616 a tre stati offre una memorizzazione nella cache intelligente e sensibile a HTTP quando si tratta di contenuti proxy o dinamici archiviati localmente.
- Memorizzazione nella cache di oggetti condivisi chiave/valore a due stati offre cache di oggetti condivisi basata su chiave/valore.
- Memorizzazione nella cache di file specializzata abilita il precaricamento dei file all'avvio, migliorando i tempi di accesso per i file che sono frequentemente necessari.
Nginx raggiunge tempi di caricamento più rapidi e riduce il carico del server memorizzando nella cache il contenuto dinamico per un rapido accesso. Sebbene la memorizzazione nella cache aiuti a velocizzare i siti Web con traffico elevato e volume di contenuti, non è consigliata in altri scenari.
La memorizzazione nella cache di base in Nginx utilizza solo due direttive:
proxy_cache_path
per impostare il percorso e la configurazione della cache eproxy_cache
per attivare la cache.
Una caratteristica utile di Nginx è la possibilità di configurare il server per visualizzare il contenuto del sito Web memorizzato nella cache quando il server è inattivo o occupato.
Sicurezza
Apache e Nginx sono entrambi considerati sicuri. I potenziali rischi per la sicurezza derivano principalmente da una configurazione errata. Quindi, segui le migliori pratiche di sicurezza del server web per migliorare la sicurezza:
Per Apache :
- Regola la configurazione per prevenire attacchi DoS. Alcune delle direttive rilevanti per questo sono
RequestReadTimeout
,KeepAliveTimeout
eTimeOut
. - Regola i permessi su
ServerRoot
directory. - Fai attenzione con Server Side Include (SSI).
- Fai attenzione con gli script CGI.
- Proteggi le impostazioni di sistema da
.htaccess
sovrascrive configurando il file di configurazione del server. - Guarda i tuoi log.
- Mantieni aggiornato il server.
Per Nginx :
- Riduci il rischio di potenziali exploit di vulnerabilità disabilitando i moduli indesiderati.
- Disabilita i
server_tokens
direttiva, che rende pubblicamente visibile la tua versione di Nginx. - Disabilita i metodi HTTP non necessari.
- Controlla risorse e limiti per prevenire potenziali attacchi DoS.
- Imposta, configura e monitora i log di accesso e di errore per comprendere meglio lo stato del server.
- Includi intestazioni di sicurezza.
- Mantieni aggiornato il server.
Supporto e documentazione
Apache offre il supporto della comunità tramite la mailing list degli utenti del server HTTP Apache. Il supporto è disponibile anche su canali IRC dedicati, Stack Overflow, ecc.
La documentazione del server HTTP Apache offre manuali di riferimento, guide per l'utente, tutorial e altri documenti.
Nginx offre supporto della comunità, costituito da una mailing list gestita dalla comunità e un forum, nonché altre risorse di supporto come la Guida per l'amministratore e la Guida di riferimento dei moduli. Il supporto commerciale è disponibile per l'opzione a pagamento, NGINX Plus.
La documentazione open source di Nginx include istruzioni per l'installazione, istruzioni, guide allo sviluppo, riferimenti ai moduli e altri documenti.
Apache o Nginx
Gli ultimi dati di ricerca sulla quota di mercato mostrano che Apache è leggermente più avanti di Nginx.
Tuttavia, se guardiamo solo ai primi 1000 siti Web con il miglior ranking, Nginx è in vantaggio con un ampio margine.
Sia Apache che Nginx sono server raffinati e con buone prestazioni. Quando scegli il server giusto da installare sul tuo hardware, devi considerare per cosa lo utilizzerai.
Scegli Apache su Nginx se:
- Nel tuo caso d'uso, è preferibile che gli utenti non privilegiati abbiano il controllo sui propri siti web. Uno di questi casi è la gestione di un ambiente di hosting condiviso, in cui il
.htaccess
di Apache file diventa praticamente indispensabile. - Hai bisogno di alcuni moduli che Nginx non supporta.
Scegli Nginx su Apache se:
- Il tuo scenario di utilizzo include principalmente (o esclusivamente) la pubblicazione di contenuti statici.
- Ti aspetti un volume di traffico elevato sul tuo sito web.
Quando utilizzare sia Nginx che Apache
Apache e Nginx possono essere utilizzati fianco a fianco per creare un server ottimizzato per il carico di lavoro. Nginx è configurato per fungere da proxy inverso per Apache, che sfrutta la velocità di elaborazione e la capacità di Nginx di gestire grandi volumi di traffico. Nginx elabora e fornisce contenuto statico mentre inoltra contenuto dinamico ad Apache.
Lasciando che Nginx ordini le richieste ed elabori quelle che può gestire da solo, Apache riceve un volume di richieste inferiore. Ciò risolve preventivamente potenziali problemi di sovraccarico. Poiché Nginx può comunicare con un pool di server nel back-end, è possibile aggiungere più server e aumentare la scalabilità orizzontale.