Voir également pour générer des fichiers de configurations:
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
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.
# É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/