Nginx van broncode bouwen op Fedora 29

Nginx (spreek uit als“engine x”) is een open source webserversoftware, ontworpen met hoge concurrency in gedachten, die gebruikt kan worden alsHTTP/HTTPS server,reverse proxy server,mail proxy server,software load balancer,TLS terminator,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 heeftkern(native)modulesenmodules 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 taalC, is het een zeer snel en licht stukje software.

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

Je moet kiezen of je dehoofdlijnversieof destabieleversie wilt downloaden, maar ze bouwen is 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:kernmodulesenmodules 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./configurescript. 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 de globale 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,ZlibenPCRE.

Vereisten

  • Een server met Fedora 29 systeem.
  • Een niet-root gebruiker met sudo privileges.

Eerste Stappen

Controleer je Fedora versie:

cat /etc/fedora-release
# Fedora release 29 (Twenty Nine)

Stel de tijdzone in:

timedatectl list-timezones
sudo timedatectl set-timezone 'Region/City'

Werk de pakketten van je Fedora besturingssysteem bij:

sudo dnf upgrade -y

Installeer vim, curl, wget en tree pakketten:

sudo dnf install -y vim curl wget tree

Bouw Nginx vanaf broncode

Nginx is een programma geschreven inC, dus je zult eerst een compiler gereedschappen moeten installeren:

sudo dnf groupinstall -y 'Development Tools'

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 dnf install -y perl perl-devel perl-ExtUtils-Embed libxslt libxslt-devel libxml2 libxml2-devel gd gd-devel GeoIP GeoIP-devel

Ruim alle.tar.gzbestanden op, want ze zijn niet meer nodig:

rm -rf *.tar.gz

Ga de Nginx bron-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 actuele Nginx compileer-tijd opties 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/lib64/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=Fedora \
            --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/lib64/perl5 \
            --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/lib64/nginx/modulesnaar/etc/nginx/modulesdirectory.etc/nginx/modulesis een standaard plaats voor Nginx modules:

sudo ln -s /usr/lib64/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 (Fedora)
# built by gcc 8.2.1 20150623 (Red Hat 8.2.1-6) (GCC)
# 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/lib64/nginx/modules
# . . .
# . . .

Maak Nginx systeemgroep en gebruiker aan:

sudo useradd --system --home /var/cache/nginx --shell /sbin/nologin --comment "nginx user" --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:

OPMERKING:De plaats van hetPIDbestand en de Nginx binary kunnen verschillen, afhankelijk van hoe Nginx gecompileerd werd.

[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 start 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

Nginx genereert standaard backup.defaultbestanden in/etc/nginx. Verwijder.defaultbestanden uit/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.

Nginx syntax highlighting in Vim

Maakconf.d,snippets,sites-availableensites-enabledmappen in/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 home directory:

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_POLY1305en protocollen alsTLS 1.3die in OpenSSL 1.wordenondersteund.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.