Les deux révisions précédentes Révision précédente Prochaine révision | Révision précédente |
serveurs:installation:web-srv:nginx [2021/03/24 11:34] – [Activer les prisons Fail2ban pour Nginx] jpmilcent | serveurs:installation:web-srv:nginx [2023/08/03 13:47] (Version actuelle) – [Ajouter le support de GeoIp] jpmilcent |
---|
| |
===== Installation ===== | ===== Installation ===== |
* Installer //Nginx// et //Certbot// : ''sudo aptitude install supervisor nginx python3-certbot-nginx python3-certbot-dns-ovh '' | * Installer //Nginx// et //Certbot// : ''sudo apt install nginx python3-certbot-nginx python3-certbot-dns-ovh '' |
* Activer le redémarrage automatique du service : ''systemctl enable nginx.service'' | * Activer le redémarrage automatique du service : ''systemctl enable nginx.service'' |
* Activer le démarrage automatique du service Systemd lançant deux fois par jour ''certbot renew'' : ''systemctl enable certbot.timer'' | * Activer le démarrage automatique du service Systemd lançant deux fois par jour ''certbot renew'' avec : ''systemctl enable certbot.timer'' |
* Vérifier le status et démarrer le service si nécessaire : ''systemctl status certbot.timer'' | * Vérifier le status et démarrer le service si nécessaire : ''systemctl status certbot.timer'' |
| |
===== Modification du format des logs ===== | ===== Modification du format des logs ===== |
Modifier les logs d'accès (ajout d'infos) pour Telegraf et GoAccess : | Modifier les logs d'accès (ajout d'infos) pour Telegraf et GoAccess : |
* Éditer la conf de Nginx ''vi /etc/nginx/nginx.conf'' et remplacer la section Log contenant :<code nginx> | * Éditer la conf de Nginx ''vi /etc/nginx/nginx.conf'' et remplacer dans la section ''http {...}'' contenant :<code nginx> |
access_log /var/log/nginx/access.log; | access_log /var/log/nginx/access.log; |
error_log /var/log/nginx/error.log; | |
</code> | </code> |
* Par le contenu suivant : <code nginx> | * Par le contenu suivant : <code nginx> |
# Enabling request time | # Enabling request time |
log_format enhanced-fmt '$remote_addr - $remote_user [$time_local] ' | log_format enhanced-fmt '$remote_addr $host $remote_user [$time_local] ' |
'"$request" $status $body_bytes_sent ' | '"$request" $status $body_bytes_sent ' |
'"$http_referer" "$http_user_agent" ' | '"$http_referer" "$http_user_agent" ' |
'rt=$request_time uct="$upstream_connect_time" uht="$upstream_header_time" urt="$upstream_response_time" ' | 'rt="$request_time" uct="$upstream_connect_time" uht="$upstream_header_time" urt="$upstream_response_time" ' |
'gzr="$gzip_ratio" '; | 'gzr="$gzip_ratio" '; |
| |
access_log /var/log/nginx/access.log enhanced-fmt; | access_log /var/log/nginx/access.log enhanced-fmt; |
error_log /var/log/nginx/error.log; | |
</code> | </code> |
| **ATTENTION** : vérifier la présence du nom de domaine de l'hôte virtuel (''$host'') dans les logs d’accès. |
===== Configuration de la compression ===== | ===== Configuration de la compression ===== |
Activer la compression Gzip du contenu renvoyé par Nginx pour tous les types Mime (JS, CSS...) : | Activer la compression Gzip du contenu renvoyé par Nginx pour tous les types Mime (JS, CSS...) : |
text/x-cross-domain-policy; | text/x-cross-domain-policy; |
</code> | </code> |
| |
| ===== Configuration de la taille maximum des fichiers téléverssables ===== |
| * Il est nécessaire d'ajouter la ligne suivante soit au niveau du fichier de configuration globale (''vi /etc/nginx/nginx.conf'') soit dans la section ''server'' du fichier de configuration d'un domaine : <code nginx> |
| client_max_body_size 12M; |
| </code> |
| * Indiquer la taille maximum des fichiers téléverssables en Méga Octets. Dans l'exemple ci-dessus, 12Mo. |
| |
===== Ajouter le support de GeoIp ===== | ===== Ajouter le support de GeoIp ===== |
* Vérifier le support de GeoIp par Ngninx : ''nginx -V 2>&1 | grep -o with-http_geoip_module'' | * Vérifier le support de GeoIp par Ngninx : ''nginx -V 2>&1 | grep -o with-http_geoip_module'' |
* GeoIP n'est plus maintenu => geoip2 dont le module et le support dans Nginx nécessite [[https://github.com/leev/ngx_http_geoip2_module#user-content-download-maxmind-geolite2-database-optional|la compilation du module]] | * GeoIP n'est plus maintenu => geoip2 dont le module et le support dans Nginx nécessite [[https://github.com/leev/ngx_http_geoip2_module#user-content-download-maxmind-geolite2-database-optional|la compilation du module]] mais depuis Debian 11 un module ''GeoIP2'' existe dans [[https://packages.debian.org/bullseye/nginx-full| le paquet pour la version Debian 11 Bullseye]]. |
* À voir plus tard... | * Debian 11+ : installer le module avec : ''apt install libnginx-mod-http-geoip2'' |
* Apparemment, un module ''GeoIP2'' existe dans [[https://packages.debian.org/bullseye/nginx-full| le paquet pour la version Debian 11 Bullseye]]. A voir lors de la mise à jour vers Debian 11. | |
| |
===== Ajouter le support des fichiers d'authentification HTTP ===== | ===== Ajouter le support des fichiers d'authentification HTTP ===== |
* Installer le paquet suivant : ''aptitude install apache2-utils'' | * Installer le paquet suivant : ''apt install apache2-utils'' |
* Pour créer une fichier //.htpasswd// : ''htpasswd -c /etc/nginx/.htpasswd <user-name-1>'' | * Pour créer une fichier //.htpasswd// : ''htpasswd -c /etc/nginx/.htpasswd <user-name-1>'' |
* Ensuite, pour ajouter des utilisateurs (sans l'option ''-c'') : ''htpasswd /etc/nginx/.htpasswd <user-name-2>'' | * Ensuite, pour ajouter des utilisateurs (sans l'option ''-c'') : ''htpasswd /etc/nginx/.htpasswd <user-name-2>'' |
* Pour limiter l'accès, utilisre ensuite les directions suivantes dans une section ''server'' ou ''location'' : <code nginx> | * Pour limiter l'accès, utiliser ensuite les directions suivantes dans une section ''server'' ou ''location'' : <code nginx> |
auth_basic "Zone à accès restreint"; | satisfy any; |
| allow <ip-v4-instance>; |
| deny all; |
| auth_basic "Zone restreinte"; |
auth_basic_user_file /etc/nginx/.htpasswd; | auth_basic_user_file /etc/nginx/.htpasswd; |
</code> | </code> |
* Relancer //Fail2ban// : ''systemctl restart fail2ban.service'' | * Relancer //Fail2ban// : ''systemctl restart fail2ban.service'' |
===== Éviter l'erreur "bind() to 172.18.5.1:9090 failed (99: Cannot assign requested address)" ===== | ===== Éviter l'erreur "bind() to 172.18.5.1:9090 failed (99: Cannot assign requested address)" ===== |
* Au redémarrage de la machine, il arrive que Docker ne soit pas complètement lancé. Cela provoque l'erreur : ''bind() to 172.18.5.1:9090 failed (99: Cannot assign requested address)'' et cela empêche Nginx de démarrer. Il faut donc le lancer manuellement : ''systemctl start nginx''. L'erreur était due au fichier ///etc/nginx/conf.d/status.conf// qui contenait une ligne '' listen 172.18.5.1:9090; ''. Cette ligne n'est finalement pas utile car il suffit d'écouter sur le port 9090 avec la commande '' listen 9090; '' les paramètres ''allow <...> ;'' suffisent à limiter l'accès. Le port est bien accessible sur 127.0.0.1 comme sur 172.18.5.1 (pour un accès dans un container Docker). | <note info>Au redémarrage de la machine, il arrive que Docker ne soit pas complètement lancé. Cela provoque l'erreur : ''bind() to 172.18.5.1:9090 failed (99: Cannot assign requested address)'' et cela empêche Nginx de démarrer. Il faut donc le lancer manuellement : ''systemctl start nginx''. L'erreur était due au fichier ///etc/nginx/conf.d/status.conf// qui contenait une ligne '' listen 172.18.5.1:9090; ''. Cette ligne n'est finalement pas utile car il suffit d'écouter sur le port 9090 avec la commande '' listen 9090; '' les paramètres ''allow <...> ;'' suffisent à limiter l'accès. Le port est bien accessible sur 127.0.0.1 comme sur 172.18.5.1 (pour un accès dans un container Docker).</note> |
* Pour éviter ce problème, nous avons modifier le fichier ///etc/nginx/conf.d/status.conf// comme indiqué précédement. Deplus, nous avons modifié le script Systemd de Nginx : ///lib/systemd/system/nginx.service// | * Pour éviter ce problème, nous avons modifier le fichier ///etc/nginx/conf.d/status.conf// comme indiqué précédement. Deplus, nous avons modifié le script Systemd de Nginx : ///lib/systemd/system/nginx.service// |
* Afin d'éviter que les modifications effectuées dans le fichier ///lib/systemd/system/nginx.service// soient écrasées à chaque mise à jour de Nginx, vous devez ajouter un fichier qui surchargera les valeurs par défaut. | * Afin d'éviter que les modifications effectuées dans le fichier ///lib/systemd/system/nginx.service// soient écrasées à chaque mise à jour de Nginx, vous devez ajouter un fichier qui surchargera les valeurs par défaut. |
* Vérifier la présence du texte //(overrided)// dans la description du service : '' systemctl status nginx '' | * Vérifier la présence du texte //(overrided)// dans la description du service : '' systemctl status nginx '' |
* Redémarrer la machine, attendre son redémarrage, s'y reconnecter et s'assurer que Nginx est bien démarré : '' systemctl status nginx '' | * Redémarrer la machine, attendre son redémarrage, s'y reconnecter et s'assurer que Nginx est bien démarré : '' systemctl status nginx '' |
| |
| ===== Création d'un certificat SSL avec Certbot ===== |
| D'une manière générale la démarche à suivre pour créer un certificat SSL chez Letsencrypt à l'aide de Certbot : |
| * Installer un certificat SSL via Certbot (Letsencrypt) : ''<nowiki> certbot --nginx -d <domaine-principal> -d <alias-du-domaine-principal> </nowiki>'' |
| * Ex. pour PACA : ''<nowiki> certbot --nginx -d expert.silene.eu -d geonature.silene.eu </nowiki>'' |
| * Lors de la première utilisation de certbot sur un serveur, il est nécessaire d'indiquer l'email de l'utilisateur qui sera prévenu en cas de besoin de renouvellement d'un domaine : |
| * Email à fournir : adminsys@<domaine-sinp> |
| * Pour les 2 questions suivantes, répondre : A -> N |
| * Lors de la demande de redirection du HTTP vers HTTPS, il est souhaitable de réponde 1 afin de le configurer manuellement comme indiqué ci-dessous. Dans le cas contraire, répondre 2. |
| * Si vous avez répondu 2, vous pouvez tester immédiatement la redirection auto de HTTP vers HTTPS : <nowiki>http://<domaine-principal>/</nowiki> -> doit rediriger vers HTTPS automatiquement |
| * Tester les configurations SSL : |
| * https://www.ssllabs.com/ssltest/analyze.html?d=<domaine-principal> |
| * https://www.ssllabs.com/ssltest/analyze.html?d=<alias-du-domaine-principal> |
| * Exemple de fichier de conf Nginx contenant la redirection HTTP vers HTTPS (en 302 afin d'éviter d'éventuel problème de mise en cache par les navigateurs toujours difficile à résoudre) et le HTTP2 : <code nginx> |
| server { |
| listen 443 ssl http2; |
| listen [::]:443 ssl http2; |
| |
| server_name <domaine-principal>; |
| root /chemine/vers/dossier/racine/html; |
| |
| # Exemple pour une API Python utilisant Gunicorn |
| location ^~ "/api/" { |
| proxy_set_header X-Forwarded-Host $host:$server_port; |
| proxy_set_header X-Forwarded-Server $host; |
| proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; |
| proxy_set_header X-Forwarded-Proto $scheme; |
| |
| # Set timeout like Gunicorn in API |
| proxy_read_timeout 300s; |
| proxy_connect_timeout 75s; |
| proxy_pass http://127.0.0.1:8000/;# ATTENTION : bien mettre un slash final ! Sinon => 404 |
| } |
| |
| ssl_certificate /etc/letsencrypt/live/<domaine-principal>/fullchain.pem; # managed by Certbot |
| ssl_certificate_key /etc/letsencrypt/live/<domaine-principal>/privkey.pem; # managed by Certbot |
| include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot |
| ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot |
| } |
| |
| server { |
| listen 443 ssl http2; |
| listen [::]:443 ssl http2; |
| server_name <alias-domaine-principal>; |
| |
| ssl_certificate /etc/letsencrypt/live/<domaine-principal>/fullchain.pem; # managed by Certbot |
| ssl_certificate_key /etc/letsencrypt/live/<domaine-principal>/privkey.pem; # managed by Certbot |
| include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot |
| ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot |
| |
| return 302 https://<alias-domaine-principal>$request_uri; |
| } |
| |
| server { |
| listen 80; |
| listen [::]:80; |
| server_name <domaine-principal> <alias-domaine-principal>; |
| return 302 https://<domaine-principal>$request_uri; |
| } |
| </code> |
| |
| ===== Suppression d'un certificat SSL avec Certbot ===== |
| Si vous souhaitez supprimer une certificat SSL créé par l'intermédiaire de Certbot, utiliser la commande : ''<nowiki> sudo certbot delete --cert-name <domaine>.<ext> </nowiki>'' |
| |