introduction
Nginx est un logiciel de serveur Web open source conçu avec un haut niveau de simultanéité à l'esprit, qui peut être utilisé comme serveur HTTP / HTTPS, serveur proxy inverse, serveur proxy de messagerie, équilibreur de charge logicielle, terminateur TLS, serveur de mise en cache et plus encore!
Il s'agit d'un logiciel très modulaire. Même certaines des parties apparemment «intégrées» du logiciel, telles que GZIP ou SSL, sont en fait créées en tant que modules qui peuvent être activés et désactivés pendant la construction.
Il a des modules de base (natifs) et des modules tiers (externes) créés par la communauté. À l'heure actuelle, il existe plus d'une centaine de modules tiers que nous pouvons utiliser.
Écrit en C, c'est un logiciel rapide et léger.
L'installation de Nginx à partir du code source est relativement facile - téléchargez la dernière version du code source Nginx, configurez, compilez et installez-la.
Vous devrez choisir de télécharger la version principale ou une version stable, mais leur construction est la même.
Dans ce guide, nous allons compiler une version principale de Nginx sur Debian 10 (buster). Nous utiliserons tous les modules disponibles dans la version open-source de Nginx.
Pourquoi compiler et installer Nginx à partir des sources
Vous vous demandez probablement pourquoi compiler Nginx à partir d'une source alors que vous pouvez utiliser des packages préparés. Voici quelques raisons pour lesquelles vous voudrez peut-être compiler vous-même un logiciel spécifique:
- Pour contrôler les options de configuration.
- Pour installer le logiciel où vous le souhaitez. Vous pouvez même installer plusieurs versions différentes du même logiciel.
- Pour contrôler la version que vous installez. Les distributions ne restent pas toujours à jour avec les dernières versions de tous les packages, en particulier les modules complémentaires des packages logiciels.
- Pour mieux comprendre le fonctionnement du logiciel.
Version stable vs version principale
Nginx Open Source est disponible en deux versions:
- Mainline - Comprend les dernières fonctionnalités et corrections de bugs et est toujours à jour. Il est fiable, mais il peut inclure certains modules expérimentaux, et il peut également contenir un certain nombre de nouveaux bogues.
- Stable - N'inclut pas toutes les dernières fonctionnalités, mais a des corrections de bogues critiques qui sont toujours rétroportées vers la version principale.
Modules principaux vs modules tiers
Nginx propose deux types de modules que vous pouvez utiliser: les modules de base et les modules tiers.
Les développeurs principaux de Nginx construisent des modules de base et ils font partie du logiciel lui-même.
La communauté crée des modules tiers et vous pouvez les utiliser pour étendre les fonctionnalités. Il existe de nombreux modules tiers utiles.
Modules statiques vs modules dynamiques
Des modules statiques existent dans Nginx depuis la toute première version. Des modules dynamiques ont été introduits avec Nginx 1.9.11+ en février 2016.
Avec les modules statiques, un ensemble de modules qui constituent un binaire Nginx est fixé au moment de la compilation par le ./configurescript. Utilisation de modules statiques --with-foo_bar_moduleou --add-module=PATHsyntaxe.
Pour compiler un module de base (standard) comme dynamique, nous ajoutons =dynamicpar exemple --with-http_image_filter_module=dynamic.
Pour compiler un module tiers comme dynamique, nous utilisons la --add-dynamic-module=/path/to/modulesyntaxe, puis nous les chargeons en utilisant la load_moduledirective dans le contexte global du nginx.conffichier.
Exigences pour construire Nginx à partir de la source
En comparaison avec certains autres logiciels UNIX / Linux, Nginx est assez léger et n'a pas beaucoup de dépendances de bibliothèque. La configuration de construction par défaut dépend de seulement 3 bibliothèques à installer: OpenSSL / LibreSSL / BoringSSL, Zlib et PCRE.
- Exigences obligatoires:
- Exigences facultatives:
REMARQUE : Nginx peut également être compilé avec les bibliothèques de chiffrement LibreSSL et BoringSSL au lieu d'OpenSSL.
Avant que tu commences
Vérifiez la version Debian.
lsb_release -ds
# Debian GNU/Linux 10 (buster)
Créez un utilisateur régulier avec sudoaccès.
adduser johndoe --gecos "John Doe"
usermod -aG sudo johndoe
REMARQUE : remplacez johndoepar votre nom d'utilisateur .
Passez à un nouvel utilisateur.
su - johndoe
Configurez le fuseau horaire.
sudo dpkg-reconfigure tzdata
Mettez à jour le logiciel de votre système d'exploitation.
sudo apt update && sudo apt upgrade -y
Installez les packages nécessaires.
sudo apt install -y software-properties-common ufw
Construire Nginx à partir de la source
Nginx est un programme écrit en C, vous devrez donc d'abord installer un outil de compilation. Installez build-essential, gitet tree.
sudo apt install -y build-essential git tree
Téléchargez la dernière version principale du code source Nginx et décompressez l'archive du code source. Le code source de Nginx est distribué sous forme d'archive compressée, comme la plupart des logiciels Unix et Linux.
wget https://nginx.org/download/nginx-1.17.2.tar.gz && tar zxvf nginx-1.17.2.tar.gz
Téléchargez le code source des dépendances Nginx obligatoires et extrayez-le.
# PCRE version 8.43
wget https://ftp.pcre.org/pub/pcre/pcre-8.43.tar.gz && tar xzvf pcre-8.43.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.1c
wget https://www.openssl.org/source/openssl-1.1.1c.tar.gz && tar xzvf openssl-1.1.1c.tar.gz
Installez les dépendances Nginx facultatives.
sudo apt install -y perl libperl-dev libgd3 libgd-dev libgeoip1 libgeoip-dev geoip-bin libxml2 libxml2-dev libxslt1.1 libxslt1-dev
Nettoyez tous les .tar.gzfichiers. Nous n'en avons plus besoin.
rm -rf *.tar.gz
Entrez dans le répertoire source de Nginx.
cd ~/nginx-1.17.2
Pour une bonne mesure, répertoriez les répertoires et les fichiers qui composent le code source de Nginx avec tree.
tree -L 2 .
Copiez la page de manuel dans /usr/share/man/man8/.
sudo cp ~/nginx-1.17.2/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
Pour obtenir de l'aide, vous pouvez voir une liste complète des options de compilation Nginx à jour en exécutant ce qui suit.
./configure --help
# To see want core modules can be built as dynamic run:
./configure --help | grep -F =dynamic
Configurez, compilez et installez 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.17.2 \
--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.43 \
--with-pcre-jit \
--with-zlib=../zlib-1.2.11 \
--with-openssl=../openssl-1.1.1c \
--with-openssl-opt=no-nextprotoneg \
--with-debug
make
sudo make install
Après la compilation, accédez à votre ~répertoire home ( ).
cd ~
Lien symbolique /usr/lib/nginx/modulesvers /etc/nginx/modules. Il s'agit d'un emplacement standard pour les modules Nginx.
sudo ln -s /usr/lib/nginx/modules /etc/nginx/modules
Imprimez la version Nginx, la version du compilateur et configurez les paramètres de script.
sudo nginx -V
# nginx version: nginx/1.17.2 (Debian)
# built by gcc 8.3.0 (Debian 8.3.0-6)
# built with OpenSSL 1.1.1c 28 May 2019
# TLS SNI support enabled
# configure arguments: --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib/nginx/modules . . .
# . . .
# . . .
Créez un groupe système et un utilisateur Nginx.
sudo adduser --system --home /nonexistent --shell /bin/false --no-create-home --disabled-login --disabled-password --gecos "nginx user" --group nginx
# Check that user and group are created
sudo tail -n 1 /etc/passwd /etc/group /etc/shadow
Vérifiez la syntaxe Nginx et les erreurs potentielles.
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
Créez un fichier d'unité systemd Nginx.
sudo vim /etc/systemd/system/nginx.service
Remplissez le /etc/systemd/system/nginx.servicefichier avec le contenu suivant.
[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
Activez Nginx pour démarrer au démarrage et démarrez Nginx immédiatement.
sudo systemctl enable nginx.service
sudo systemctl start nginx.service
Vérifiez si Nginx démarre automatiquement après un redémarrage.
sudo systemctl is-enabled nginx.service
# enabled
Vérifiez le statut.
sudo systemctl status nginx.service
REMARQUE : vous pouvez vérifier que Nginx fonctionne en accédant au domaine ou à l'adresse IP de votre site dans un navigateur Web. Vous verrez la page d'accueil de Nginx. C'est un indicateur que Nginx est opérationnel sur votre VPS.
Créez un profil d'application UFW Nginx.
sudo vim /etc/ufw/applications.d/nginx
Copiez / collez le contenu suivant dans le /etc/ufw/applications.d/nginxfichier.
[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
Validez que les profils d'application UFW sont créés et reconnus.
sudo ufw app list
# Available applications:
# Nginx Full
# Nginx HTTP
# Nginx HTTPS
# OpenSSH
Nginx, par défaut, génère des .defaultfichiers de sauvegarde dans /etc/nginx. Supprimez les .defaultfichiers du /etc/nginxrépertoire.
sudo rm /etc/nginx/*.default
Placez la coloration syntaxique de la configuration Nginx pour l'éditeur Vim dans ~/.vim.
# For regular non-root user
mkdir ~/.vim/
cp -r ~/nginx-1.17.2/contrib/vim/* ~/.vim/
# For root user
sudo mkdir /root/.vim/
sudo cp -r ~/nginx-1.17.2/contrib/vim/* /root/.vim/
REMARQUE : En effectuant l'étape ci-dessus, vous obtiendrez une belle coloration syntaxique lors de la modification des fichiers de configuration Nginx dans l'éditeur Vim.
Créer conf.d, snippets, sites-availableet sites-enabledrépertoires /etc/nginx.
sudo mkdir /etc/nginx/{conf.d,snippets,sites-available,sites-enabled}
Modifiez les autorisations et la propriété de groupe des fichiers journaux Nginx.
sudo chmod 640 /var/log/nginx/*
sudo chown nginx:adm /var/log/nginx/access.log /var/log/nginx/error.log
Créez une configuration de rotation des journaux pour Nginx.
sudo vim /etc/logrotate.d/nginx
Remplissez le fichier avec le texte suivant, puis enregistrez et quittez.
/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
}
Supprimez tous les fichiers téléchargés du répertoire personnel.
cd ~
rm -rf nginx-1.17.2/ openssl-1.1.1c/ pcre-8.43/ zlib-1.2.11/
Résumé
C'est tout. Maintenant, vous avez installé la dernière version de Nginx. Il est compilé statiquement par rapport à certaines bibliothèques importantes comme OpenSSL. Souvent, la version d'OpenSSL fournie par le système est obsolète. En utilisant cette méthode d'installation avec une version plus récente d'OpenSSL, vous pouvez tirer parti des chiffrements modernes comme CHACHA20_POLY1305et des protocoles comme TLS 1.3 qui sont disponibles dans OpenSSL 1.1.1. De plus, en compilant votre propre binaire, vous êtes en mesure de personnaliser les fonctionnalités de votre Nginx, ce qui est beaucoup plus flexible que d'installer un binaire pré-construit.