Debian 10 64 Bits - Installation de Nginx en tant que Reverse Proxy Web

Auteur : Vince NADUS
Date de publication : July 20, 2021

Voir également pour générer des fichiers de configurations:

https://nginxconfig.io/

Merci à https://buzut.net/optimiser-nginx/

Ajout des backports

/etc/apt/sources.list

deb http://nginx.org/packages/mainline/debian/ stretch nginx
deb http://deb.debian.org/debian stretch-backports main
wget http://nginx.org/keys/nginx_signing.key
apt-key add nginx_signing.key
apt-get update
apt-get install nginx

Connaitre le nombre de processeur de la machine afin de les allouer à Nginx (worker_processes)

grep ^processor /proc/cpuinfo | wc -l

/etc/nginx/nginx.conf

worker_processes 4;
events {
worker_connections 8096;
multi_accept on;
use epoll;
}
worker_rlimit_nofile 40000;
http {
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 15;
# Your content here ..
}

Calcule du nombre de connexions :

worker_processes * worker_connections (= 32384 dans notre exemple) Base de la configuration du proxyhttp {
# Basic reverse proxy server
upstream backend {
server 127.0.0.1:4433;
}
# *:80 -> 127.0.0.1:4433
server {
listen 80;
server_name example.com;
## send all traffic to the back-end
location / {
proxy_pass http://backend;
proxy_redirect off;
proxy_set_header X-Forwarded-For $remote_addr;
}
}
}

Les buffers

client_body_buffer_size 16K;
client_header_buffer_size 1k;
client_max_body_size 20m;
large_client_header_buffers 2 3k;

Contrôle de mise en mémoire tampon

Pour les cas de client rapide (Exemple serveur backend physique ou VM)

proxy_buffering off;
proxy_buffer_size 128k;
proxy_buffers 100 128k;

Pour les cas de client plus lent que le serveur proxy (Exemple serveur backend LXC de taille modeste)

proxy_buffering on;
proxy_buffer_size 1k;
proxy_buffers 12 4k;

Les timeouts

Les valeurs indiquées sont généreuses à baisser si fort traffic

client_body_timeout 30;
client_header_timeout 10;
keepalive_timeout 30;
send_timeout 60;
keepalive_requests 100;

Compression Gzip judicieuse

Prend en charge les fichiers de 10 Ko (buzut nous dit pour lui 1 Ko) et de type texte ou assimilé (pas les images, etc …)
Voir également où en est le développement de Brotli qui est bien meilleure que Gzip

gzip on;
gzip_comp_level 5;
gzip_min_length 10240;
gzip_proxied any;
gzip_types
application/atom+xml
application/javascript
application/json
application/ld+json
application/manifest+json
application/rss+xml
application/vnd.geo+json
application/vnd.ms-fontobject
application/x-font-ttf
application/x-web-app-manifest+json
application/xhtml+xml
application/xml
font/opentype
image/bmp
image/svg+xml
image/x-icon
text/cache-manifest
text/css
text/plain
text/vcard
text/vnd.rim.location.xloc
text/vtt
text/x-component
text/x-cross-domain-policy;
gzip_disable "MSIE [1-6]\.";

Mise en cache basique

location ~* \.(jpg|jpeg|gif|png|css|js|ico|xml)$ {
access_log off;
log_not_found off;
expires 30d;
}

Mise en cache de fichiers statiques limite les I/O

A placer dans la section server d’un vhost ou dans le block http du fichier nginx.conf

# REMARQUE : vous ne devez exécuter cette option que si vous n’éditez pas les fichiers au moment où vous les fournissez.
# Étant donné que les accès aux fichiers sont mis en cache, tous les fichiers 404 le seront également.
# De même, les tailles de fichiers seront mises en cache et, si vous les modifiez, le contenu servi sera obsolète.
open_file_cache max=2000 inactive=5m;
open_file_cache_valid 2m;
open_file_cache_min_uses 2;
open_file_cache_errors on;

Mise en cache et contrôle de l’expiration

Exemple mettant en cache les fichier *.html, etc .. pendant 30 minutes

http {
#
# The path we'll cache to.
#
proxy_cache_path /tmp/cache levels=1:2 keys_zone=cache:60m max_size=1G;
}
## send all traffic to the back-end
location / {
proxy_pass http://backend;
proxy_redirect off;
proxy_set_header X-Forwarded-For $remote_addr;
location ~* \.(html|css|jpg|gif|ico|js)$ {
proxy_cache cache;
proxy_cache_key $host$uri$is_args$args;
proxy_cache_valid 200 301 302 30m;
expires 30m;
proxy_pass http://backend;
}
}

Le logging

Utiliser un buffer à la place de l’écriture dans un fichier

access_log /var/log/nginx/access.log combined buffer=10m flush=5m;

La spéciale TLS

ssl_session_cache shared:SSL:10m;
ssl_session_timeout 24h;
ssl_buffer_size 1400;

Demander au serveur la vérification du certificat pour le délivrer au client (en lieu et place du client lui même)

ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.8.8 8.8.4.4 216.146.35.35 216.146.36.36 valid=60s;
resolver_timeout 2s;

Optimisation TCP

sendfile on;
tcp_nopush on;
tcp_nodelay on;

Regardez également

https://memos.nadus.fr/nginx-reverse-proxy-resoudre-probleme-durl-mod_rewrite/

https://memos.nadus.fr/nginx-controle-dacces-par-ip/

https://memos.nadus.fr/lnmp-linux-nginx-mariadb-php7/

https://memos.nadus.fr/fail2ban-configuration-pour-ssh-et-nginx/