Wie man NGINX aus dem Quellcode auf Ubuntu 18.04 LTS erstellt.

NGINX (ausgesprochen „Engine x“) ist eine Open-Source-Webserver-Software, die mit Blick auf eine hohe Parallelität entwickelt wurde und als HTTP/HTTPS-Server, Reverse-Proxy-Server, Mail-Proxy-Server, Software-Lastausgleich, TLS-Terminator, Caching-Server…. verwendet werden kann.

Es handelt sich um eine extrem modulare Software. Sogar einige der scheinbar „eingebauten“ Teile der Software, wie GZIP oder SSL, sind tatsächlich als Module aufgebaut, die während der Buildzeit aktiviert und deaktiviert werden können.

Es hat Kern (native) Module und Fremdmodule (externe) Moduledie von der Community erstellt wurden. Im Moment gibt es über hundert Module von Drittanbietern, die wir nutzen können.

In der Sprache C geschrieben, ist es eine sehr schnelle und leichte Software.

Die Installation von NGINX aus dem Quellcode ist relativ „einfach“ – laden Sie die neueste Version des NGINX-Quellcodes herunter, konfigurieren, erstellen und installieren Sie ihn.

Sie müssen wählen, ob Sie die Mainline- oder die stabile Version herunterladen möchten, aber die Erstellung ist genau die gleiche.

In diesem Tutorial werden wir NGINX mit allen verfügbaren Modulen in der Open-Source-Version von NGINX erstellen und die Mainline-Version verwenden, die zum Zeitpunkt dieses Artikels bei 1.15.0 liegt. Aktualisieren Sie die Versionsnummern, wenn neuere Versionen verfügbar werden.

Stabile vs. Mainline-Version

NGINX Open Source ist in zwei Versionen erhältlich:

  • Mainline – Enthält die neuesten Funktionen und Bugfixes und ist immer auf dem neuesten Stand. Es ist zuverlässig, aber es kann einige experimentelle Module beinhalten, und es kann auch einige neue Fehler enthalten.
  • Stabil – Enthält nicht alle neuesten Funktionen, enthält aber kritische Bugfixes, die immer auf die Mainline-Version zurückportiert werden.

Kernmodule vs. Fremdmodule

NGINX hat zwei Arten von Modulen, die Sie verwenden können: Kernmodule und Module von Drittanbietern.

Kernmodule werden von den Kern-Entwicklern von NGINX entwickelt und sind Teil der Software selbst.

Module von Drittanbietern werden von der Community erstellt und können zur Erweiterung der NGINX-Funktionalität verwendet werden. Es gibt viele hilfreiche Module von Drittanbietern, die bekanntesten davon sind: PageSpeed, ModSecurity, RTMP, Lua etc…..

Statische Module vs. dynamische Module

Statische Module gibt es in NGINX von der ersten Version an. Im Februar 2016 wurden mit NGINX 1.9.11+ dynamische Module eingeführt.

Bei statischen Modulen wird der Satz von Modulen, die eine NGINX-Binärdatei bilden, zur Kompilierungszeit durch das./configure<-Skript festgelegt. Statische Module verwenden die Syntax < oder <.--with-foo_bar_module

Um das Kernmodul (Standard) als dynamisches Modul zu kompilieren, fügen wir ,zum=dynamicBeispiel .

Um das Modul eines Drittanbieters als dynamisch zu kompilieren, verwenden wir die Syntax--add-dynamic-module=/path/to/module× und laden sie dann mit der Direktive × imload_moduleglobalen Kontext der Datei ×.

Anforderungen für die Erstellung von NGINX aus dem Quellcode

Im Vergleich zu einigen anderen UNIX/Linux-Programmen ist NGINX ziemlich leicht und hat nicht viele Bibliotheksabhängigkeiten. Die Standard-Build-Konfiguration hängt von nur 3 zu installierenden Bibliotheken ab: OpenSSL/LibreSSL/BoringSSL, Zlib und PCRE.

HINWEIS: NGINX kann auch kompiliert werden gegenLibreSSLundBohrenSSLKrypto-Bibliotheken anstelle vonOpenSSL.

Anforderungen

  • Ein Server mit Ubuntu 18.04 LTS.
  • Ein Nicht-Root-Benutzer mit sudo-Rechten.

Erste Schritte

Überprüfen Sie die Ubuntu-Version:

lsb_release -ds 
# Ubuntu 18.04 LTS

Richten Sie die Zeitzone ein:

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

Aktualisieren Sie die Pakete Ihres Betriebssystems:

sudo apt update && sudo apt upgrade -y

NGINX aus dem Quellcode erstellen

NGINX ist ein Programm, das geschrieben wurde inC, so dass Sie zuerst ein Compiler-Tool installieren müssen. Installierenbuild-essential,gitundtreePakete:

sudo apt install -y build-essential git tree

Laden Sie die neueste Mainline-Version des NGINX-Quellcodes herunter und extrahieren Sie ihn. NGINX-Quellcode wird als komprimiertes Archiv (gzipped tarball) verteilt, wie die meisten Unix- und Linux-Programme:

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

Laden Sie den Quellcode der obligatorischen NGINX-Abhängigkeiten herunter und extrahieren Sie ihn:

# 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

Installieren Sie optionale NGINX-Abhängigkeiten:

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

Alle aufräumen.tar.gzDateien. Wir brauchen sie nicht mehr:

rm -rf *.tar.gz

Geben Sie das NGINX-Quellverzeichnis ein:

cd ~/nginx-1.15.0

Für gute Zwecke listen Verzeichnisse und Dateien auf, die den NGINX-Quellcode zusammensetzen mittreeDienstprogramm:

tree -L 2 .

Kopieren Sie die NGINX-Handbuchseite nach/usr/share/man/man8/Verzeichnis:

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

Nginx manpage

Als Hilfe erhalten Sie eine vollständige Liste der aktuellen NGINX-Kompilierungszeitoptionen, wenn Sie diese ausführen:

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

Konfigurieren, kompilieren und installieren Sie 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

Nachdem Sie NGINX erstellt haben, navigieren Sie zu Home (~) Verzeichnis:

cd ~

Symlink/usr/lib/nginx/moduleszu/etc/nginx/modulesVerzeichnis.etc/nginx/modulesist ein Standardplatz für NGINX-Module:

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

Drucken Sie die NGINX-Version, die Compiler-Version und die Skriptparameter:

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
# . . .
# . . .

NGINX-Systemgruppe und Benutzer anlegen:

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

Überprüfen Sie die NGINX-Syntax und mögliche Fehler:

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

Erstellen Sie eine NGINX Systemdatei:

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

Kopieren/Einfügen des folgenden Inhalts in die Datei/etc/systemd/system/nginx.serviceDatei:

[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

Aktivieren Sie NGINX so, dass es beim Booten startet und starten Sie NGINX sofort:

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

Überprüfen Sie, ob NGINX nach einem Neustart automatisch gestartet wird:

sudo systemctl is-enabled nginx.service
# enabled

Überprüfen Sie, ob NGINX läuft, indem Sie einen der folgenden Befehle ausführen:

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

Sie können auch Ihren Browser öffnen und zu Ihrer Domain/IP-Adresse navigieren, um die Standard-NGINX-Seite anzuzeigen. Das ist ein Indikator dafür, dass NGINX funktionsfähig ist.

Nginx Startseite

Unkomplizierte Firewall erstellen (UFW) NGINX-Anwendungsprofil:

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

Kopieren/Einfügen des folgenden Inhalts in die Datei/etc/ufw/applications.d/nginxDatei:

[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

Stellen Sie sicher, dass UFW-Anwendungsprofile erstellt und erkannt werden:

sudo ufw app list

# Available applications:
 # Nginx Full
 # Nginx HTTP
 # Nginx HTTPS
 # OpenSSH

NGINX standardmäßig, erzeugt Backup.defaultDateien in/etc/nginx. Entfernen.defaultDateien von/etc/nginxVerzeichnis:

sudo rm /etc/nginx/*.default

Platzieren Sie die Syntaxhervorhebung der NGINX-Konfiguration für den Vim-Editor in der Datei~/.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/

HINWEIS: Wenn Sie den obigen Schritt ausführen, erhalten Sie eine schöne Syntaxhervorhebung beim Bearbeiten von NGINX-Konfigurationsdateien im Vim-Editor.

Nginx Syntax-Hervorhebung in Vim

Erstellenconf.d,snippets,sites-availableundsites-enabledVerzeichnisse in/etc/nginxVerzeichnis:

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

Ändern von Berechtigungen und Gruppenbesitz von NGINX-Protokolldateien:

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

Erstellen Sie die Logrotationskonfiguration für NGINX.

sudo vim /etc/logrotate.d/nginx

Füllen Sie die Datei mit dem untenstehenden Text, speichern Sie sie dann und verlassen Sie sie:

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

Entfernen Sie alle heruntergeladenen Dateien aus dem Heimatverzeichnis:

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

Das ist es. Das ist es. Jetzt haben Sie die neueste Version von NGINX installiert, indem Sie sie aus dem Quellcode erstellen. Es wird statisch gegen einige wichtige Bibliotheken wie OpenSSL kompiliert. Häufig ist die vom System bereitgestellte Version von OpenSSL veraltet. Durch die Verwendung dieser Methode der Installation mit einer neueren Version von OpenSSL können Sie die Vorteile neuer Verschlüsselungen nutzen, wie zum BeispielCHACHA20_POLY1305und Protokolle wieTLS 1.3die in OpenSSL verfügbar sein werden.1.1.1.Außerdem können Sie durch die Kompilierung Ihrer eigenen Binärdatei die Funktionalität Ihres NGINX anpassen, was viel flexibler ist als die Installation einer vorgefertigten Binärdatei.

Das könnte Dich auch interessieren …