compiler

Hoe NGINX te bouwen vanaf de bron op Ubuntu 18.04 LTS

 

NGINX (uitgesproken "Engine x") is een open source webserver-software ontworpen met hoge concurrency in gedachten, die kan worden gebruikt als HTTP / HTTPS-server, proxy-server omkeren, mail proxyserver, software load balancer, TLS-terminator, caching server...

Het is een extreem modulair stukje software. Zelfs sommige van de schijnbaar "ingebouwde" onderdelen van de software, zoals GZIP of SSL, zijn feitelijk gebouwd als modules die tijdens de bouwtijd kunnen worden ingeschakeld en uitgeschakeld.

Het is kern (inheemse) modules en externe (externe) modules gemaakt door de gemeenschap. Op dit moment zijn er meer dan honderd modules van derden die we kunnen gebruiken.

Geschreven in C taal, het is een zeer snel en licht stuk software.

Het installeren van NGINX vanuit de broncode is relatief "gemakkelijk" - download de nieuwste versie van de NGINX-broncode, configureer, bouw en installeer het.

U moet kiezen of u het wilt downloaden Mainline or stabiel versie, maar ze zijn precies hetzelfde.

In deze tutorial zullen we NGINX bouwen met alle beschikbare modules in open source versie van NGINX en we zullen gebruiken Mainline versie die bij is 1.15.0 op het moment van dit schrijven. Update versienummers als er nieuwere versies beschikbaar komen.

Stabiel versus hoofdlijnversie

NGINX Open Source is beschikbaar in twee versies:

  • Mainline - Bevat de nieuwste functies en bugfixes en is altijd up-to-date. Het is betrouwbaar, maar het kan enkele experimentele modules bevatten en het kan ook een aantal nieuwe bugs bevatten.
  • Stabiel - Bevat niet alle van de nieuwste functies, maar heeft kritieke bugfixes die altijd worden teruggestuurd naar de hoofdversie.

Kernmodules versus modules van derden

NGINX heeft twee soorten modules die u kunt gebruiken: kern modules en modules van derden.

Core-modules worden gebouwd door de belangrijkste NGINX-ontwikkelaars en maken deel uit van de software zelf.

Modules van derden worden door de community gebouwd en u kunt deze gebruiken om de NGINX-functionaliteit uit te breiden. Er zijn veel nuttige modules van derden, waarvan de bekendste onder meer zijn: PageSpeed, ModSecurity, RTMP, Lua enz ...

Statische modules versus dynamische modules

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

Met statische modules, wordt de reeks modules die een NGINX binair getal vormen, tijdens de compilatie vastgesteld door de ./configure script. Statische modules gebruiken --with-foo_bar_module or --add-module=PATH syntaxis.

Voor het compileren van de kern (standaard) module als dynamisch toevoegen =dynamicBijvoorbeeld --with-http_image_filter_module=dynamic.

Module van derden compileren als dynamisch we gebruiken --add-dynamic-module=/path/to/module syntaxis en vervolgens laden we ze met behulp van load_module richtlijn in de mondiale context van de nginx.conf bestand.

Vereisten voor het bouwen van NGINX vanaf de bron

In vergelijking met sommige andere UNIX / Linux-software is NGINX vrij lichtgewicht en heeft het niet veel bibliotheekafhankelijkheden. De standaard buildconfiguratie is afhankelijk van alleen 3-bibliotheken die moeten worden geïnstalleerd: OpenSSL/LibreSSL/BoringSSL, zlib en PCRE.

NOTITIE: NGINX kan ook worden gecompileerd tegen LibreSSL en BoringSSL cryptobibliotheken in plaats van OpenSSL.

Voorwaarden

  • Een server met Ubuntu 18.04 LTS.
  • Een niet-rootgebruiker met sudo-privileges.

Eerste stappen

Controleer Ubuntu-versie:

lsb_release -ds
# Ubuntu 18.04 LTS

Stel de tijdzone in:

timedatectl lijst-tijdzones
sudo timedatectl set-timezone 'Regio / Stad'

Update de pakketten van uw besturingssysteem:

sudo apt update && sudo apt upgrade -y

Bouw NGINX vanaf de bron

NGINX is een programma geschreven in C, dus u moet eerst een compilertool installeren. Installeren build-essential, git en tree pakketjes:

sudo apt install -y build-essentiële git tree

Download de nieuwste hoofdlijnversie van de NGINX-broncode en pak het uit. NGINX-broncode wordt gedistribueerd als gecomprimeerd archief (gzipped tarball), zoals de meeste Unix- en Linux-software:

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

Download de verplichte broncode van de broncode van NGINX en extraheer ze:

# PCRE-versie 8.42
wget https://ftp.pcre.org/pub/pcre/pcre-8.42.tar.gz && tar xzvf pcre-8.42.tar.gz
# zlib-versie 1.2.11
wget https://www.zlib.net/zlib-1.2.11.tar.gz && tar xzvf zlib-1.2.11.tar.gz
# OpenSSL-versie 1.1.0h
wget https://www.openssl.org/source/openssl-1.1.0h.tar.gz && tar xzvf openssl-1.1.0h.tar.gz

Installeer optionele NGINX-afhankelijkheden:

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

Ruim alles op .tar.gz bestanden. We hebben ze niet meer nodig:

rm -rf * .tar.gz

Voer de NGINX-brondirectory in:

cd ~ / nginx-1.15.0

Voor goede meetlijstmappen en bestanden waaruit NGINX-broncode bestaat tree nut:

tree -L 2.

Kopieer de NGINX-handleiding naar /usr/share/man/man8/ directory:

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
# Controleer of de pagina Man voor NGINX werkt:
man nginx

Nginx manpage

Voor hulp kunt u de volledige lijst met up-to-date NGINX-tijdopties voor compileren bekijken door het volgende uit te voeren:

./configure -help
# Om te zien willen dat kernmodules kunnen worden gebouwd als dynamische run:
./configure -help | grep -F = dynamisch

NGINX configureren, compileren en installeren:

./configure -prefix = / etc / nginx
-sbin-path = / usr / sbin / nginx
-modules-path = / usr / lib / nginx / modules
-conf-path = / etc / nginx / nginx.conf
-Fout-log-path = / var / log / nginx / error.log
-pid-path = / var / run / nginx.pid
-lock-path = / var / run / nginx.lock
-user = nginx
-groep = nginx
-Build = Ubuntu
-builddir = nginx-1.15.0
-met-select_module
-met-poll_module
-met-threads
-met-file-aio
-met-http_ssl_module
-met-http_v2_module
-met-http_realip_module
-met-http_addition_module
-met-http_xslt_module = dynamische
-met-http_image_filter_module = dynamische
-met-http_geoip_module = dynamische
-met-http_sub_module
-met-http_dav_module
-met-http_flv_module
-met-http_mp4_module
-met-http_gunzip_module
-met-http_gzip_static_module
-met-http_auth_request_module
-met-http_random_index_module
-met-http_secure_link_module
-met-http_degradation_module
-met-http_slice_module
-met-http_stub_status_module
-met-http_perl_module = dynamische
-met-perl_modules_path = / usr / share / perl / 5.26.1
-met-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
-met-mail = dynamische
-met-mail_ssl_module
-met-stream = dynamische
-met-stream_ssl_module
-met-stream_realip_module
-met-stream_geoip_module = dynamische
-met-stream_ssl_preread_module
-met-compat
-met-pcre = .. / pcre-8.42
-met-pcre-jit
-met-zlib = .. / zlib-1.2.11
-met-openssl = .. / openssl-1.1.0h
-met-openssl-opt = no-nextprotoneg
-met-debug
maken
sudo make install

Na het bouwen van NGINX navigeer je naar huis (~) map:

cd ~

symlink /usr/lib/nginx/modules naar /etc/nginx/modules directory. etc/nginx/modules is een standaardlocatie voor NGINX-modules:

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

Druk de NGINX-versie, de compilerversie en de scriptparameters af:

sudo nginx -V
# nginx-versie: nginx / 1.15.0 (Ubuntu)
# built by gcc 7.3.0 (Ubuntu 7.3.0-16ubuntu3)
# gebouwd met OpenSSL 1.1.0h 27 Mar 2018
# TLS SNI-ondersteuning ingeschakeld
# 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-wachtwoord -gecos "nginx user" -group nginx

Controleer NGINX-syntaxis en mogelijke fouten:

sudo nginx -t
# Zal deze fout genereren -> nginx: [emerg] mkdir () "/ var / cache / nginx / client_temp" mislukt (2: bestand of map bestaat niet)
# Maak NGINX-cache-mappen en stel de juiste machtigingen in
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 / *
# Controleer syntaxis en mogelijke fouten opnieuw.
sudo nginx -t

Maak NGINX systemd unit bestand aan:

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

Kopieer en plak de onderstaande inhoud in /etc/systemd/system/nginx.service file:

[Eenheid] Beschrijving = nginx - krachtige webserver Documentatie = 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 [Installeren] WantedBy = multi-user.doel

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

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

Controleer of NGINX automatisch start na een herstart:

sudo systemctl is ingeschakeld nginx.service
# ingeschakeld

Controleer of NGINX actief is door een van de volgende opdrachten uit te voeren:

sudo systemctl status nginx.service
# of
ps aux | grep nginx
# of
krul -I 127.0.0.1

U kunt ook uw browser openen en naar uw domein / IP-adres navigeren om de standaard NGINX-pagina te bekijken. Dat is een indicator dat NGINX aan de gang is.

Nginx welkomstpagina

Maak een ongecompliceerde firewall (UFW) NGINX-toepassingsprofiel:

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

Kopieer en plak de onderstaande inhoud in /etc/ufw/applications.d/nginx file:

[Nginx HTTP] title = Webserver (Nginx, HTTP) description = Kleine maar zeer krachtige en efficiënte webserverpoorten = 80 / tcp [Nginx HTTPS] title = Webserver (Nginx, HTTPS) description = Klein, maar zeer krachtig en efficiënte webserverpoorten = 443 / tcp [Nginx Full] title = Webserver (Nginx, HTTP + HTTPS) description = Kleine maar zeer krachtige en efficiënte webserverpoorten = 80,443 / tcp

Controleer of UFW-toepassingsprofielen worden gemaakt en herkend:

sudo ufw app lijst
# Beschikbare applicaties:
# Nginx Full
# Nginx HTTP
# Nginx HTTPS
# OpenSSH

NGINX genereert standaard een back-up .default bestanden /etc/nginx. Verwijderen .default bestanden van /etc/nginxdirectory:

sudo rm /etc/nginx/*.default

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

# Voor normale niet-root gebruiker mkdir ~ / .vim / cp -r ~ / nginx-1.15.0 / contrib / vim / * ~ / .vim / # Voor root gebruiker sudo mkdir /root/.vim/ sudo cp -r ~ / nginx-1.15.0 / contrib / vim / * /root/.vim/

NOTITIE: Door de bovenstaande stap te doen, krijgt u een mooie syntax-highlighting bij het bewerken van NGINX-configuratiebestanden in de Vim-editor.

Nginx Syntax highlighting in Vim

creëren conf.d, snippets, sites-available en sites-enabled mappen in /etc/nginx directory:

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

Wijzig de rechten en het 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 een logrotatieconfiguratie voor NGINX.

sudo vim /etc/logrotate.d/nginx

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

/var/log/nginx/*.log {dagelijks missingok roteren 52 comprimeren vertragingscomprimeren notifempty maken 640 nginx adm sharedscripts postroteren als [-f /var/run/nginx.pid]; kill dan -USR1 `cat / var / run / nginx.pid` fi endscript}

Verwijder alle gedownloade bestanden uit de persoonlijke map:

cd ~
rm -rf nginx-1.15.0 / openssl-1.1.0h / pcre-8.42 / zlib-1.2.11 /

Dat is het. Nu hebt u de nieuwste versie van NGINX geïnstalleerd door deze uit de broncode te maken. Het is statisch gecompileerd tegen enkele belangrijke bibliotheken zoals OpenSSL. Vaak is de door het systeem geleverde versie van OpenSSL verouderd. Door deze installatiemethode met een nieuwere versie van OpenSSL te gebruiken, kunt u profiteren van nieuwe coderingen zoals CHACHA20_POLY1305 en protocollen zoals TLS 1.3 dat zal beschikbaar zijn in OpenSSL 1.1.1. Door je eigen binaire bestand te compileren, kun je ook aanpassen aan welke functionaliteit je NGINX zorgt, wat veel flexibeler is dan het installeren van een vooraf gebouwd binair bestand.

 

bron