Un'introduzione a NGINX per sviluppatori

Immagina: hai creato un'applicazione web e ora stai cercando il server web giusto per ospitarla.

L'applicazione potrebbe essere composta da più file statici: HTML, CSS e JavaScript, un servizio API back-end o persino più servizi Web. L'uso di Nginx potrebbe essere quello che stai cercando e ci sono un paio di ragioni per questo.

NGINX è un potente server Web e utilizza un'architettura non threaded, guidata dagli eventi, che gli consente di superare le prestazioni di Apache se configurato correttamente. Può anche fare altre cose importanti, come il bilanciamento del carico, la memorizzazione nella cache HTTP o essere utilizzato come proxy inverso.

Architettura NGINX

In questo articolo, illustrerò alcuni passaggi di base su come installare e configurare le parti più comuni di NGINX.

Installazione di base - Architettura

Esistono due modi per installare NGINX, usando un binario pre-costruito o costruendolo dal sorgente.

Il primo metodo è molto più semplice e veloce, ma la sua creazione dal sorgente offre la possibilità di includere vari moduli di terze parti che rendono NGINX ancora più potente. Ci consente di personalizzarlo per adattarlo alle esigenze dell'applicazione.

Per installare un pacchetto Debian precompilato, l'unica cosa che devi fare è:

sudo apt-get update
sudo apt-get install nginx

Al termine del processo di installazione, è possibile verificare che tutto sia OK eseguendo il comando seguente, che dovrebbe stampare l'ultima versione di NGINX.

sudo nginx -v
versione nginx: nginx / 1.6.2

Il tuo nuovo server web verrà installato nella posizione / etc / nginx /. Se vai in questa cartella, vedrai diversi file e cartelle. I più importanti che richiederanno la nostra attenzione in un secondo momento sono il file nginx.conf e i siti di cartelle disponibili.

Impostazioni di configurazione

Le impostazioni principali di NGINX sono nel file nginx.conf, che per impostazione predefinita è simile al seguente.

dati www dell'utente;
worker_processes 4;
pid /run/nginx.pid;

eventi {
worker_connections 768;
# multi_accept on;
}

http {

file di trasmissione attivo;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
# server_tokens off;

# server_names_hash_bucket_size 64;
# server_name_in_redirect disattivato;

include /etc/nginx/mime.types;
default_type application / octet-stream;

access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;

gzip on;
gzip_disable "msie6";

# gzip_vary on;
# gzip_proxied any;
# gzip_comp_level 6;
# gzip_buffers 16 8k;
# gzip_http_version 1.1;
# gzip_types text / plain text / css application / json application / x-javascript text / xml application / xml application / xml + rss text / javascript;

include /etc/nginx/conf.d/*.conf;
include / etc / nginx / siti-enabled / *;
}

Il file è strutturato in contesti. Il primo è il contesto degli eventi e il secondo è il contesto http. Questa struttura consente alcuni livelli avanzati di configurazione poiché ogni contesto può avere altri contesti nidificati che ereditano tutto dai loro genitori ma possono anche sostituire un'impostazione secondo necessità.

Varie cose in questo file possono essere modificate in base alle tue esigenze, ma NGINX è così semplice da usare che puoi andare d'accordo anche con le impostazioni predefinite. Alcuni dei pezzi più importanti del file di configurazione NGINX sono:

  • worker_processes: questa impostazione definisce il numero di processi di lavoro che NGINX utilizzerà. Poiché NGINX è a thread singolo, questo numero dovrebbe in genere essere uguale al numero di core della CPU.
  • worker_connections: questo è il numero massimo di connessioni simultanee per ciascun processo di lavoro e indica ai nostri processi di lavoro quante persone possono essere contemporaneamente servite da NGINX. Più è grande, più utenti simultanei saranno in grado di servire NGINX.
  • access_log & error_log: questi sono i file che NGINX utilizzerà per registrare eventuali errori e tentativi di accesso. Questi registri vengono generalmente esaminati per il debug e la risoluzione dei problemi.
  • gzip: queste sono le impostazioni per la compressione GZIP delle risposte NGINX. Abilitando questo insieme alle varie impostazioni secondarie che per impostazione predefinita vengono commentate, si otterrà un aggiornamento delle prestazioni piuttosto grande. Dalle impostazioni secondarie di GZIP, è necessario prestare attenzione a gzip_comp_level, che è il livello di compressione e va da 1 a 10. In generale, questo valore non dovrebbe essere superiore a 6 - il guadagno in termini di riduzione delle dimensioni è insignificante, poiché ha bisogno di molto più utilizzo della CPU. gzip_types è un elenco di tipi di risposta su cui verrà applicata la compressione.

La tua installazione NGINX può supportare molto più di un singolo sito Web e i file che definiscono i siti del tuo server vivono nella directory / etc / nginx / sites-available.

Tuttavia, i file in questa directory non sono "live" - ​​puoi avere tutti i file di definizione del sito qui che vuoi, ma NGINX non farà effettivamente nulla con loro a meno che non siano collegati in / etc / nginx / directory abilitata per i siti (puoi anche copiarli lì, ma il collegamento simbolico assicura che ci sia una sola copia di ciascun file di cui tenere traccia).

Questo ti dà un metodo per mettere rapidamente online i siti Web e portarli offline senza dover effettivamente eliminare alcun file: quando sei pronto per un sito per andare online, collegalo a siti abilitati per i siti e riavvia NGINX.

La directory disponibile per i siti include configurazioni per host virtuali. Ciò consente al server Web di essere configurato per più siti con configurazioni separate. I siti all'interno di questa directory non sono attivi e sono abilitati solo se creiamo un collegamento simbolico nella cartella abilitata per i siti.

Crea un nuovo file per la tua applicazione o modifica quello predefinito. Una configurazione tipica è simile alla seguente.

upstream remoteApplicationServer {
    server 10.10.10.10;
}

upstream remoteAPIServer {
    server 20.20.20.20;
    server 20.20.20.21;
    server 20.20.20.22;
    server 20.20.20.23;
}


server {
    ascolta 80;
    nome_server www.customapp.com customapp.com
    root / var / www / html;
    index index.html

        Posizione / {
            alias / var / www / html / customapp /;
            try_files $ uri $ uri / = 404;
        }

        location / remoteapp {
            proxy_set_header Host $ host: $ server_port;
            proxy_set_header X-Real-IP $ remote_addr;
            proxy_set_header X-Forwarded-For $ proxy_add_x_forwarded_for;
            proxy_pass http: // remoteAPIServer /;
        }

        location / api / v1 / {
            proxy_pass https: // remoteAPIServer / api / v1 /;
            proxy_http_version 1.1;
            proxy_set_header Aggiorna $ http_upgrade;
            proxy_set_header Connessione 'upgrade';
            proxy_set_header Host $ host;
            proxy_cache_bypass $ http_upgrade;
            proxy_redirect http: // https: //;
        }
}

Proprio come il nginx.conf, anche questo usa il concetto di contesti nidificati (e tutti questi sono anche nidificati nel contesto HTTP di nginx.conf, quindi ereditano anche tutto da esso).

Il contesto del server definisce un server virtuale specifico per gestire le richieste dei tuoi clienti. Puoi avere più blocchi di server e NGINX sceglierà tra loro in base alle direttive di ascolto e nome_server.

All'interno di un blocco server, definiamo più contesti di posizione che vengono utilizzati per decidere come gestire le richieste del client. Ogni volta che arriva una richiesta, NGINX proverà a far corrispondere il proprio URI a una di quelle definizioni di posizione e a gestirlo di conseguenza.

Esistono molte direttive importanti che possono essere utilizzate nel contesto dell'ubicazione, come:

  • try_files proverà a servire un file statico trovato nella cartella che punta alla direttiva root.
  • proxy_pass invierà la richiesta a un server proxy specificato.
  • rewrite riscriverà l'URI in arrivo in base a un'espressione regolare in modo che un altro blocco di posizione sia in grado di gestirlo.

Il contesto upstream definisce un pool di server a cui NGINX eseguirà il proxy delle richieste. Dopo aver creato un blocco upstream e definito un server al suo interno, possiamo quindi fare riferimento a esso per nome all'interno dei nostri blocchi di posizione. Inoltre, un contesto upstream può avere molti server assegnati al suo interno in modo che NGINX esegua un certo bilanciamento del carico durante il proxy delle richieste.

Avvia NGINX

Dopo aver finito con la configurazione e spostato la nostra applicazione Web nella cartella appropriata, possiamo avviare NGINX usando il comando seguente:

sudo service nginx start

Dopodiché, ogni volta che cambiamo qualcosa sulla nostra configurazione, dobbiamo solo ricaricarlo (senza tempi di inattività) usando il comando qui sotto.

service nginx ricaricare

Infine, possiamo verificare lo stato di NGINX usando il comando seguente.

stato del servizio nginx

Conclusione

Con così tante funzioni pronte all'uso, NGINX può essere un ottimo modo per servire la tua applicazione o persino essere usato come proxy HTTP o bilanciamento del carico per gli altri tuoi server web. Comprendere il modo in cui NGINX funziona e gestisce le richieste darà molta potenza al ridimensionamento e al bilanciamento del carico delle applicazioni.