Apache vs nginx: differenze e come tradurre la configurazione
Apache vs nginx
Apache vs nginx: processi, .htaccess e traduzione della config | We.Inc
Apache e nginx a confronto su gestione delle connessioni, .htaccess per directory contro config centrale, reload e proxy, con un traduttore per le rewrite rule più comuni.
Entrambi sono web server open source maturi. Apache carica moduli in un modello di processo a scelta (prefork, worker o event) e permette a ogni directory di sovrascrivere le impostazioni con file .htaccess. nginx esegue un processo master e pochi worker basati su eventi, legge solo la sua config centrale, e viene spesso messo davanti agli application server come reverse proxy.
Apache e nginx a confronto
Argomento
Apache httpd 2.4
Gestione delle connessioni
Scegli un MPM: prefork, worker o event (event è il default abituale sui sistemi Unix moderni)
Un processo master più processi worker con un modello basato su eventi
Config per directory
File .htaccess, se AllowOverride lo consente (default None)
Nessuna: tutto sta nei file di configurazione principali
upstream: round robin, least_conn, ip_hash, hash, random
Test e reload
apachectl configtest, poi apachectl graceful
nginx -t, poi nginx -s reload
Scegliere tra i due dipende soprattutto da dove vive la configurazione e da chi può modificarla. Questa pagina salta i benchmark, che dipendono interamente dal carico di lavoro e dalla messa a punto, e si concentra sulle differenze che incontri gestendo un sito: come ogni server gestisce le connessioni, perché esiste .htaccess, e come si traducono le rewrite rule che hai già. Usa il traduttore per vedere la versione nginx di una regola Apache familiare.
Scegli un'operazione nel traduttore, come forzare HTTPS o mandare ogni percorso sconosciuto a index.html.
Scrivi il tuo dominio così entrambe le versioni sono pronte da incollare.
Metti la versione Apache nel virtual host o in .htaccess, oppure la versione nginx dentro il blocco server corrispondente.
Fai un test prima del reload: apachectl configtest per Apache, nginx -t per nginx.
Su Apache, preferisci la config principale del server a .htaccess quando controlli la macchina. La documentazione di Apache lo dice chiaramente, perché consentire .htaccess fa cercare a httpd il file in ogni directory lungo il percorso di ogni richiesta.
In nginx, un blocco if che controlla l'host è quasi sempre meglio scritto come un blocco server separato con return 301.
Sostituisci le catene di controlli sui file con RewriteCond con una sola riga try_files; nginx verifica i percorsi elencati in ordine.
Ricorda che le righe add_header di nginx non vengono ereditate in un blocco che definisce un proprio add_header. Ripeti gli header di sicurezza in ogni location che imposta un header.
Usarli entrambi è comune: nginx in prima linea per TLS e file statici, che inoltra le richieste dinamiche ad Apache su una porta locale.
Domande frequenti
nginx è più veloce di Apache?
Dipende dal lavoro e dalla configurazione, quindi diffida di qualsiasi numero isolato. I worker di nginx basati su eventi sono pensati per mantenere molte connessioni inattive a basso costo. L'MPM event di Apache ha ridotto il divario usando anch'esso un polling thread-safe. Misura il tuo carico di lavoro prima di cambiare solo per la velocità.
nginx supporta i file .htaccess?
No. nginx non ha file di override per directory, quindi le regole di un .htaccess vanno spostate nella configurazione del server e poi serve un reload di nginx. È un compromesso voluto: nessuna ricerca di file a ogni richiesta, ma solo chi ha accesso alla config principale può cambiare le regole.
Posso convertire .htaccess in nginx automaticamente?
Redirect semplici e fallback si traducono senza problemi, come mostra il traduttore in questa pagina. Lunghe catene di RewriteCond con flag come [P] o variabili d'ambiente richiedono una persona che le legga, perché nginx esprime la stessa intenzione con elementi diversi.
Quale scelgo per un sito WordPress o PHP?
Se il tuo hosting ti dà solo accesso ai file, Apache con .htaccess è ciò che ti permette di cambiare le regole. Su un server che controlli, funzionano entrambi con PHP-FPM; in nginx scrivi una sola volta il fallback per gli URL puliti con try_files nel blocco server.
Come ricarico la config senza perdere connessioni?
Per nginx, esegui nginx -s reload: il master verifica la nuova config, avvia nuovi worker e chiede ai vecchi di terminare in modo ordinato. Per Apache, apachectl graceful fa l'equivalente per i suoi processi figli.
I modelli di processo in parole semplici
Apache delega la gestione delle connessioni a un Multi-Processing Module. prefork usa un processo per connessione e non ha bisogno di thread. worker esegue diversi processi con molti thread ciascuno. event si basa su worker e usa un polling thread-safe così le connessioni keep-alive inattive non occupano un thread. Sui sistemi Linux e BSD attuali event è scelto per impostazione predefinita.
nginx ha un processo master che legge la configurazione e gestisce i worker, e un piccolo numero di processi worker che gestiscono ciascuno molte connessioni tramite un event loop.
Perché .htaccess è importante
.htaccess permette a chi non ha accesso root di cambiare le regole per una directory, ed è per questo che gli hosting condivisi ci si appoggiano. Il prezzo è che a ogni richiesta Apache controlla ogni directory superiore alla ricerca del file, anche quando non ne esiste nessuno. Con AllowOverride None, che è il default, quei file vengono ignorati del tutto.
Lo stesso sito su entrambi i server
Virtual host Apache
File statici da una cartella più un fallback SPA, configurati nel vhost così non serve nessun .htaccess.
Blocco server nginx
Lo stesso comportamento: cartella root, fallback con try_files e una pagina di errore personalizzata.
Forzare HTTPS
Apache controlla il flag HTTPS; nginx usa un server separato sulla porta 80 che fa solo il redirect.
Mandare il dominio senza www su www
La documentazione di nginx consiglia un blocco server dedicato con return invece di un if sull'host.
Fallback per single-page app
Servi i file reali quando esistono e index.html per ogni altro percorso.
Reindirizzare una vecchia pagina
Redirect di mod_alias non richiede il motore di rewrite; nginx trova il percorso esatto con location =.
Pagina 404 personalizzata
Entrambi indirizzano l'errore verso una pagina dello stesso sito.
Proxy di /api verso un application server
Apache richiede mod_proxy e mod_proxy_http caricati, con slash finali coerenti in entrambi gli argomenti; in nginx il proxy è integrato.
Bloccare file nascosti come .git
Impedisce di servire i file il cui nome inizia con un punto.
Aggiungere un header di sicurezza
Con always, entrambi i server aggiungono l'header anche alle risposte di errore, non solo a quelle andate a buon fine.