Installer un SERVEUR NGINX
sous DEBIAN 10 & Proxmox

 

 

Hôtes virtuels : domoticz et des customs pages , zoneminder, Nginx, …

J’ai installé docker et portainer.io sur proxmox sans problème mais impossible d’utiliser les images docker ; j’ai abandonné d’autant que sur le net les avis sur docker sont partagés , un résumé :

"Le seul avantage de Docker est toutes les images de pré-construction sur dockerhub, mais à part cela, aucune raison d'utiliser docker ; sur Proxmox , LXC est en fait un meilleur choix. Les conteneurs LXC se comportent beaucoup plus comme des machines virtuelles que des conteneurs Docker, mieux adaptés à une grande partie du type d'applications exécutées sur un serveur domestique ".

 

 

Installation de NGINX (sous Proxmox 6.3 et Debian 10.7
Nginx est connu pour être un service web orienté vers la haute performance et je trouve la configuration des reverse proxy plus facile que sur Apache2

Pour la sécurité, en cas de coupures de courant, les VM reverse proxy doivent redémarrer automatiquement :

nginx1

 

Si cette erreur :

nginx2

Vérifier l’heure de proxmox

Configurer la box internet pour attribuer des IP statiques à nos différents serveurs installés, pour Nginx nous le ferons quand une adresse lui aura été attribuée.

nginx3


Pré requis : l’iso de Debian 10 Buster est téléchargé.
Création de la VM :

nginx4

nginx5

 

Accepter toutes les autres propositions (la taille du disque peut être réduite à 8Go)

Démarrer la VM et commencer l’Install de BUSTER

 

Debian 10 Buster
Tuto pour une installation complète de DEbian buster

 

nginx6

nginx7

Indiquer plutôt un sous-domaine sss.xxxx.ovh

Logiciels à installer, en rouge en option ,en plus du système de base :

- Une interface graphique
- Un serveur ssh
- Un serveur d’impression

nginx8


L’installation étant terminée, la VM démarre automatiquement

Indiquer login et mot de passe et demander l’IP du système :

nginx9

Connaitre l’IP du serveur avec la console de l' interface graphique :

ou :

nginx10

 

 

Préparer l'installation de Nginx

Lancer Putty : Putty permet de faire des copier/coller avec la console

nginx11

nginx12

nginx13


La commande visudo est un moyen sûr et sécurisé de modifier le fichier /etc/sudoers sur les systèmes UNIX et Linux. /etc/sudoers est essentiel pour obtenir un accès privilégié via la commande sudo .

Étant donné que le fichier sudoers détermine quels utilisateurs peuvent exécuter des tâches administratives, celles qui nécessitent des privilèges de super utilisateur, il est judicieux de prendre certaines précautions lors de sa modification, et c'est ce que fait visudo.
Avec une installation minimale , sudo n'est pas installé : l'installer

sudo apt install sudo

nginx111

Lancer visudo :

nginx14

Ou avec nano

nginx15


Quelques explications :

nginx16


On ajoute son nom d’utilisateur avec tous les privilèges :

nginx17

CTRL O , ENTER , CTRL X

Configuration NTP (synchronisation de l’horloge et date)

Installation de ntp :

nginx18

Modifier le fichier ntp de cette façon :

fichier existant :

nginx19

Fichier modifié : ajouter ces lignes :

server 0.europe.pool.ntp.org
server 1.europe.pool.ntp.org
server 2.europe.pool.ntp.org
server 3.europe.pool.ntp.org

nginx20

CTRL O , ENTER , CTRL X

Redémarrer le service ntp

nginx21

Vérifiez la connexion du serveur NTP aux pairs NTP et le résumé de leur état en exécutant la commande :

nginx22

L’astérisque indique la source horaire préférée.

Reconfigurer en choisissant bien Europe/Paris pour le fuseau horaire

dpkg-reconfigure tzdata ne fonctionne pas sous buster, utiliser :

nginx23

Choisir le continent et la ville

nginx24

nginx25

 

 

Installation de Nginx

Exécuter la mise à jour du système puis l’installation de Nginx

nginx26

Installer les pré-requis:

sudo apt install curl gnupg2 ca-certificates lsb-release

nginx112

ajouter le package Nginx à notre référentiel

echo "deb http://nginx.org/packages/mainline/debian `lsb_release -cs` nginx" \ | sudo tee /etc/apt/sources.list.d/nginx.list

nginx113

télécharger la clé de signature afin de vérifier l'authenticité

curl -fsSL https://nginx.org/keys/nginx_signing.key | sudo apt-key add -

nginx114

Installation:

nginx27

nginx28

nginx29

 

 

Exécuter Nginx

Lors de l'installation, Nginx est démarré et activé au démarrage du système.

nginx30

Si erreur ci-dessus exécuter les commandes suivantes:

nginx99

le statut est maintenant sans erreur

nginx31

Pour un démarrage automatique :

nginx32

Autres commandes:

 

 

 

Configuration d'un pare-feu de base :https://debian-facile.org/doc:systeme:ufw

Les serveurs Debian peuvent utiliser des pares-feux pour s'assurer que seules certaines connexions à des services spécifiques sont autorisées.

Installation du pare-feu UFW

nginx33

Pour éviter les règles conflictuelles qui peuvent être difficiles à déboguer n’utiliser qu’un seul pare feu

Une fois le processus d'installation terminé, vous pouvez vérifier l'état d'UFW :

nginx34

UFW est désactivé par défaut. L'installation n'activera pas automatiquement le pare-feu pour éviter un verrouillage du serveur.

Les politiques par défaut sont définies /etc/default/ufw et peuvent être modifiées à l'aide de sudo ufw default

Lors de l'installation d'un package avec apt , un profil d'application sera ajouté à /etc/ufw/applications.d
Pour connaitre la liste des profils disponibles sur le système :

nginx35

WWW : ce profil ouvre uniquement le port 80 (non chiffré)
WWW Cache: ce profil ouvre uniquement le port 8080 .
WWW Full : ce profil ouvre à la fois le port 80 et le port 443 (trafic chiffré TLS / SSL)
WWW Secure : ce profil ouvre uniquement le port 443.

 

Activation du pare feu : la connexion ssh peut être interrompue , dans ce cas avec la console proxmox il faudra autoriser le port 22

nginx115

nginx36

Autoriser Nginx sur le pare-feu :

nginx37

On peut le vérifier :

nginx39

Pour le port 22, connexion ssh :

sudo ufw allow 22

nginx100

 

 

Vérification avec un navigateur :

nginx40

la page d' accueil se trouve ici en "/usr/share/nginx/html pour afficher un domaine ou une page perso , il suffit de les placer dans un sous répertoire de html

nginx101

exemple avec cette page html à la racine de "~~/html/mon/"

nginx102

nginx103

 

 

Configuration de la box internet

Nous allons rediriger tout le trafic entrant sur notre réseau (côté WAN – internet) sur les ports 80 et 443, le 80 c’est le non sécurisé, le 443 c’est le SSL (sécurisé.)

Configurerons la box internet
J’utilise une box Free, connexion :

freebox1

freebox2


Ajoutez 2 règles :

freebox3

 

 

 

Pour completer, il faut ajouter à notre serveur une base de données et PHP

 

Installer la base de données MariaDB dans NGINX


nginx65

script de sécurité fourni pré installé avec MariaDB

nginx66

nginx67

Répondre ensuite Y à toutes les questions :

nginx68

Connexion à la BD ,
vous n'avez pas besoin mot de passe pour vous connecter en tant qu'utilisateur root

nginx69

 

Pour créer une BD et attribuer des privilèges:

CREATE DATABASE `database` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

Pour attribuer des privilèges à un utilisateur sur cette base de données.

GRANT SELECT, INSERT, UPDATE, DELETE ON `database`.* TO 'user'@'localhost';

pour attribuer tous les droits sur une base de données à un utilisateur:

GRANT ALL ON database.* TO 'user'@'localhost' IDENTIFIED BY 'password' WITH GRANT OPTION;

pour que les nouveaux droits attribués soient pris en compte :la requête FLUSH.

nginx70

Pour quitter mariaDB : exit

nginx104

Pour tester tester le nouvel utilisateur , se connecter en tant que cet utilisateur:

mariadb -u example_user -p

Lancer cette commande:

SHOW DATABASES;

nginx105

 

 

nginx71

 

 

Installer PHP dans NGINX, pour générer du contenu dynamique pour le serveur Web.

ajouter les référentiels pour PHP

sudo apt-get install software-properties-common

nginx86

packages à installer :

nginx87

nginx88

On vérifie que php est installé correctement et a démarré:

nginx89

Sécuriser PHP-FPM avec cgi.fix_pathinfo dans le fichier de configuration(souvent dans les tutos):
ce n'est pas nécessaire avec les versions de PHP >5.21
par contre il est utile d'augmentater la limite de la mémoire pour améliorer les performances et d'indiquer la time zone:

sudo nano /etc/php/7.3/fpm/php.ini

nginx38

nginx98

Pour chercher un mot dans nano: CTRL W (le fichier est très grand)

Autres options :

file_uploads = On
upload_max_filesize = 32M
max_execution_time = 300
post_max_size = 32M
max_input_time = 300
max_input_vars = 4440

 

La version 7.3 a été installée ;

Configuration de Nginx


- Ajouter nginx au groupe www-data
- Changer le propriétaire du répertoire où se trouve le site (/usr/share/nginx/html, /var/www/html, ...) en www-data
dans ce tuto le site se trouve dans "/usr/share/nginx/html"

nginx92

Si ce serveur n’a qu’un seul site ,nous n’avons besoin que d’une seule configuration PHP ( www.conf par défaut, le "pool"), on s'assure donc que ce fichier contient la configuration suivante:

nginx94

si le fichier est OK : CTRL X
sinon apès modification CTRL , ENTER , CTRL X


Si il y a plusieurs sites rattachés à ce serveur ,chaque pool php-fpm doit être configuré dans un fichier à l'intérieur du répertoire /etc/php7.3/fpm/pool.d.

 

Il suffit de copier le contenu du fichier précédent(www.conf) et de modifier au minimun les lignes:
- au début [www]. Renommez-le en [nom du site].
- modifiez les champs utilisateur et groupe
- modifiez le nom du fichier de socket: /run/php/php7.3-fpm.sock devient /run/php/php7.3-nom du site-fpm.sock.

exemple :

nginx90

 

[monitor]
user = michel
group = monitor
listen = /var/run/php/php7.3-monitor-fpm.sock

nginx95

 

 

Le fichier de configuration de Nginx doit contenir : user www-data;

nginx96

- Configuration de l’hôte virtuel (ici default.conf) devra être configuré comme suit :
Il faut remplacer le fichier existant /etc/nginx/conf.d/default.conf par celui-ci :

server {
    listen       80;
    server_name  localhost;

    root   /usr/share/nginx/html;
    index  index.php index.html index.htm;

   location / {
    if ($request_uri ~ ^/(.*)\.html$) {
        return 302 /$1;
        }
    }

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
        location ~ \.php$ {
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass   unix:/var/run/php/php7.3-fpm.sock;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include        fastcgi_params;
    }

}
sudo nano /etc/nginx/conf.d/default.conf

nginx93

redémarrer Nginx et créer un fichier php qui affichera les infos php

sudo systemctl restart nginx
nano /usr/share/nginx/html/phpinfo.php

nginx108

<?php
phpinfo();
?>

nginx116

Dans un navigateur:

php1

 

Cette configuration d'un hote virtuel est développé plus loin avec le https.

 

 

Installer PHPADMIN

logiciel web gratuit (open source) basé sur PHP pour gérer les serveurs de bases de données MySQL et MariaDB.

Il n’existe pas de package Debian 10 il faut télécharger l'archive tar sur le site officiel ,
vérifier le lien de la dernière mise à jour: https://www.phpmyadmin.net/
Le 10/02/2021 version 5.0.4

nginx106

Ajout des extensions php et téléchargement de phpMyAdmin
remplacer le numéro de version par le numéro de la version en cours.

su 
apt-get update & apt-get upgrade -y
apt install php-{mbstring,zip,gd,xml,pear,gettext,cgi}
wget https://files.phpmyadmin.net/phpMyAdmin/5.0.4/phpMyAdmin-5.0.4-all-languages.tar.gz

nginx97

nginx72

extraction de l’ archive:

Créer un repertoire (le nom que vous souhaitez) dans /usr/share/nginx/html ou /var/www ou /var/www/html suivant ou se trouve l'emplacement web , pour ce tuto :/usr/share/nginx/html , et extraire l'archive
mkdir /usr/share/nginx/html/phpmyadmin
tar xzf phpMyAdmin-* --strip-components=1 -C /usr/share/nginx/html/phpmyadmin

nginx73

 

Configuration de phpMyAdmin
, copie d’un fichier exemple modifié avec nano pour créer le fichier de configuration

cp /usr/share/nginx/html/phpmyadmin/config{.sample,}.inc.php
nano /usr/share/nginx/html/phpmyadmin/config.inc.php

nginx74

nginx75

pour le Blowfish Secret vous pouvez le gébérer en allant sur ce site:

nginx117

$cfg['blowfish_secret'] = '$1$mIMbRWxs$PjwPO3Mh8GcGyXqyS30UK.';

nginx76

En PHP pour mettre une ligne en commentaires : « // »

Décommenter les lignes ci-dessous :

nginx77

CTRL O , ENTER , CTRL X

Importez le create_tables.sql pour créer des tables pour phpMyAdmin ; vérifier le chemin du répertoire de "create_table.sql"

nginx78

Connexion à MariaDB :

Ajoutez un utilisateur (ici michel) et accordez lui l'autorisation à la base de données de phpMyAdmin.

GRANT ALL PRIVILEGES ON phpmyadmin.* TO 'pma'@'localhost' IDENTIFIED BY 'pmapass';
FLUSH PRIVILEGES;
exit;

nginx80

FLUSH PRIVILEGES; : commande pour que les privilèges soient pris en compte :

 

Configurer NGINX pour phpMyAdmin

Créez un fichier de configuration d'hôte virtuel pour phpmyadmin et tous les sites rattachés à ce serveur, de la même façon que le fichier default.conf, lors de l'installation de PHP..

cd /etc/nginx/conf.d 
sudo cp default.conf nginx.conf
sudo mv default.conf default.conf.save
sudo nano nginx.conf

nginx107

 

server {
   listen 80;
   server_name 192.168.1.7;
   root /usr/share/nginx/html/;

   location / {
      index index.php;
   }

## Images and static content is treated different
   location ~* ^.+.(jpg|jpeg|gif|css|png|js|ico|xml)$ {
      access_log off;
      expires 30d;
   }

   location ~ /\.ht {
      deny all;
   }

   location ~ /(libraries|setup/frames|setup/libs) {
      deny all;
      return 404;
   }

   location ~ \.php$ {
      include /etc/nginx/fastcgi_params;
      fastcgi_pass 127.0.0.1:9000;
      fastcgi_index index.php;
      fastcgi_param SCRIPT_FILENAME /usr/share/phpmyadmin$fastcgi_script_name;
   }
	}

 

nginx81

Créez un répertoire tmp pour phpmyadmin et modifiez l'autorisation.
Définissez la propriété du répertoire phpyyadmin.

nginx82

cette dernière commande change le propriétaire de tous les fichiers en www-data et le groupe en www-data.

On redémarre tous les services :

nginx84

Pour y accéder, en fonction de notre configuration, ouvrez le navigateur et entrez :
- en local l'adresse IP du serveur:IP/phpmyadmin
- distant : domaine/phpmyadmin ; il faut auparavant avoir fait une redirection du port 80 de la box vers l' IP du serveur nginx

nginx85

 

 

 

Création des noms de domaine pour les différents serveurs, domoticz, zoneminder, monitor, ….


Nom de domaine
Si vous avez souscrit un domaine chez OVH (2 Euros HT /an)

Pour ajouter une redirection, cliquez sur Zone DNS

ovh1

L’édition d’une zone DNS est une manipulation sensible ,

Tableau des différents types d’enregistrements :

Type d'enregistrement Description
A Permet de relier un nom de domaine à une adresse IP (IPv4). Par exemple, l'adresse IP du serveur où est hébergé votre site internet.
AAAA Permet de relier un nom de domaine à une adresse IP (IPv6). Par exemple, l'adresse IP du serveur où est hébergé votre site internet.
CNAME Permet à un nom de domaine d'utiliser la ou les adresses IP d'un autre nom de domaine en les reliant ensemble, selon le principe de l'alias. Par exemple, si www.mypersonaldomain.ovh est un alias de mypersonaldomain.ovh, cela indique que www.mypersonaldomain.ovh utilisera la ou les adresses IP de mypersonaldomain.ovh.
MX Permet de relier un nom de domaine à un serveur e-mail. Par exemple, l'adresse du serveur où est hébergé votre solution e-mail. Il est probable que le fournisseur dispose de plusieurs serveurs e-mail : plusieurs champs MX doivent donc être créés.
SRV Permet d'indiquer l'adresse d'un serveur gérant un service. Par exemple, cet enregistrement peut indiquer l'adresse d'un serveur SIP ou celle d'un serveur permettant à un logiciel de messagerie de se configurer automatiquement, selon le principe de l'autodiscover.
TXT Permet d'ajouter la valeur de votre choix (en format texte) aux paramètres DNS de votre nom de domaine. Cet enregistrement est souvent utilisé lors de processus de vérification.
SPF Permet d'éviter les potentielles usurpations d’identité avec les adresses e-mail utilisant votre nom de domaine. Par exemple, cet enregistrement peut indiquer que seul le serveur de votre fournisseur de solution e-mail doit être identifié comme étant une source légitime d'envoi. Apprenez-en plus grâce à notre documentation sur l'enregistrement SPF.
CAA Permet de lister les autorités de certification autorisées à délivrer des certificats SSL pour un nom de domaine.

 

Choisir le domaine de type A et modifier l’ adresse IP

ovh2

ovh3


Avec un navigateur taper votre nom de domaine : vous devez arriver sur la page d’accueil de votre serveur Nginx


Vous pouvez faire de même avec vos sous-domaines

 

 

Configuration des hôtes virtuels (sous domaines)

Lorsque vous utilisez le serveur Web Nginx, vous pouvez utiliser des hôtes virtuels pour héberger plusieurs domaines à partir d'un seul serveur, c’est ce que nous voulons faire avec le « Reverse Proxy »

Il ne faut pas confondre proxy et reverse proxy. Un proxy est un serveur qui se positionne généralement entre les utilisateurs et internet et qui permet à ceux-ci d'accéder à internet au travers son service de proxy. Un reverse proxy se positionne en frontal d'un serveur web et permet de rediriger les requêtes venant de l'internet vers des serveurs (web) qui eux, sont en internes du réseau. C'est donc exactement l'inverse.

https://www.it-connect.fr/configurer-nginx-en-tant-que-reverse-proxy/

nginx41

Par défaut, la configuration officielle se trouve à cet emplacement (déjà utilisé après l'installation de Nginx):
/etc/nginx/conf.d/default.conf

 

avec certaines distributions les configurations des hôtes virtuels peuvent setrouver à cet emplacement : /etc/nginx/sites-available; dans ces 2 cas, les fichiers sont implémentés en tant que convention de configuration.

Extrait du fichier '/etc/nginx/nginx.conf installé dans la configuration installée précédemment:

nginx42

Si vous souhaitez néanmoins utiliser le 2eme cas , il suffit d'ajouter au fichier de configuration de Nginx un include:

sudo nano /etc/nginx/nginx.conf

nginx43

 include /etc/nginx/sites-enabled/*.conf;

/etc/nginx/sites-enabled/ est le lien vers /etc/nginx/sites-available/

nginx79

 

 

1.Configuration a exécuter pour chaque hôte virtuel non sécurisé (http)

Créer un fichier de configuration par site web (par nom de domaine ou sous domaine),

Exemple :
-/etc/nginx/conf.d/domoticz.conf
-/etc/nginx/conf.d/zoneminder.conf
-/etc/nginx/conf.d/monitor.conf (affichage html tablette domoticz)
-/………..

 

pour , par exemple domoticz, la configuration est la suivante :

upstream domoticz {
server 192.168.1.75:8082;
}

server {
server_name domoticz.xxxxxxx.ovh;

location / {
proxy_pass http://domoticz;
proxy_set_header Host $host;

proxy_connect_timeout 30;
proxy_send_timeout 30;
}
}

upstream : Permet de définir serveur ou un groupe de serveurs.
server : Contient toutes les options et directives à propos du sous-domaine ou domaine. courant.

Création du fichier "domoticz.conf":

nginx44

nginx45

CTRL O , ENTREE, CTRL X

Dans le navigateur : http://domoticz.DOMAIN

nginx120

Même chose pour le 2eme serveur,

nginx46


Et le 3eme …………pour le site hébergé sur ce serveur , pour plus de facilités :
- création d'un répertoire www à la racine et d' un sous répertoire "monitor"
un lien symbolique va assurer la redirection vers ces répertoires:

mkdir /www
mkdir /www/monitor
ln -s /www/monitor /usr/share/nginx/html/monitor

nginx118

- Ajouter des droits , ex: chmod -R u+rx /www (lecture+ exécution)

- Tester la bonne configuration :

nginx47

il ne faut indiquer que l'adresse ip , sans le répertoire ; c'est à l'appel du site qu'il faut , dans le navigateur ajouter le répertoire.

Résultat :

nginx48



2.Configuration a exécuter pour chaque hôte virtuel sécurisé (https)

Avec la configuration précédente, tout le trafic entrant sur le port HTTP standard, non sécurisé, est répondu par Nginx, qui le transmet à l'application Web. Pour des raisons de sécurité, il est recommandé d'ajouter une couche de chiffrement avec TLS / SSL et d'utiliser HTTPS.

Installer Certbot:

Sous Debian Buster , il est facile d' installer des packages certbot via ces commandes :
https://certbot.eff.org/docs/using.html#nginx

nginx49

Installer le plugin "python-certbot-nginx" afin que Certbot puisse entièrement automatiser la configuration HTTPS du serveur

nginx50

Obtenir un ou plusieurs certificats, lancer le le plugin:

nginx53

nginx54


Résultat pour domoticz :

nginx55


En cas d’erreur, possible en cas d’impossibilité de vérifier le propriétaire du site, ajouter ces lignes dans les Vhosts

nginx56


Aide pour Certbot:

nginx57


nginx58

 

 

les Certtificats Letsencrypt sont valables 3 mois et sont renouvellés automatiquement sur Nginx ;
pour le vérifier :

 

Avec un certificat sur le serveur NGINX, il est possible d’accéder facilement aux autres serveurs domoticz, zoneminder, ….mais pour limiter l’accès des applications une authentification par mot de passe ou mieux par un certificat client sont indispensables

Nous devons donc ajouter une demande de mot de passe ou générer un certificat client qui sera charger dans le navigateur web avec une clé privée.

la génération d'un certificat client sera l'objet d'un autre tutoriel

Ajouter un mot de passe utilisateur:

Créer le fichier de mot de passe (fichier caché /etc/nginx/htpasswd) à l'aide des utilitaires d'OpenSSL et ajouter un utilisateur

nginx59

 

Remarque: l’ option -c n’est à effectuer que lors de la création du 1ER utilisateur ; il ne faut pas utiliser cette option ensuite sauf si l’ on veut effacer le fichier pour en créer un nouveau.

 

Afficher tous les utilisateurs :

nginx61

Modification de /etc/nginx/sites-available/domoticz.conf :
Ajouter :

auth_basic "Restricted Content";
auth_basic_user_file /etc/nginx/.htpasswd;

 

nginx62

CTRL ENTER CTRLX

Ne pas oublier de relancer le system :

Résultat :

nginx64

 

 

 

 

 

 

crée le 14/07/2020
maj 20/01/2021 html
maj avec Proxmox 6.3 et Debian 10.7
maj 13/02/2021 Refonte complète de la page

page:3