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_module
of--add-module=PATH
syntaxis.
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/module
syntaxis en dan laden we ze doorload_module
richtlijn te gebruiken in deglobale context van hetnginx.conf
bestand.
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.
- Verplichte vereisten:
- GNU Compiler Collectie(GCC)
- OpenSSLbibliotheekversie tussen 1.0.2 -1.1.1 of LibreSSL bibliotheek of BoringSSL bibliotheek
- Zlibbibliotheek versie tussen 1.1.3 -1.2.11
- PCREbibliotheek versie tussen 4.4-8.42
- Optionele vereisten:
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
,curl
ensudo
pakketten.
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.gz
bestanden 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 mettree
hulpprogramma:
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
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/modules
naar/etc/nginx/modules
directory.etc/nginx/modules
is 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.service
bestand:
[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.
Maak Ongecompliceerde Firewall (UFW) Nginx toepassingsprofiel aan:
sudo vim /etc/ufw/applications.d/nginx
Kopieer/plak de onderstaande inhoud in/etc/ufw/applications.d/nginx
bestand:
[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.default
bestandenin/etc/nginx
. Verwijder.default
bestandenuit/etc/nginx
directory:
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.
Maakconf.d
,snippets
,sites-available
ensites-enabled
mappenin/etc/nginx
map:
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_POLY1305
enprotocollen 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.