nginx

Bad gateway potrebbe dirvi il vostro browser. E potrebbe essere tradotto come “strada sbagliata”, dove con strada intende il percorso che porta alla risorsa (pensiamo ad una pagina web) richiesta. Se alle spalle di questo messaggio c’è nginx, allora il post fa per voi.

nginx (scritto con minuscolo anche ad inizio della frase) è un programma che fa funzionare i server, e smista appunto le richieste che arrivano ad un server (inteso come PC) e le indirizza ai server virtuali (intesi come servizi che il PC può dare in contemporanea).

 

Ad esempio in un server possono convivere due siti web differenti: ma se digito pizza_margherita.it non mi si può presentare il contenuto della pagina di pizza_capricciosa.it!

Come sceglie nginx quale informazioni restituire a fronte di una richiesta al server? (questa, ripetuta, è la domanda a cui vorremmo dare risposta). nginx legge quello che c’è scritto nei file di configurazione (tipicamente un file definito in/etc/nginx/sites-available/nome_che_vuoi poi linkato a /etc/nginx/sites-enable/nome_che_vuoi , che estende il file/etc/nginx/nginx.conf), in particolare nel blocco che inizia con “server”.

server {
listen 80;
server_name pizza_capricciosa.it;
location / {
proxy_pass http://localhost:8000;
}
}

Ad una istanza (richiesta di dati) nginx va a leggere in tutti i blocchi che sono definiti nei propri files di configurazione, quelli che sono compatibili, partendo con il confronto fra quelle scritto nella variabile location ed IP da cui arriva la richiesta e porta.

Se lo avete appena installato e vi presenta una pagina di benvenuto è perché va a leggere le informazioni di default, che si trovano nel file /usr/share/nginx/html/index.html e sono:

!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
body {
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
}
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

 

Ritornando al blocco server, nell’esempio di codice riportato precedentemente, la listen directive (cioè il valore dato alla variabile listen) è 80. Si tratta di una porta tipica per i servizi web. E se non fosse presente una linea listen (la listen directive), allora nginx la intenderebbe compilata, per default, così “listen 0.0.0.0:80”. Riassumendo, l’impostazione data alla variabile listen definisce a che indirizzo IP e a porta il server virtuale risponderà. Non stupisce che nginx compili con 0.0.0.0, dato che 0.0.0.0 significa tutti gli indirizzi IPv4 della macchina locale.

Come può essere compilata la linea listen delle impostazioni?

Con:

  • un indirizzo IP
  • il numero di una porta
  • indirizzo IP e il numero di una porta
  • un socket unix (cioè un servizio interno allo stesso PC/server)

Una parola sul unix socket, che sta per socket di dominio locale o socket locale, ed è un canale di comunicazione interprocesso con funzionamento analogo a una connessione di rete, ma basato sulla condivisione di dati nel file system.

La linea listen può contenere anche la specifica default_server, ma deve essere solo un blocco (altrimenti se fossero due, quale sarebbe quello di default?).

 

Vediamo allora, fatte queste premesse, come processa una richiesta nginx?

Segue queste regole:

  1. dapprima completa tutti i valori (inserendone di default se non ci sono)
    1. esempio:
      1. Un file di configurazione in cui in block non appaia alcun valore per linsten, in blocco senza ascoltare direttiva utilizza il valore 0.0.0.0:80.
      2. Un blocco impostato un indirizzo IP 111.111.111.111 con nessuna porta diventa 111.111.111.111:80
      3. Un blocco impostato su porta 8888 con nessun indirizzo IP diventa 0.0.0.0:8888
    2. Nginx poi tenta di raccogliere un elenco dei blocchi di server che corrispondono alla richiesta più specificamente in base all’indirizzo IP e la porta. Ciò significa che qualsiasi blocco che è funzionalmente utilizza 0.0.0.0 come indirizzo IP (per adattarsi a qualsiasi interfaccia), non saranno selezionate se ci sono corrispondenti blocchi che elencano un indirizzo IP specifico. In ogni caso, la porta deve corrispondere esattamente.
    3. Se esiste una sola corrispondenza più, tale blocco server verrà utilizzato per soddisfare la richiesta. Se ci sono più blocchi di server con lo stesso livello di corrispondenza specificità, Nginx poi comincia a valutare la direttiva nome_server di ogni blocco del server.
  2. infine ricorre alla specifica default_server, se tutti gli altri criteri non permettono di priorizzare.

 

Se volete controllare se vi sono errori formale, provate lanciando il comando

sudo nginx -t

 

 

Questo articolo è una traduzione di contenuti quali:

how-to-set-up-nginx-server

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *