Nginx vanuit broncode bouwen op Debian 9

Nginx (spreek uit als “engine x”) is een open source webserversoftware, ontworpen met hoge concurrency in gedachten, die gebruikt kan worden als HTTP/HTTPS server, reverse proxy server, mail proxy server,software load balancer, TLSterminator, caching server…

Het is een uiterst modulair stuk software. Zelfs sommige van de schijnbaar “ingebouwde” onderdelen van de software, zoals GZIP of SSL, zijn eigenlijk gebouwd als modules die tijdens het bouwen kunnen worden in- en uitgeschakeld.

Het heeft kern(native)modules enmodules van derden (extern)gemaakt door de gemeenschap. Op dit moment zijn er meer dan honderd modules van derden die we kunnen gebruiken.

Geschreven in de taal C,is het een zeer snel en lichtgewicht stukje software.

Nginx vanaf broncode installeren is relatief “eenvoudig” – download de nieuwste versie van Nginx broncode, configureer, bouw en installeer het.

Je moet kiezen of je de hoofdlijnof stabieleversie wilt downloaden,maarze bouwenis precies hetzelfde.

In deze zelfstudie bouwen we Nginx met alle beschikbare modules in de open bron versie van Nginx en we gebruikenhoofdlijnversie die te vinden is op1.15.8op het moment van dit schrijven. Werk de versienummers bij als er nieuwere versies beschikbaar komen.

Stabiele vs. hoofdversie

Nginx Open Source is beschikbaar in twee versies:

  • Mainline– Bevat de nieuwste mogelijkheden en bug fixes en is altijd actueel. Het is betrouwbaar, maar het kan enkele experimentele modules bevatten, en het kan ook een aantal nieuwe bugs bevatten.
  • Stabiel– Bevat niet alle nieuwste functies, maar heeft kritieke bugfixes die altijd naar de hoofdversie teruggeplaatst worden.

Kernmodules vs. modules van derden

Nginx heeft twee soorten modules die je kunt gebruiken:kernmodules enmodules van derden.

Core modules worden gebouwd door de core Nginx ontwikkelaars en ze maken deel uit van de software zelf.

Modules van derden worden door de gemeenschap gebouwd en je kunt ze gebruiken om de Nginx functionaliteit uit te breiden. Er zijn heel wat nuttige modules van derden, de bekendste zijn: PageSpeed, ModSecurity, RTMP, Lua enz…

Statische modules vs. dynamische modules

Statische modules bestaan in Nginx vanaf de allereerste versie. Dynamische modules werden geïntroduceerd met Nginx 1.9.11+ in februari 2016.

Bij statische modules wordt de verzameling modules die een Nginx binary vormen bij het compileren vastgelegd door het./configure script.Statische modules gebruiken de--with-foo_bar_moduleof--add-module=PATHsyntaxis.

Om core (standaard) module als dynamisch te compileren voegen we=dynamic toe, bijvoorbeeld--with-http_image_filter_module=dynamic.

Om modules van derden als dynamisch te compileren gebruiken we--add-dynamic-module=/path/to/modulesyntaxis en dan laden we ze doorload_modulerichtlijn te gebruiken in deglobale context van hetnginx.confbestand.

Vereisten voor het bouwen van Nginx vanaf broncode

In vergelijking met sommige andere UNIX/Linux software is Nginx vrij licht en heeft het niet veel bibliotheek afhankelijkheden. De standaard bouwconfiguratie is afhankelijk van slechts 3 te installeren bibliotheken: OpenSSL/LibreSSL/BoringSSL, Zlib enPCRE.

OPMERKING: Nginx kan ook gecompileerd worden metLibreSSLenBoringSSLcryptobibliothekenin plaats vanOpenSSL ..

Vereisten

  • Een server met Debian 9 (stretch).
  • Een niet-root gebruiker met sudo privileges.

Eerste Stappen

Controleer de Debian versie:

lsb_release -ds 
# Debian GNU/Linux 9.6 (stretch)

Installeerwget,curlensudopakketten.

apt install -y wget curl sudo

Stel de tijdzone in:

sudo dpkg-reconfigure tzdata

Werk de pakketten van je besturingssysteem bij:

apt update && apt upgrade -y

Bouw Nginx vanaf broncode

Nginx is een programma geschreven inC,dus je zult eerst een compiler gereedschap moeten installeren. Installeerbuild-essential pakket, en andere vereistepakketten:

sudo apt install -y build-essential git tree software-properties-common dirmngr apt-transport-https ufw

Download de nieuwste mainline versie van de Nginx broncode en pak hem uit. De Nginx broncode wordt verspreid als gecomprimeerd archief (gzipped tarball), zoals de meeste Unix en Linux software:

wget https://nginx.org/download/nginx-1.15.8.tar.gz && tar zxvf nginx-1.15.8.tar.gz

Download de broncode van de verplichte Nginx afhankelijkheden en pak ze uit:

# 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.1a
wget https://www.openssl.org/source/openssl-1.1.1a.tar.gz && tar xzvf openssl-1.1.1a.tar.gz

Installeer de optionele Nginx afhankelijkheden:

sudo apt install -y perl libperl-dev libgd3 libgd-dev libgeoip1 libgeoip-dev geoip-bin libxml2 libxml2-dev libxslt1.1 libxslt1-dev

Ruim alle.tar.gzbestanden op.We hebben ze niet meer nodig:

rm -rf *.tar.gz

Ga de Nginx broncode directory in:

cd ~/nginx-1.15.8

Maak voor de goede orde een lijst van mappen en bestanden waaruit de Nginx broncode bestaat mettreehulpprogramma:

tree -L 2 .

Kopieer de Nginx handleiding pagina naar/usr/share/man/man8/directory:

sudo cp ~/nginx-1.15.8/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

Nginx manpagina

Als hulp kun je de volledige lijst van bijgewerkte Nginx compileertijdopties zien door te draaien:

./configure --help
# To see want core modules can be build as dynamic run:
./configure --help | grep -F =dynamic

Configureer, compileer en installeer 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.15.8 \
            --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.24.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.1a \
            --with-openssl-opt=no-nextprotoneg \
            --with-debug

make
sudo make install

Na het bouwen van Nginx, navigeer je naar home (~) map:

cd ~

Symlink/usr/lib/nginx/modulesnaar/etc/nginx/modulesdirectory.etc/nginx/modulesis eenstandaard plaats voor Nginx modules:

sudo ln -s /usr/lib/nginx/modules /etc/nginx/modules

Druk de Nginx versie af, de compiler versie, en de parameters van het configure script:

sudo nginx -V
# nginx version: nginx/1.15.8 (Debian)
# built by gcc 6.3.0 (Debian 6.3.0-18+deb9u1)
# built with OpenSSL 1.1.1a  20 Nov 2018
# TLS SNI support enabled
# configure arguments: --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib/nginx/modules
# . . .
# . . .

Maak Nginx systeemgroep en gebruiker aan:

sudo adduser --system --home /nonexistent --shell /bin/false --no-create-home --disabled-login --disabled-password --gecos "nginx user" --group nginx

Controleer Nginx syntaxis en mogelijke fouten:

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

Maak Nginx systemd unit bestand:

sudo vim /etc/systemd/system/nginx.service

Kopieer/plak de onderstaande inhoud in/etc/systemd/system/nginx.servicebestand:

[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

Schakel Nginx in om bij het opstarten te starten en start Nginx onmiddellijk:

sudo systemctl enable nginx.service
sudo systemctl start nginx.service

Controleer of Nginx automatisch opstart na een reboot:

sudo systemctl is-enabled nginx.service
# enabled

Controleer of Nginx draait door een van de volgende commando’s uit te voeren:

sudo systemctl status nginx.service
# or
ps aux | grep nginx
# or
curl -I 127.0.0.1

Je kunt ook je browser openen en naar je domein/IP adres navigeren om de standaard Nginx pagina te zien. Dat is een indicator dat Nginx draait.

Nginx welkomstpagina

Maak Ongecompliceerde Firewall (UFW) Nginx toepassingsprofiel aan:

sudo vim /etc/ufw/applications.d/nginx

Kopieer/plak de onderstaande inhoud in/etc/ufw/applications.d/nginxbestand:

[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

Controleer of UFW toepassingsprofielen gemaakt en herkend worden:

sudo ufw app list

# Available applications:
 # nginx Full
 # nginx HTTP
 # nginx HTTPS

nginx genereert standaard backup.defaultbestandenin/etc/nginx. Verwijder.defaultbestandenuit/etc/nginxdirectory:

sudo rm /etc/nginx/*.default

Plaats syntax highlighting van nginx configuratie voor Vim editor in~/.vim:

# For regular non-root user
mkdir ~/.vim/
cp -r ~/nginx-1.15.8/contrib/vim/* ~/.vim/
# For root user
sudo mkdir /root/.vim/
sudo cp -r ~/nginx-1.15.8/contrib/vim/* /root/.vim/

OPMERKING: Door de bovenstaande stap te doen, krijg je een mooie syntaxis-accentuering bij het bewerken van Nginx configuratiebestanden in Vim editor.

Nginx syntax highlighting in Vim

Maakconf.d,snippets,sites-availableensites-enabledmappenin/etc/nginxmap:

sudo mkdir /etc/nginx/{conf.d,snippets,sites-available,sites-enabled}

Verander rechten en groepseigendom van nginx logbestanden:

sudo chmod 640 /var/log/nginx/*
sudo chown nginx:adm /var/log/nginx/access.log /var/log/nginx/error.log

Maak logrotatie config voor Nginx.

sudo vim /etc/logrotate.d/nginx

Vul het bestand met de onderstaande tekst, sla dan op en sluit af:

/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
}

Verwijder alle gedownloade bestanden uit de thuismap:

cd ~
rm -rf nginx-1.15.8/ openssl-1.1.1a/ pcre-8.42/ zlib-1.2.11/

Dat is het. Nu heb je de nieuwste versie van Nginx geïnstalleerd door hem vanaf de broncode te bouwen. Het wordt statisch gecompileerd tegen enkele belangrijke bibliotheken zoals OpenSSL. Vaak is de door het systeem geleverde versie van OpenSSL verouderd. Door deze methode van installeren met een nieuwere versie van OpenSSL te gebruiken, kun je gebruik maken van nieuwe cijfers alsCHACHA20_POLY1305enprotocollen zoalsTLS 1.3diebeschikbaar is in OpenSSL1.1.1.Ook kun je, door je eigen binary te compileren, zelf bepalen welke functionaliteit je Nginx zal bieden, wat veel flexibeler is dan een voorgebouwde binary te installeren.