introduzione
Nginx è un software server web open source progettato con alta concorrenza in mente, che può essere utilizzato come server HTTP / HTTPS, server proxy inverso, server proxy di posta, bilanciamento del carico software, terminatore TLS, server di cache e altro ancora!
È un software estremamente modulare. Anche alcune delle parti apparentemente "integrate" del software, come GZIP o SSL, sono in realtà create come moduli che possono essere abilitati e disabilitati durante il tempo di compilazione.
Ha moduli core (nativi) e moduli di terze parti (esterni) creati dalla community. Al momento, ci sono oltre un centinaio di moduli di terze parti che possiamo utilizzare.
Scritto in C, è un software veloce e leggero.
L'installazione di Nginx dal codice sorgente è relativamente semplice: scarica l'ultima versione del codice sorgente Nginx, configuralo, crearlo e installarlo.
Dovrai scegliere se scaricare la linea principale o una versione stabile, ma costruirle è la stessa.
In questa guida, compileremo una versione mainline di Nginx su Debian 10 (buster). Useremo tutti i moduli disponibili nella versione open source di Nginx.
Perché compilare e installare Nginx dal sorgente
Probabilmente ti chiedi perché si dovrebbe compilare Nginx da una fonte quando è possibile usare pacchetti preparati. Ecco alcuni motivi per cui potresti voler compilare tu stesso un software specifico:
- Per controllare le opzioni di configurazione.
- Per installare il software ovunque tu voglia. Puoi persino installare diverse versioni dello stesso software.
- Per controllare la versione che si installa. Le distribuzioni non sono sempre aggiornate con le ultime versioni di tutti i pacchetti, in particolare i componenti aggiuntivi dei pacchetti software.
- Per capire meglio come funziona il software.
Versione stabile vs. mainline
Nginx Open Source è disponibile in due versioni:
- Mainline - Include le ultime funzionalità e correzioni di bug ed è sempre aggiornato. È affidabile, ma può includere alcuni moduli sperimentali e può anche avere un numero di nuovi bug.
- Stabile: non include tutte le funzionalità più recenti, ma presenta correzioni di bug critiche che vengono sempre riportate nella versione principale.
Moduli core vs moduli di terze parti
Nginx ha due tipi di moduli che è possibile utilizzare: moduli core e moduli di terze parti.
Gli sviluppatori principali di Nginx costruiscono moduli core e fanno parte del software stesso.
La community crea moduli di terze parti e puoi utilizzarli per estendere le funzionalità. Ci sono molti utili moduli di terze parti.
Moduli statici vs. moduli dinamici
I moduli statici esistono in Nginx dalla prima versione. I moduli dinamici sono stati introdotti con Nginx 1.9.11+ a febbraio 2016.
Con i moduli statici, un set di moduli che costituisce un binario Nginx viene corretto in fase di compilazione dallo ./configurescript. Uso --with-foo_bar_moduleo --add-module=PATHsintassi dei moduli statici .
Per compilare un modulo core (standard) come dinamico aggiungiamo =dynamic, ad esempio --with-http_image_filter_module=dynamic.
Per compilare un modulo di terze parti come dinamico, utilizziamo la --add-dynamic-module=/path/to/modulesintassi e quindi li cariciamo utilizzando la load_moduledirettiva nel contesto globale del nginx.conffile.
Requisiti per la costruzione di Nginx dalla fonte
Rispetto ad altri software UNIX / Linux, Nginx è piuttosto leggero e non ha molte dipendenze da libreria. La configurazione di build predefinita dipende solo da 3 librerie da installare: OpenSSL / LibreSSL / BoringSSL, Zlib e PCRE.
- Requisiti obbligatori:
- Requisiti opzionali:
NOTA : Nginx può anche essere compilato su librerie crittografiche LibreSSL e BoringSSL anziché OpenSSL.
Prima di iniziare
Controlla la versione di Debian.
lsb_release -ds
# Debian GNU/Linux 10 (buster)
Crea un utente normale con sudoaccesso.
adduser johndoe --gecos "John Doe"
usermod -aG sudo johndoe
NOTA : sostituisci johndoecon il tuo nome utente .
Passa a un nuovo utente.
su - johndoe
Imposta il fuso orario.
sudo dpkg-reconfigure tzdata
Aggiorna il software del tuo sistema operativo.
sudo apt update && sudo apt upgrade -y
Installa i pacchetti necessari.
sudo apt install -y software-properties-common ufw
Crea Nginx dalla fonte
Nginx è un programma scritto in C, quindi dovrai prima installare uno strumento di compilazione. Installare build-essential, gite tree.
sudo apt install -y build-essential git tree
Scarica l'ultima versione mainline del codice sorgente Nginx e decomprime l'archivio del codice sorgente. Il codice sorgente di Nginx è distribuito come archivio compresso, come la maggior parte dei software Unix e Linux.
wget https://nginx.org/download/nginx-1.17.2.tar.gz && tar zxvf nginx-1.17.2.tar.gz
Scarica il codice sorgente delle dipendenze Nginx obbligatorio ed estrailo.
# PCRE version 8.43
wget https://ftp.pcre.org/pub/pcre/pcre-8.43.tar.gz && tar xzvf pcre-8.43.tar.gz
# zlib version 1.2.11
wget https://www.zlib.net/zlib-1.2.11.tar.gz && tar xzvf zlib-1.2.11.tar.gz
# OpenSSL version 1.1.1c
wget https://www.openssl.org/source/openssl-1.1.1c.tar.gz && tar xzvf openssl-1.1.1c.tar.gz
Installa dipendenze Nginx opzionali.
sudo apt install -y perl libperl-dev libgd3 libgd-dev libgeoip1 libgeoip-dev geoip-bin libxml2 libxml2-dev libxslt1.1 libxslt1-dev
Pulisci tutti i .tar.gzfile. Non ne abbiamo più bisogno.
rm -rf *.tar.gz
Immettere la directory di origine Nginx.
cd ~/nginx-1.17.2
Per una buona misura elenca directory e file che compongono il codice sorgente di Nginx tree.
tree -L 2 .
Copia la pagina del manuale in /usr/share/man/man8/.
sudo cp ~/nginx-1.17.2/man/nginx.8 /usr/share/man/man8
sudo gzip /usr/share/man/man8/nginx.8
ls /usr/share/man/man8/ | grep nginx.8.gz
# Check that man page for Nginx is working
man nginx
Per assistenza, è possibile visualizzare un elenco completo di opzioni di compilazione Nginx aggiornate eseguendo quanto segue.
./configure --help
# To see want core modules can be built as dynamic run:
./configure --help | grep -F =dynamic
Configura, compila e installa Nginx.
./configure --prefix=/etc/nginx \
--sbin-path=/usr/sbin/nginx \
--modules-path=/usr/lib/nginx/modules \
--conf-path=/etc/nginx/nginx.conf \
--error-log-path=/var/log/nginx/error.log \
--pid-path=/var/run/nginx.pid \
--lock-path=/var/run/nginx.lock \
--user=nginx \
--group=nginx \
--build=Debian \
--builddir=nginx-1.17.2 \
--with-select_module \
--with-poll_module \
--with-threads \
--with-file-aio \
--with-http_ssl_module \
--with-http_v2_module \
--with-http_realip_module \
--with-http_addition_module \
--with-http_xslt_module=dynamic \
--with-http_image_filter_module=dynamic \
--with-http_geoip_module=dynamic \
--with-http_sub_module \
--with-http_dav_module \
--with-http_flv_module \
--with-http_mp4_module \
--with-http_gunzip_module \
--with-http_gzip_static_module \
--with-http_auth_request_module \
--with-http_random_index_module \
--with-http_secure_link_module \
--with-http_degradation_module \
--with-http_slice_module \
--with-http_stub_status_module \
--with-http_perl_module=dynamic \
--with-perl_modules_path=/usr/share/perl/5.26.1 \
--with-perl=/usr/bin/perl \
--http-log-path=/var/log/nginx/access.log \
--http-client-body-temp-path=/var/cache/nginx/client_temp \
--http-proxy-temp-path=/var/cache/nginx/proxy_temp \
--http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp \
--http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp \
--http-scgi-temp-path=/var/cache/nginx/scgi_temp \
--with-mail=dynamic \
--with-mail_ssl_module \
--with-stream=dynamic \
--with-stream_ssl_module \
--with-stream_realip_module \
--with-stream_geoip_module=dynamic \
--with-stream_ssl_preread_module \
--with-compat \
--with-pcre=../pcre-8.43 \
--with-pcre-jit \
--with-zlib=../zlib-1.2.11 \
--with-openssl=../openssl-1.1.1c \
--with-openssl-opt=no-nextprotoneg \
--with-debug
make
sudo make install
Dopo la compilazione, vai alla tua home ( ~) directory.
cd ~
Collegamento simbolico /usr/lib/nginx/modulesa /etc/nginx/modules. Questo è un posto standard per i moduli Nginx.
sudo ln -s /usr/lib/nginx/modules /etc/nginx/modules
Stampa la versione di Nginx, la versione del compilatore e configura i parametri dello script.
sudo nginx -V
# nginx version: nginx/1.17.2 (Debian)
# built by gcc 8.3.0 (Debian 8.3.0-6)
# built with OpenSSL 1.1.1c 28 May 2019
# TLS SNI support enabled
# configure arguments: --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib/nginx/modules . . .
# . . .
# . . .
Crea un gruppo di sistema e un utente Nginx.
sudo adduser --system --home /nonexistent --shell /bin/false --no-create-home --disabled-login --disabled-password --gecos "nginx user" --group nginx
# Check that user and group are created
sudo tail -n 1 /etc/passwd /etc/group /etc/shadow
Controlla la sintassi di Nginx e potenziali errori.
sudo nginx -t
# Will throw this error -> nginx: [emerg] mkdir() "/var/cache/nginx/client_temp" failed (2: No such file or directory)
# Create NGINX cache directories and set proper permissions
sudo mkdir -p /var/cache/nginx/client_temp /var/cache/nginx/fastcgi_temp /var/cache/nginx/proxy_temp /var/cache/nginx/scgi_temp /var/cache/nginx/uwsgi_temp
sudo chmod 700 /var/cache/nginx/*
sudo chown nginx:root /var/cache/nginx/*
# Re-check syntax and potential errors.
sudo nginx -t
Creare un file di unità systemd Nginx.
sudo vim /etc/systemd/system/nginx.service
Popolare il /etc/systemd/system/nginx.servicefile con il seguente contenuto.
[Unit]
Description=nginx - high performance web server
Documentation=https://nginx.org/en/docs/
After=network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target
[Service]
Type=forking
PIDFile=/var/run/nginx.pid
ExecStartPre=/usr/sbin/nginx -t -c /etc/nginx/nginx.conf
ExecStart=/usr/sbin/nginx -c /etc/nginx/nginx.conf
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s TERM $MAINPID
[Install]
WantedBy=multi-user.target
Abilita Nginx per l'avvio all'avvio e avvia Nginx immediatamente.
sudo systemctl enable nginx.service
sudo systemctl start nginx.service
Controlla se Nginx si avvierà automaticamente dopo un riavvio.
sudo systemctl is-enabled nginx.service
# enabled
Controlla lo stato.
sudo systemctl status nginx.service
NOTA : è possibile verificare che Nginx sia in esecuzione accedendo al dominio o all'indirizzo IP del proprio sito in un browser Web. Vedrai la pagina di benvenuto di Nginx. Questo è un indicatore che Nginx è attivo e in esecuzione sul tuo VPS.
Crea un profilo di applicazione Nginx UFW.
sudo vim /etc/ufw/applications.d/nginx
Copia / incolla il seguente contenuto nel /etc/ufw/applications.d/nginxfile.
[Nginx HTTP]
title=Web Server (Nginx, HTTP)
description=Small, but very powerful and efficient web server
ports=80/tcp
[Nginx HTTPS]
title=Web Server (Nginx, HTTPS)
description=Small, but very powerful and efficient web server
ports=443/tcp
[Nginx Full]
title=Web Server (Nginx, HTTP + HTTPS)
description=Small, but very powerful and efficient web server
ports=80,443/tcp
Convalida che i profili dell'applicazione UFW vengano creati e riconosciuti.
sudo ufw app list
# Available applications:
# Nginx Full
# Nginx HTTP
# Nginx HTTPS
# OpenSSH
Nginx, per impostazione predefinita, genera .defaultfile di backup in /etc/nginx. Rimuovi i .defaultfile dalla /etc/nginxdirectory.
sudo rm /etc/nginx/*.default
Inserire l'evidenziazione della sintassi della configurazione di Nginx per l'editor Vim in ~/.vim.
# For regular non-root user
mkdir ~/.vim/
cp -r ~/nginx-1.17.2/contrib/vim/* ~/.vim/
# For root user
sudo mkdir /root/.vim/
sudo cp -r ~/nginx-1.17.2/contrib/vim/* /root/.vim/
NOTA : eseguendo il passaggio precedente, si otterrà una bella evidenziazione della sintassi durante la modifica dei file di configurazione di Nginx nell'editor Vim.
Creare conf.d, snippets, sites-availablee sites-enabledle directory in /etc/nginx.
sudo mkdir /etc/nginx/{conf.d,snippets,sites-available,sites-enabled}
Modifica le autorizzazioni e la proprietà del gruppo dei file di registro di Nginx.
sudo chmod 640 /var/log/nginx/*
sudo chown nginx:adm /var/log/nginx/access.log /var/log/nginx/error.log
Creare una configurazione di rotazione del registro per Nginx.
sudo vim /etc/logrotate.d/nginx
Popolare il file con il testo seguente, quindi salva ed esci.
/var/log/nginx/*.log {
daily
missingok
rotate 52
compress
delaycompress
notifempty
create 640 nginx adm
sharedscripts
postrotate
if [ -f /var/run/nginx.pid ]; then
kill -USR1 `cat /var/run/nginx.pid`
fi
endscript
}
Rimuovi tutti i file scaricati dalla home directory.
cd ~
rm -rf nginx-1.17.2/ openssl-1.1.1c/ pcre-8.43/ zlib-1.2.11/
Sommario
Questo è tutto. Ora hai installato l'ultima versione di Nginx. Viene compilato staticamente su alcune importanti librerie come OpenSSL. Spesso, la versione di OpenSSL fornita dal sistema è obsoleta. Usando questo metodo di installazione con una versione più recente di OpenSSL, puoi trarre vantaggio dai moderni cifrari come CHACHA20_POLY1305e dai protocolli come TLS 1.3 che sono disponibili in OpenSSL 1.1.1. Inoltre, compilando il tuo binario, sei in grado di personalizzare la funzionalità che Nginx fornirà, che è molto più flessibile dell'installazione di un binario pre-costruito.