INTRODUZIONE
nginx (pronunciato come “engine-x”) è un server leggero ad alte prestazioni, con licenza BSD che grazie alle sue caratteristiche si sta diffondendo in sostituzione o affiancamento di altri server “storici” come Apache.
Nginx può funzionare sia come puro server web, ma anche come proxy per i protocolli HTTP,IMAP,POP3 anche con supporto SSL; ha plugin per caching, fastcgi, bilanciamento del carico, video streaming, compressione, WebDAV.
I suoi punti di forza sono la snellezza e architettura asincrona (in contrasto con il modello “fork” di Apache) che gli permettono di gestire oltre 10000 connessioni simultanee ed è per questo che viene sempre più scelto come soluzione per chi desidera velocità e scalabilità in condizioni di traffico elevato.
In origine nginx è stato sviluppato tra il 2002 e il 2004 per un portale russo, per il quale già nel 2008 serviva oltre 500 milioni di richieste al giorno; dal 2011 Igor Sysoev e Gus Robertson sono a capo di nginx.com, una azienda multimilionaria che si occupa di sviluppare e supportare il software. Nginx è il secondo web server più diffuso al mondo ed è utilizzato da grandi e famose realtà come Netflix, Hulu, Pinterest, GitHub, WordPress.com, SoundCloud, Airbnb, Dropbox.
INSTALLAZIONE
Grazie a Vagrant, facciamo partire la nostra macchine virtuale di test Centos 7
andrea@box:~/projects/nginx$ vagrant init centos7 A `Vagrantfile` has been placed in this directory. You are now ready to `vagrant up` your first virtual environment! Please read the comments in the Vagrantfile as well as documentation on `vagrantup.com` for more information on using Vagrant. andrea@box:~/projects/nginx$ vagrant up Bringing machine 'default' up with 'virtualbox' provider... [...omissis...] andrea@box:~/projects/nginx$ vagrant ssh Welcome to your Vagrant-built virtual machine. [vagrant@localhost ~]$ |
aggiungiamo il repository EPEL e installiamo il pacchetto:
[vagrant@localhost ~]$ sudo yum install epel-release [vagrant@localhost ~]$ sudo yum -y install nginx |
facciamo partire l’unità systemd, abilitandola anche al boot e configuriamo l’eventuale firewall:
[vagrant@localhost ~]$ sudo systemctl start nginx.service [vagrant@localhost ~]$ sudo systemctl enable nginx.service [vagrant@localhost ~]$ sudo firewall-cmd --permanent --zone=public --add-service=http [vagrant@localhost ~]$ sudo firewall-cmd --permanent --zone=public --add-service=https [vagrant@localhost ~]$ sudo firewall-cmd --reload |
il servizio è attivo, non ci resta che dire a Vagrant di inoltrare il traffico diretto alla porta 8080 del nostro pc verso la 80 della macchina virtuale; per far questo basta aprire Vagrantfile e scommentare la riga
config.vm.network "forwarded_port", guest: 80, host: 8080
dopodichè dare un
andrea@box:~/projects/nginx$ vagrant reload |
puntando ora il browser a http://localhost:8080 dovremmo vedere questa schermata:
CONFIGURAZIONE
la configurazione principale si trova in /etc/nginx/nginx.conf ; notiamo che il default fornito dal pacchetto è molto articolato ma per imparare i concetti base partiremo con una versione molto più semplice…
La struttura del file di configurazione si basa sui contesti, rappresentati da sezioni racchiuse tra parentesi graffe. Avremo quindi il main context fuori da qualsiasi parentesi , e un http context, che racchiuderà uno o più server context, magari nel caso di virtualhost o web server in ascolto su socket diversi. Tenendo conto di questo principio gerarchico, uno scheletro base può essere il seguente:
# main context # direttive globali http { # qui siamo nel contesto http # server { # direttive primo server context } server { # direttive secondo server context } }
altri esempi di contesto di primo livello sono: mail (nginx può fare anche da proxy IMAP/POP3) oppure “events” (che vedremo in seguito), mentre all’interno del contesto server tipicamente avremo dei contesti location. Alcuni contesti, come include possono essere usati in qualsiasi livello della gerarchia, mentre altri hanno una posizione ben specifica, perciò sarà necessario consultare la documentazione.
Alla luce di questo, possiamo già stendere una prima configurazione semplice ma funzionante:
user nginx; error_log /var/log/nginx/error.log; pid /run/nginx.pid; events { worker_connections 512; } http { index index.html; server { listen 80; location /prova { root /data/www; } } }
ricordando che ogni direttiva va terminata con un “;” , vediamo che nelle prime tre righe settiamo l’utenza con cui gira il servizio, il file dove verranno scritti gli errori e il process ID del demone.
Troviamo poi il contesto events, che è obbligatorio e nel quale vanno inserite tutte le direttive che controllano le connessioni. Nel nostro caso, impostiamo che ciascun processo potrà gestire al massimo 512 connessioni simultanee. Come vedremo in seguito, questa sezione è fondamentale per fare del tuning sulle prestazioni.
Successivamente, dentro il contesto http, abbiamo la direttiva index che configura la pagina di default, quella che viene mostrata in caso non venga richiesta nessuna pagina. Nel contesto server, ho inserito la direttiva per la porta TCP su cui il server HTTP rimane in ascolto e quindi aperto un nuovo contesto location: in questo caso quando un browser manderà una richiesta GET a http://localhost/prova nginx risponderà con il corrispondente file nella directory /data/www del filesystem.
Per applicare la nuova nginx.conf sarà sufficiente un comando
# nginx -s reload |
quando riceve questo segnale, il demone anzitutto controlla la sintassi della configurazione, e se valida, la applica alle nuove richieste in arrivo; altrimenti continua ad usare la precedente senza nessun impatto sul servizio.
Per ora la nostra introduzione si conclude qui; nella prossima parte approfondiremo la configurazione con esempi più complessi e l’utilizzo di plugin.