Ricerca nel sito web

Come installare Nginx con host virtuali e certificato SSL


Nginx (abbreviazione di Engine-x) è un server HTTP e proxy inverso gratuito, open source, potente, ad alte prestazioni e scalabile, un proxy di posta e TCP/UDP standard server. È facile da usare e configurare, con un semplice linguaggio di configurazione. Nginx è ora il software server web preferito per alimentare siti molto caricati, grazie alla sua scalabilità e prestazioni.

In questo articolo verrà illustrato come utilizzare Nginx come server HTTP, configurarlo per servire contenuti Web e impostare host virtuali basati sul nome e creare e installare SSL per trasmissioni di dati sicure, incluso un certificato autofirmato su Ubuntu e CentOS .

Come installare il server Web Nginx

Per prima cosa inizia installando il pacchetto Nginx dai repository ufficiali utilizzando il tuo gestore pacchetti come mostrato.

------------ On Ubuntu ------------ 
sudo apt update 
sudo apt install nginx 

------------ On CentOS ------------
sudo yum update 
sudo yum install epel-release 
sudo yum install nginx 

Dopo aver installato il pacchetto Nginx, per ora è necessario avviare il servizio, abilitarlo all'avvio automatico all'avvio e visualizzarne lo stato, utilizzando i seguenti comandi. Tieni presente che su Ubuntu dovrebbe essere avviato e abilitato automaticamente mentre il pacchetto è preconfigurato.

sudo systemctl start nginx
sudo systemctl enable nginx
sudo systemctl status nginx

A questo punto il server web Nginx dovrebbe essere attivo e funzionante, è possibile verificarne lo stato con il comando netstat.

sudo netstat -tlpn | grep nginx

Se il tuo sistema ha un firewall abilitato, devi aprire le porte 80 e 443 per consentire il traffico HTTP e HTTPS rispettivamente, attraverso di esso, correndo.

------------ On CentOS ------------
sudo firewall-cmd --permanent --add-port=80/tcp
sudo firewall-cmd --permanent --add-port=443/tcp
sudo firewall-cmd --reload

------------ On Ubuntu ------------ 
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw reload 

Il metodo ideale per testare l'installazione di Nginx e verificare se è in esecuzione e in grado di servire pagine Web è aprire un browser Web e puntare all'IP del server.

http://Your-IP-Address
OR
http://Your-Domain.com

Un'installazione funzionante dovrebbe essere indicata dalla schermata seguente.

Come configurare il server Web Nginx

I file di configurazione di Nginx si trovano nella directory /etc/nginx e il file di configurazione globale si trova in /etc/nginx/nginx.conf sia su CentOS che su Ubuntu.

Nginx è composto da moduli controllati da varie opzioni di configurazione, note come direttive. Una direttiva può essere semplice (nella forma nome e valori che terminano con ;) o blocco (ha istruzioni aggiuntive racchiuse usando {}). E una direttiva di blocco che contiene altre direttive è chiamata contesto.

Tutte le direttive sono spiegate in modo esauriente nella documentazione di Nginx sul sito web del progetto. È possibile fare riferimento ad esso per ulteriori informazioni.

Come servire contenuto statico utilizzando Nginx in modalità standalone

A livello fondamentale, Nginx può essere utilizzato per servire contenuti statici come HTML e file multimediali, in modalità standalone, dove viene utilizzato solo il blocco server predefinito (analogo ad Apache dove non sono stati configurati host virtuali).

Inizieremo spiegando brevemente la struttura di configurazione nel file di configurazione principale.

 
sudo vim /etc/nginx/nginx.conf

Se guardi questo file di configurazione Nginx, la struttura di configurazione dovrebbe apparire come segue e questo viene definito contesto principale, che contiene molte altre direttive semplici e di blocco. Tutto il traffico web viene gestito nel contesto http.

user  nginx;
worker_processes  1;
.....

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;
.....

events {
       	.....
}

http {
	server{
		…….
	}
	.....
}

Quello che segue è un esempio di file di configurazione principale di Nginx (/etc/nginx/nginx.conf), in cui il blocco http sopra contiene una direttiva include che indica a Nginx dove trovare i file di configurazione del sito Web (configurazioni dell'host virtuale) .

user www-data;
worker_processes auto;
pid /run/nginx.pid;

events {
        worker_connections 768;
        # multi_accept on;
}

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

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

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

    sendfile        on;
    #tcp_nopush     on;
    keepalive_timeout  65;
    #gzip  on;
	
    include /etc/nginx/conf.d/*.conf;
}

Tieni presente che su Ubuntu troverai anche una direttiva include aggiuntiva (include /etc/nginx/sites-enabled/*;), dove la directory /etc /nginx/sites-enabled/ memorizza i collegamenti simbolici ai file di configurazione dei siti Web creati in /etc/nginx/sites-available/, per abilitare i siti. E l'eliminazione di un collegamento simbolico disabilita quel particolare sito.

In base alla fonte di installazione, troverai il file di configurazione del sito Web predefinito in /etc/nginx/conf.d/default.conf (se hai installato dal repository NGINX ufficiale e EPEL) o /etc/nginx/sites-enabled/default (se hai installato dai repository Ubuntu).

Questo è il nostro blocco server nginx predefinito di esempio situato in /etc/nginx/conf.d/default.conf sul sistema di test.

server {
    listen    80 default_server;
    listen    [::]:80 default_server;
    server_name    _;
    root           /var/www/html/;
    index          index.html;
    location / {
                try_files $uri $uri/ =404;
        }
}

Una breve spiegazione delle direttive nella configurazione di cui sopra:

  • ascolta: specifica la porta su cui il server è in ascolto.
  • nome_server: definisce il nome del server che può essere nomi esatti, nomi con caratteri jolly o espressioni regolari.
  • root: specifica la directory da cui Nginx servirà pagine web e altri documenti.
  • index: specifica il/i tipo/i di file indice da servire.
  • posizione: utilizzata per elaborare richieste per file e cartelle specifici.

Da un browser web, quando si punta al server utilizzando il nome host localhost o il suo indirizzo IP, elabora la richiesta e fornisce il file /var/www/html/index.html e salva immediatamente l'evento nel suo registro di accesso (/var/log/nginx/access.log) con una risposta 200 (OK). In caso di errore (evento non riuscito), registra il messaggio nel registro degli errori (/var/log/nginx/error.log).

Per ulteriori informazioni sull'accesso a Nginx, puoi fare riferimento a Come configurare l'accesso personalizzato o i formati di registro degli errori in Nginx.

Invece di utilizzare i file di registro predefiniti, è possibile definire file di registro personalizzati per diversi siti Web, come vedremo più avanti, nella sezione “configurazione di host virtuali basati sul nome (blocchi server)”.

Come limitare l'accesso a una pagina Web con Nginx

Per limitare l'accesso al tuo sito web/applicazione o ad alcune parti di esso, puoi impostare l'autenticazione HTTP di base. Questo può essere utilizzato essenzialmente per limitare l'accesso all'intero server HTTP, ai singoli blocchi di server o ai blocchi di posizione.

Inizia creando un file che memorizzerà le tue credenziali di accesso (nome utente/password) utilizzando l'utilità htpasswd.

 
yum install httpd-tools		#RHEL/CentOS
sudo apt install apache2-utils	#Debian/Ubuntu

Ad esempio, aggiungiamo l'utente admin a questo elenco (puoi aggiungere quanti più utenti possibile), dove l'opzione -c viene utilizzata per specificare il file della password e l'opzione -B per crittografare la password. Dopo aver premuto [Invio], ti verrà chiesto di inserire la password dell'utente:

sudo htpasswd -Bc /etc/nginx/conf.d/.htpasswd admin

Quindi, assegniamo le autorizzazioni e la proprietà appropriate al file della password (sostituisci l'utente e il gruppo nginx con www-data su Ubuntu).

sudo chmod 640 /etc/nginx/conf.d/.htpasswd
sudo chown nginx:nginx /etc/nginx/conf.d/.htpasswd

Come accennato in precedenza, puoi limitare l'accesso al tuo server web, a un singolo sito web (utilizzando il relativo blocco server) o a directory o file specifici. Per raggiungere questo obiettivo è possibile utilizzare due direttive utili:

  • auth_basic: attiva la convalida del nome utente e della password utilizzando il protocollo "Autenticazione di base HTTP".
  • auth_basic_user_file: specifica il file delle credenziali.

Ad esempio, mostreremo come proteggere con password la directory /var/www/html/protected.

server {
    listen         80 default_server;
    server_name    localhost;
    root           /var/www/html/;
    index          index.html;
    location / {
                try_files $uri $uri/ =404;
        }
     
    location /protected/ {
        auth_basic              "Restricted Access!";
        auth_basic_user_file    /etc/nginx/conf.d/.htpasswd;
    }
}

Ora salva le modifiche e riavvia il servizio Nginx.

sudo systemctl restart nginx 

La prossima volta che accederai con il browser alla suddetta directory (http://localhost/protected) ti verrà chiesto di inserire le tue credenziali di accesso (nome utente admin e la password scelta ).

Un accesso riuscito ti consente di accedere ai contenuti della directory, altrimenti riceverai un errore "401 Autorizzazione richiesta".

Come configurare host virtuali basati sul nome (blocchi server) in Nginx

Il contesto del server consente di archiviare e servire più domini/siti dalla stessa macchina fisica o server privato virtuale (VPS). È possibile dichiarare più blocchi server (che rappresentano host virtuali) nel contesto http per ciascun sito/dominio. Nginx decide quale server elabora una richiesta in base all'intestazione della richiesta che riceve.

Dimostreremo questo concetto utilizzando i seguenti domini fittizi, ciascuno situato nella directory specificata:

  • wearelinux-console.net – /var/www/html/wearelinux-console.net/
  • welovelinux.com – /var/www/html/welovelinux.com/

Successivamente, assegna le autorizzazioni appropriate sulla directory per ciascun sito.

sudo chmod -R 755 /var/www/html/wearelinux-console.net/public_html 
sudo chmod -R 755 /var/www/html/welovelinux.com/public_html 

Ora crea un file index.html di esempio all'interno di ciascuna directory public_html.

<html>
	<head>
		<title>www.wearelinux-console.net</title>
	</head>
<body>
	<h1>This is the index page of www.wearelinux-console.net</h1>
</body>
</html>

Successivamente, crea i file di configurazione del blocco server per ciascun sito all'interno della directory /etc/httpd/conf.d.

sudo vi /etc/nginx/conf.d/wearelinux-console.net.conf
sudo vi /etc/nginx/conf.d/welovelinux.com.conf

Aggiungi la seguente dichiarazione di blocco del server nel file wearelinux-console.net.conf.

server {
    listen         80;
    server_name  wearelinux-console.net;
    root           /var/www/html/wearelinux-console.net/public_html ;
    index          index.html;
    location / {
                try_files $uri $uri/ =404;
        }
     
}

Successivamente, aggiungi la seguente dichiarazione di blocco del server nel file welovelinux.com.conf.

server {
    listen         80;
    server_name    welovelinux.com;
    root           /var/www/html/welovelinux.com/public_html;
    index          index.html;
    location / {
                try_files $uri $uri/ =404;
        }
     
}

Per applicare le modifiche recenti, riavviare il server Web Nginx.

sudo systemctl restart nginx

e puntando il tuo server web agli indirizzi sopra indicati dovresti farti vedere le pagine principali dei domini fittizi.

http://wearelinux-console.net
http://welovelinux.com

Importante: se hai SELinux abilitato, la sua configurazione predefinita non consente a Nginx di accedere ai file al di fuori di posizioni autorizzate note (come /etc/nginx per le configurazioni, /var/log/nginx per i log, /var/www/html per i file web ecc..) .

Puoi gestire questo disabilitando SELinux o impostando il contesto di sicurezza corretto. Per maggiori informazioni, fare riferimento a questa guida: utilizzo di Nginx e Nginx Plus con SELinux sul sito Web di Nginx Plus.

Come installare e configurare SSL con Nginx

I certificati SSL aiutano ad abilitare un http sicuro (HTTPS) sul tuo sito, che è essenziale per stabilire una connessione affidabile/sicura tra gli utenti finali e il tuo server crittografando le informazioni che viene trasmesso a, da o all'interno del tuo sito.

Tratteremo come creare e installare un certificato autofirmato e generare una richiesta di firma del certificato (CSR) per acquisire un certificato SSL da un'autorità di certificazione (CA), da utilizzare con Nginx.

I certificati autofirmati possono essere creati gratuitamente e sono praticamente utilizzabili a scopo di test e per servizi solo LAN interni. Per i server rivolti al pubblico, si consiglia vivamente di utilizzare un certificato emesso da una CA (ad esempio Let's Encrypt) per garantirne l'autenticità.

Per creare un certificato autofirmato, crea prima una directory in cui verranno archiviati i tuoi certificati.

sudo mkdir /etc/nginx/ssl-certs/

Quindi genera il certificato autofirmato e la chiave utilizzando lo strumento da riga di comando openssl.

sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/nginx/ssl-certs/nginx.key -out /etc/nginx/ssl-certs/nginx.crt

Descriviamo brevemente le opzioni utilizzate nel comando precedente:

  • req -X509: mostra che stiamo creando un certificato x509.
  • -nodes (NO DES) – significa “non crittografare la chiave”.
  • -days 365: specifica il numero di giorni per cui sarà valido il certificato.
  • -newkey rsa:2048 – specifica che la chiave generata utilizzando l'algoritmo RSA dovrebbe essere a 2048 bit.
  • -keyout /etc/nginx/ssl-certs/nginx.key – specifica il percorso completo della chiave RSA.
  • -out /etc/nginx/ssl-certs/nginx.crt – specifica il percorso completo del certificato.

Successivamente, apri il file di configurazione dell'host virtuale e aggiungi le seguenti righe a una dichiarazione di blocco del server in ascolto sulla porta 443. Effettueremo un test con il file host virtuale /etc/nginx/conf.d/wearelinux-console.net.conf.

sudo vi /etc/nginx/conf.d/wearelinux-console.net.conf

Quindi aggiungi la direttiva SSL al file di configurazione nginx, dovrebbe essere simile a quello riportato di seguito.

server {
    listen 80;
    listen [::]:80;
    listen 443 ssl;
    listen [::]:443 ssl;
    
    ssl on;
    ssl_certificate /etc/nginx/ssl-certs/nginx.crt;
    ssl_trusted_certificate /etc/nginx/ssl-certs/nginx.crt;
    ssl_certificate_key /etc/nginx/ssl-certs/nginx.key;
    
    server_name  wearelinux-console.net;
    root           /var/www/html/wearelinux-console.net/public_html;
    index          index.html;
    location / {
                try_files $uri $uri/ =404;
        }

}

Ora riavvia Nginx e punta il browser al seguente indirizzo.

https://www.wearelinux-console.net

Se desideri acquistare un certificato SSL da una CA, devi generare una richiesta di firma del certificato (CSR) come mostrato.

sudo openssl req -newkey rsa:2048 -nodes -keyout /etc/nginx/ssl-certs/example.com.key -out /etc/nginx/ssl-certs/example.com.csr

Puoi anche creare una CSR da una chiave privata esistente.

sudo openssl req -key /etc/nginx/ssl-certs/example.com.key -new -out /etc/nginx/ssl-certs/example.com.csr

Successivamente, devi inviare il CSR generato a una CA per richiedere l'emissione di un certificato SSL firmato dalla CA. Una volta ricevuto il certificato dalla CA, puoi configurarlo come mostrato sopra.

Leggi anche: La guida definitiva per proteggere, rafforzare e migliorare le prestazioni del server Web Nginx

Riepilogo

In questo articolo abbiamo spiegato come installare e configurare Nginx; ha spiegato come configurare l'hosting virtuale basato sul nome con SSL per proteggere le trasmissioni di dati tra il server Web e un client.

Se hai riscontrato qualche intoppo durante il processo di installazione/configurazione di nginx o hai domande o commenti, utilizza il modulo di feedback qui sotto per contattarci.