Nginx (pronunciato "engine-x") è un server web leggero e ad alte prestazioni, nonché un server proxy inverso. È stato originariamente creato come soluzione al problema C10K (gestire 10.000 connessioni simultanee) e da allora è diventato uno dei server web più popolari al mondo. Nginx è progettato per servire contenuti statici in modo rapido ed efficiente ed è ampiamente utilizzato come proxy inverso, bilanciatore di carico e cache HTTP.
Apache: Apache HTTP Server, comunemente conosciuto come Apache, è il software per server web più utilizzato al mondo. È stato sviluppato dalla Apache Software Foundation ed è in uso dal 1995. Apache è noto per la sua flessibilità, l'ampia gamma di funzionalità e il forte supporto della comunità. Supporta la generazione di contenuti dinamici tramite moduli come PHP, Python e altri, rendendolo una scelta ideale per molti tipi di applicazioni web.
Installazione di Nginx e Apache
Installazione di Nginx: Su sistemi basati su Ubuntu o Debian, puoi installare Nginx utilizzando i seguenti comandi:
sudo apt update
sudo apt install nginx
Su sistemi basati su CentOS o RHEL:
sudo yum install epel-release
sudo yum install nginx
Dopo l'installazione, puoi avviare e abilitare Nginx con:
sudo systemctl start nginx
sudo systemctl enable nginx
Installazione di Apache: Su sistemi basati su Ubuntu o Debian:
sudo apt update
sudo apt install apache2
Su sistemi basati su CentOS o RHEL:
sudo yum install httpd
Una volta installato, avvia e abilita Apache con:
sudo systemctl start apache2 # Per Ubuntu/Debian
sudo systemctl enable apache2
sudo systemctl start httpd # Per CentOS/RHEL
sudo systemctl enable httpd
Configurazione di base di Nginx
File di configurazione: Il file di configurazione di Nginx si trova solitamente in /etc/nginx/nginx.conf. Qui vengono effettuate la maggior parte delle impostazioni globali del server. La configurazione è gerarchica e ogni blocco (server, location) ha il proprio contesto specifico.
Host virtuali in Nginx: Nginx non utilizza la direttiva VirtualHost come Apache, ma usa i blocchi server per definire ogni host virtuale. Una configurazione di base per un host virtuale in Nginx potrebbe essere la seguente:
server {
listen 80;
server_name example.com;
root /var/www/example.com/html;
index index.html;
location / {
try_files $uri $uri/ =404;
}
}
Questa configurazione ascolta le richieste HTTP sulla porta 80 per il dominio example.com, serve i contenuti da /var/www/example.com/html e definisce il file index da servire come index.html.
Direttive comuni:
- listen: Specifica l'indirizzo IP e la porta su cui il server deve ascoltare.
- server_name: Definisce il dominio o l'indirizzo IP a cui il server deve rispondere.
- root: Definisce la directory principale in cui sono archiviati i contenuti.
- index: Specifica il file predefinito da servire quando si accede a una directory.
Configurazione di base di Apache
File di configurazione: Il file di configurazione principale di Apache si trova in /etc/httpd/httpd.conf o /etc/apache2/apache2.conf, a seconda della distribuzione. Inoltre, le configurazioni degli host virtuali sono spesso memorizzate in /etc/apache2/sites-available/.
Host virtuali in Apache: Apache utilizza la direttiva VirtualHost per configurare più siti web sullo stesso server. Ecco un esempio:
<VirtualHost *:80>
ServerAdmin webmaster@example.com
DocumentRoot /var/www/example.com/html
ServerName example.com
<Directory /var/www/example.com/html>
AllowOverride All
Require all granted
</Directory>
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
Questa configurazione ascolta sulla porta 80 per le richieste a example.com, serve i file da /var/www/example.com/html e fornisce le configurazioni per i log degli errori e gli accessi.
Direttive comuni:
- DocumentRoot: Specifica la directory in cui sono localizzati i file del sito web.
- ServerName: Definisce il nome del dominio o l'indirizzo IP a cui risponde l'host virtuale.
- ErrorLog: Specifica la posizione del log degli errori.
- CustomLog: Specifica la posizione del log degli accessi.
Ottimizzazione di Nginx
Regolazione dei processi worker: Nginx è progettato per essere altamente efficiente nel gestire molte connessioni simultanee. Puoi ottimizzarlo configurando il numero di processi worker:
worker_processes auto;
worker_connections 1024;
La direttiva worker_processes determina il numero di processi worker che Nginx utilizza, mentre worker_connections imposta il numero massimo di connessioni simultanee che ogni worker può gestire. Puoi regolare questi valori in base alla CPU e alla memoria del tuo server.
Compressione Gzip: Abilitare la compressione Gzip riduce la dimensione dei contenuti inviati ai client, accelerando i tempi di caricamento delle pagine. In Nginx, puoi farlo aggiungendo quanto segue al blocco http:
gzip on;
gzip_types text/plain text/css application/javascript;
gzip_comp_level 6;
Caching: Nginx fornisce meccanismi di caching che possono ridurre il carico sul server memorizzando i contenuti richiesti frequentemente. Ecco un esempio di configurazione semplice per la cache:
location / {
proxy_cache my_cache;
proxy_cache_valid 200 1h;
proxy_cache_use_stale error timeout updating;
}
Ottimizzazione di Apache
Regolazione del modulo MPM (Multi-Processing Module): Apache utilizza diversi MPM per gestire le richieste in entrata. Per una prestazione ottimale, è importante scegliere il MPM giusto e configurarlo. I due MPM più comunemente usati sono mpm_event e mpm_worker.
Ad esempio, con il modulo mpm_event:
<IfModule mpm_event_module>
StartServers 2
MinSpareThreads 25
MaxSpareThreads 75
ThreadLimit 64
ThreadsPerChild 25
MaxRequestWorkers 150
MaxConnectionsPerChild 0
</IfModule>
Abilitare la compressione Gzip: Proprio come in Nginx, puoi abilitare la compressione Gzip in Apache aggiungendo quanto segue alla configurazione:
<IfModule mod_deflate.c>
AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css application/x-javascript application/javascript
</IfModule>
Caching: Apache può memorizzare nella cache i contenuti utilizzando moduli come mod_cache e mod_cache_disk. Ecco un esempio di abilitazione del caching su disco:
<IfModule mod_cache.c>
CacheRoot /var/cache/apache2/mod_cache
CacheEnable disk /
</IfModule>
Pratiche di sicurezza per Nginx
- Limitare la dimensione della richiesta: Impedisce che richieste troppo grandi sovraccarichino il server limitando la dimensione della richiesta.
client_max_body_size 10M;
-
Disabilitare moduli non utilizzati: Disabilita i moduli che non ti servono per ridurre la superficie di attacco.
-
Configurazione SSL: Servi sempre il tuo sito tramite HTTPS. Usa configurazioni SSL robuste e certificati Let's Encrypt.
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers 'TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:...';
Pratiche di sicurezza per Apache
- Disabilitare la visualizzazione delle directory: Impedisce agli utenti di visualizzare l'elenco delle directory.
Options -Indexes
-
Disabilitare moduli non utilizzati: Apache viene fornito con molti moduli che potrebbero non essere necessari. Disabilita quelli non utilizzati per ridurre le vulnerabilità.
-
Configurazione SSL: Come per Nginx, assicurati che SSL sia configurato correttamente:
SSLEngine on
SSLCertificateFile /etc/ssl/certs/example.com.crt
SSLCertificateKeyFile /etc/ssl/private/example.com.key
Confronto tra Nginx e Apache
-
Prestazioni: Nginx tende a funzionare meglio in scenari con contenuti statici pesanti grazie alla sua architettura basata su eventi. Apache, tuttavia, è spesso preferito per contenuti dinamici, specialmente con PHP o altri moduli.
-
Configurazione: Nginx ha una configurazione più concisa e meno complessa, mentre Apache è più flessibile e ha un ecosistema di moduli più ampio.
-
Utilizzo delle risorse: Nginx è generalmente più efficiente in termini di utilizzo della memoria e della CPU, soprattutto sotto carico pesante.
-
Supporto della comunità: Sia Nginx che Apache hanno un forte supporto della comunità, ma Apache ha una storia più lunga.
Nginx e Apache sono entrambi server web potenti e ampiamente utilizzati, ciascuno con i suoi punti di forza e le sue opzioni di configurazione. Configurando e ottimizzando correttamente il tuo server, puoi ottenere prestazioni ottimali e sicurezza. Scegli Nginx se hai bisogno di alte prestazioni con un basso consumo di risorse, soprattutto per contenuti statici e proxy inverso. Scegli Apache se hai bisogno di flessibilità, un ecosistema robusto di moduli e ampio supporto per contenuti dinamici. Una configurazione e ottimizzazione adeguate del server sono essenziali per garantire che i tuoi siti web funzionino in modo efficiente e sicuro. Che tu stia gestendo un piccolo blog o una applicazione aziendale ad alto traffico, Nginx e Apache offrono gli strumenti necessari per soddisfare le tue esigenze di server web.