NGINX (pronunciato "engine x" ) è un software per server web open source progettato pensando alla concorrenza, che può essere utilizzato come server HTTP/HTTPS , server proxy inverso , server proxy di posta , bilanciatore del carico software , Terminale TLS , server di memorizzazione nella cache ...
È un software estremamente modulare. Anche alcuni dei componenti software apparentemente "integrati", come GZIP o SSL, sono in realtà costruiti come moduli che possono essere abilitati e disabilitati durante il tempo di compilazione.
Ha core (nativo ) moduli e moduli (esterni) di terze parti creato dalla comunità. Al momento, ci sono oltre cento moduli di terze parti che possiamo utilizzare.
Scritto in C lingua, è un software molto veloce e leggero.
L'installazione di NGINX dal codice sorgente è relativamente "facile":scarica l'ultima versione del codice sorgente di NGINX, configura, compila e installa.
Dovrai scegliere se scaricare la mainline o stabile versione, ma costruirli è esattamente lo stesso.
In questo tutorial creeremo NGINX con tutti i moduli disponibili nella versione open source di NGINX e utilizzeremo mainline versione che è a 1.15.0 nel momento in cui scrivo. Aggiorna i numeri di versione quando diventano disponibili versioni più recenti.
Versione stabile e versione mainline
NGINX Open Source è disponibile in due versioni:
- Linea principale – Include le ultime funzionalità e correzioni di bug ed è sempre aggiornato. È affidabile, ma potrebbe includere alcuni moduli sperimentali e potrebbe anche avere un certo numero di nuovi bug.
- Stabile – Non include tutte le funzionalità più recenti, ma include correzioni di bug critici che vengono sempre riportate alla versione principale.
Moduli principali e moduli di terze parti
NGINX ha due tipi di moduli che puoi utilizzare: moduli principali e moduli di terze parti .
I moduli principali sono creati dagli sviluppatori principali di NGINX e fanno parte del software stesso.
I moduli di terze parti sono creati dalla community e puoi usarli per estendere la funzionalità di NGINX. Ci sono molti utili moduli di terze parti, i più famosi tra questi sono:PageSpeed, ModSecurity, RTMP, Lua ecc...
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, l'insieme di moduli che costituiscono un binario NGINX viene corretto in fase di compilazione da ./configure
sceneggiatura. I moduli statici utilizzano --with-foo_bar_module
o --add-module=PATH
sintassi.
Per compilare il modulo principale (standard) come dinamico aggiungiamo =dynamic
, ad esempio --with-http_image_filter_module=dynamic
.
Per compilare il modulo di terze parti come dinamico utilizziamo --add-dynamic-module=/path/to/module
sintassi e poi li carichiamo utilizzando load_module
direttiva nel contesto globale di nginx.conf
file.
Requisiti per la creazione di NGINX dal sorgente
Rispetto ad altri software UNIX/Linux, NGINX è piuttosto leggero e non ha molte dipendenze dalla libreria. La configurazione della build predefinita dipende solo da 3 librerie da installare: OpenSSL /LibreSSL /SSL noioso , Zlib e PCRE .
- Requisiti obbligatori:
- GNU Compiler Collection (GCC )
- Versione della libreria OpenSSL tra 1.0.2 - 1.1.1 o libreria LibreSSL o libreria BoringSSL
- Versione della libreria Zlib tra 1.1.3 - 1.2.11
- Versione della libreria PCRE tra 4.4 - 8.42
- Requisiti facoltativi:
- Perl
- LibGD
- Libreria C Legacy MaxMind GeoIP
- libxml2
- libxslt
NOTA :NGINX può anche essere compilato su LibreSSL e NoiosoSSL librerie crittografiche invece di OpenSSL .
Requisiti
- Un server che esegue Ubuntu 18.04 LTS.
- Un utente non root con privilegi sudo.
Passaggi iniziali
Controlla la versione di Ubuntu:
lsb_release -ds
# Ubuntu 18.04 LTS
Imposta il fuso orario:
timedatectl list-timezones
sudo timedatectl set-timezone 'Region/City'
Aggiorna i pacchetti del tuo sistema operativo:
sudo apt update && sudo apt upgrade -y
Crea NGINX dal sorgente
NGINX è un programma scritto in C , quindi dovrai prima installare uno strumento di compilazione. Installa build-essential
, git
e tree
pacchetti:
sudo apt install -y build-essential git tree
Scarica l'ultima versione principale del codice sorgente di NGINX ed estrailo. Il codice sorgente NGINX è distribuito come archivio compresso (tarball gzippato), come la maggior parte dei software Unix e Linux:
wget https://nginx.org/download/nginx-1.15.0.tar.gz && tar zxvf nginx-1.15.0.tar.gz
Scarica il codice sorgente delle dipendenze NGINX obbligatorie ed estraile:
# PCRE version 8.42
wget https://ftp.pcre.org/pub/pcre/pcre-8.42.tar.gz && tar xzvf pcre-8.42.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.0h
wget https://www.openssl.org/source/openssl-1.1.0h.tar.gz && tar xzvf openssl-1.1.0h.tar.gz
Installa le dipendenze NGINX facoltative:
sudo add-apt-repository -y ppa:maxmind/ppa
sudo apt update && sudo apt upgrade -y
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.gz
File. Non ne abbiamo più bisogno:
rm -rf *.tar.gz
Inserisci la directory di origine NGINX:
cd ~/nginx-1.15.0
Per una buona misura elenca le directory e i file che compongono il codice sorgente NGINX con tree
utilità:
tree -L 2 .
Copia la pagina di manuale di NGINX in /usr/share/man/man8/
elenco:
sudo cp ~/nginx-1.15.0/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, puoi vedere l'elenco completo delle opzioni di compilazione NGINX aggiornate eseguendo:
./configure --help
# To see want core modules can be build 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=Ubuntu \
--builddir=nginx-1.15.0 \
--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.42 \
--with-pcre-jit \
--with-zlib=../zlib-1.2.11 \
--with-openssl=../openssl-1.1.0h \
--with-openssl-opt=no-nextprotoneg \
--with-debug
make
sudo make install
Dopo aver creato NGINX, vai alla home (~
) directory:
cd ~
Collegamento simbolico /usr/lib/nginx/modules
a /etc/nginx/modules
directory. etc/nginx/modules
è un posto standard per i moduli NGINX:
sudo ln -s /usr/lib/nginx/modules /etc/nginx/modules
Stampa la versione NGINX, la versione del compilatore e configura i parametri dello script:
sudo nginx -V
# nginx version: nginx/1.15.0 (Ubuntu)
# built by gcc 7.3.0 (Ubuntu 7.3.0-16ubuntu3)
# built with OpenSSL 1.1.0h 27 Mar 2018
# TLS SNI support enabled
# configure arguments: --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib/nginx/modules
# . . .
# . . .
Crea gruppo di sistema NGINX e utente:
sudo adduser --system --home /nonexistent --shell /bin/false --no-create-home --disabled-login --disabled-password --gecos "nginx user" --group nginx
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
Crea file di unità di sistema NGINX:
sudo vim /etc/systemd/system/nginx.service
Copia/incolla i seguenti contenuti in /etc/systemd/system/nginx.service
file:
[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
Verifica se NGINX si avvierà automaticamente dopo un riavvio:
sudo systemctl is-enabled nginx.service
# enabled
Verifica se NGINX è in esecuzione eseguendo uno dei seguenti comandi:
sudo systemctl status nginx.service
# or
ps aux | grep nginx
# or
curl -I 127.0.0.1
Puoi anche aprire il browser e accedere al tuo dominio/indirizzo IP per visualizzare la pagina NGINX predefinita. Questo è un indicatore del fatto che NGINX è attivo e funzionante.
Crea firewall semplice (UFW ) Profilo dell'applicazione NGINX:
sudo vim /etc/ufw/applications.d/nginx
Copia/incolla i contenuti seguenti in /etc/ufw/applications.d/nginx
file:
[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
Verifica che i profili dell'applicazione UFW siano creati e riconosciuti:
sudo ufw app list
# Available applications:
# Nginx Full
# Nginx HTTP
# Nginx HTTPS
# OpenSSH
NGINX per impostazione predefinita, genera il backup .default
file in /etc/nginx
. Rimuovi .default
file da /etc/nginx
directory:
sudo rm /etc/nginx/*.default
Posiziona 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.15.0/contrib/vim/* ~/.vim/ # For root user sudo mkdir /root/.vim/ sudo cp -r ~/nginx-1.15.0/contrib/vim/* /root/.vim/
NOTA :Facendo il passaggio precedente, otterrai una bella evidenziazione della sintassi durante la modifica dei file di configurazione NGINX nell'editor Vim.
Crea conf.d
, snippets
, sites-available
e sites-enabled
directory in /etc/nginx
directory:
sudo mkdir /etc/nginx/{conf.d,snippets,sites-available,sites-enabled}
Modifica le autorizzazioni e la proprietà del gruppo dei file di registro NGINX:
sudo chmod 640 /var/log/nginx/*
sudo chown nginx:adm /var/log/nginx/access.log /var/log/nginx/error.log
Crea configurazione logrotation per NGINX.
sudo vim /etc/logrotate.d/nginx
Compila 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.15.0/ openssl-1.1.0h/ pcre-8.42/ zlib-1.2.11/
Questo è tutto. Ora hai installato l'ultima versione di NGINX compilandola dal codice sorgente. Viene compilato in modo statico rispetto ad alcune importanti librerie come OpenSSL. Spesso, la versione di OpenSSL fornita dal sistema è obsoleta. Utilizzando questo metodo di installazione con una versione più recente di OpenSSL, puoi sfruttare nuovi codici come CHACHA20_POLY1305
e protocolli come TLS 1.3 che sarà disponibile in OpenSSL 1.1.1.
Inoltre, compilando il tuo file binario, puoi personalizzare le funzionalità che il tuo NGINX fornirà, il che è molto più flessibile rispetto all'installazione di un binario pre-costruito.