# 5. Configurer un serveur Web

# Apache2

# Mise en place d'Apache2

### Installation 

```shell
sudo apt install apache2
```

#### Lancer le service

```shell
sudo service apache2 start
```

Pour vérifier que Apache fonctionne, entrer l’adresse IP du serveur dans un navigateur http://YOUR\_IP\_OR\_DOMAIN/ et la page par défaut d’Apache doit être visible :

[![page-defaut-ubuntu2.png](https://wiki.mira-ceti.ovh/uploads/images/gallery/2022-06/scaled-1680-/88boJuCsL1HNGrEt-page-defaut-ubuntu2.png)](https://wiki.mira-ceti.ovh/uploads/images/gallery/2022-06/88boJuCsL1HNGrEt-page-defaut-ubuntu2.png)

### Le dossier Apache2

Il est important de comprendre comment Apache2 fonctionne une fois installé.

Tout d'abord toute la configuration d'Apache2 se trouve à l'arborescence suivante : `/etc/apache2`

Dans cette arborescence il y a 3 fichiers de configuration standards d'Apache2 et des dossiers de conf.

- `apache2.conf`
- `envvars`
- `ports.conf`

<p class="callout info">les fichiers de configuration globale `apache2.conf`, `envars` et `ports.conf` n'ont pas à être modifiés. Toute la configuration devrait se faire dans les sous dossiers `xxx-available`</p>

- <div class="li">`sites-available` contient les fichiers de configuration des **sites disponibles**</div>
- <div class="li">`sites-enabled` contient des liens symboliques vers les configurations, dans `site-available`. Chaque configuration présente dans ce dossier correspondant aux **sites activés**.</div>
- <div class="li">`conf-available` contient les fichiers de configuration des **autres services** disponibles</div>
- <div class="li">`conf-enabled` contient des liens symboliques vers les configurations, dans `conf-available`, des **services activés**</div>
- <div class="li">`mods-available` contient les fichiers de configuration des **modules d'Apache disponibles**</div>
- <div class="li">`mods-enabled` contient des liens symboliques vers les configurations, dans `mods-available`, des **modules activés**</div>

Pour activer ou désactiver les différentes configurations présentent dans les dossiers `xxx-available` ou `xxx-enabled` il existe une commande permettant de créer ou enlever le lien symbolique directement dans le bon dossier.

```shell
sudo a2ensite <filename> # [configuration d'un site à activer]
sudo a2dissite <filename> # [configuration d'un site à désactiver]

sudo a2enconf <confname> # [configuration d'un service à activer]
sudo a2disconf <confname> # [configuration d'un service à désactiver]

sudo a2enmod <modname> # [configuration d'un module à activer]
sudo a2dismod <modname> # [configuration d'un module à désactiver]
```

# Les hôtes virtuels

Avec Apache, chaque site ou application web correspond en principe à un hôte virtuel (***VirtualHost*** en anglais).

<p class="callout info">Chaque hôte virtuel est défini par un fichier de configuration indépendant, qu'on trouve ou qu'on créé dans le répertoire `/etc/apache2/sites-available/`.</p>

#### Par défaut

Dans le dossier `sites-available/` il existe 2 configurations par défaut.

1\) Le premier *VirtualHost* est défini dans le fichier `/etc/apache2/sites-available/000-default.conf`. Voici son contenu sans les commentaires :

<dl class="file" id="bkmrk-000-default.conf-%3D%3E-"><dt>000-default.conf =&gt; Il correspond a une configuration par défaut pour un site en HTTP (port 80).</dt><dd>```PASCAL
<VirtualHost *:80>
	ServerAdmin webmaster@localhost
	DocumentRoot /var/www/html
	ErrorLog ${APACHE_LOG_DIR}/error.log
	CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
```

2\) Le deuxième est défini dans le fichier `/etc/apache2/sites-available/default-ssl.conf`. Voici son contenu sans les commentaires :

default-ssl.conf =&gt; Correspond a une configuration par défaut pour un site en HTTPS (port 443).

```shell
<IfModule mod_ssl.c>
        <VirtualHost _default_:443>
                ServerAdmin webmaster@localhost
                
                DocumentRoot /var/www/html

                ErrorLog ${APACHE_LOG_DIR}/error.log
                CustomLog ${APACHE_LOG_DIR}/access.log combined

                #   SSL Engine Switch:
                #   Enable/Disable SSL for this virtual host.
                SSLEngine on
                SSLCertificateFile      /etc/ssl/certs/ssl-cert-snakeoil.pem
                SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key

                <FilesMatch "\.(cgi|shtml|phtml|php)$">
                                SSLOptions +StdEnvVars
                </FilesMatch>
                <Directory /usr/lib/cgi-bin>
                                SSLOptions +StdEnvVars
                </Directory>

        </VirtualHost>
</IfModule>

```

</dd></dl>

# Créer un hôte virtuel

### Création d'un hôte virtuel

<p class="callout info">Apache recommande de créer un fichier de configuration dans lequel est défini un hôte virtuel pour chaque site ou application web dans le répertoire `/etc/apache2/sites-available/`.</p>

Chaque hôte virtuel peut être appelé en fonction d'un nom de domaine ou sous-domaine, c'est la configuration la plus courante. Mais on peut également définir un numéro de port particulier, ou une adresse IP particulière (si le serveur en possède plusieurs) pour laquelle on affichera tel ou tel contenu web.

Chaque hôte virtuel ayant son fichier de configuration dédié, pour s'y repérer on peut le nommer par le nom de domaine auquel il correspond, suivi de l'extension `.conf`. Pour un nom de domaine *example.com* on créera donc un fichier `/etc/apache2/sites-available/example.com.conf`.

```shell
sudo nano /etc/apache2/sites-available/exemple.com.conf
```

Voici un exemple de contenu pour ce fichier :

<dl class="file" id="bkmrk-example.com.conf-%3Cvi"><dt>example.com.conf</dt><dd>```
<VirtualHost *:80>
	ServerName example.com
	ServerAlias www.example.com
	DocumentRoot "/var/www/example"
	<Directory "/var/www/example">
		Options +FollowSymLinks
		AllowOverride all
		Require all granted
	</Directory>
	ErrorLog /var/log/apache2/error.example.com.log
	CustomLog /var/log/apache2/access.example.com.log combined
</VirtualHost>
```

Explication du fichier de configuration :

</dd></dl><table class="inline table table-striped table-condensed" id="bkmrk-directive-descriptio"><thead><tr class="row0"><th class="col0">directive</th><th class="col1">description</th></tr></thead><tbody><tr class="row1"><td class="col0">```
<VirtualHost *:80>
```

</td><td class="col1">On accepte les connexions sur n'importe quelle IP du serveur (`*`) sur le port 80.</td></tr><tr class="row2"><td class="col0">```
ServerName example.com
```

</td><td class="col1">Cet hôte virtuel sera seulement appelé pour le nom de domaine *example.com*…</td></tr><tr class="row3"><td class="col0">```
ServerAlias www.example.com
```

</td><td class="col1">…ainsi que pour le sous-domaine *www.example.com*. On peut spécifier ici d'autres noms de domaine en les séparant par un espace. On peut aussi utiliser *\*.example.com* pour inclure tous les sous-domaines.</td></tr><tr class="row4"><td class="col0">```
DocumentRoot "/var/www/example"
```

</td><td class="col1">On placera les fichiers du site dans le répertoire `/var/www/example`.</td></tr><tr class="row5"><td class="col0">```
<Directory "/var/www/example">
```

</td><td class="col1">On spécifie dans cette section des règles pour le répertoire `/var/www/example` sous cet hôte virtuel.</td></tr><tr class="row6"><td class="col0">```
Options +FollowSymLinks
```

</td><td class="col1">Apache suivra les [liens symboliques](https://doc.ubuntu-fr.org/lien_physique_et_symbolique "lien_physique_et_symbolique") qu'il trouvera dans ce répertoire (et ses descendants).</td></tr><tr class="row7"><td class="col0">```
AllowOverride all
```

</td><td class="col1">On pourra inclure une configuration personnalisée via un fichier [.htaccess](https://doc.ubuntu-fr.org/apache2#htaccess "apache2 ↵").</td></tr><tr class="row8"><td class="col0">```
Require all granted
```

</td><td class="col1">Tous les visiteurs pourront accéder au contenu de ce répertoire. Voir la [documentation officielle](https://httpd.apache.org/docs/current/fr/mod/mod_authz_core.html#require "https://httpd.apache.org/docs/current/fr/mod/mod_authz_core.html#require") pour modifier ce comportement. Pour des raisons de sécurité ou de privacité on peut par exemple limiter l'accès au serveur à seulement une ou certaines adresses IP avec une directive du type `Require ip 192.168.1.10`.</td></tr><tr class="row9"><td class="col0">```
ErrorLog /var/log/apache2/error.example.com.log
CustomLog /var/log/apache2/access.example.com.log combined
```

</td><td class="col1">Il est pratique d'avoir des logs séparés pour chaque hôte virtuel, afin de ne pas mélanger toutes les informations.</td></tr></tbody></table>

##### Vérifier la configuration

Avec Apache2 il est possible de vérifier si la configuration des hôtes virtuels sont correctement écrite. Il suffit d’exécuter la commande suivante :

```
sudo apachectl configtest
```

Dans le cas ou tout est bon l'invite de commande devra vous retourner le message suivant : `Syntax OK`

### Déployer le nouveau site

Après avoir l'avoir créée l'hôte virtuel, il faut activer cette configuration avec la commande `sudo a2ensite <hostname>`.

```
sudo a2ensite example.com
```

On recharge ensuite la configuration d'Apache :

```
sudo systemctl reload apache2
```

# Activer le HTTPS

### Le Https

HTTPS permet de chiffrer les communications entre le navigateur et Apache au moyen du protocole SSL/TLS, et de garantir l'authenticité de votre serveur (au moyen d'un certificat). Cela empêche qui que ce soit de récupérer ("sniffer") des informations sensibles (tels que des mots de passes) en particulier lorsqu'on se connecte depuis un réseau public, ou empêche un autre serveur de se faire passer pour le vôtre.

Il n'est ni nécessaire, ni faisable de mettre en place HTTPS avec un certificat valide sur un serveur de développement local.

Pour rendre disponible les sites de manière sécurisée via HTTPS avec des certificats valides, **la solution la plus simple est d'utiliser l'outil Certbot de Let's Encrypt.**

####  

#### Activation du module

Pour que le **protocole <abbr data-original-title="Transport Layer Security" title="">TLS</abbr>** (successeur du **SSL**) puisse fonctionner avec Apache2, il faut activer le module *ssl* avec la commande :

```
sudo a2enmod ssl
```

puis recharger la configuration d'Apache 2 :

```
sudo systemctl reload apache2
```

####  

#### Installation de Certbot

Pour installer Certbot :

```
sudo apt install python3-certbot-apache
```

# Mettre un site en HTTPS

Pour mettre un site en HTTPS il faut avoir préalablement effectuer les étapes dans [la page précédente](https://wiki.mira-ceti.ovh/books/configurer-un-serveur-web/page/activer-le-https "Activer le HTTPS").

### Utilisation de Certbot

Certbot permet de générer tous les certificats et d'adapter les configurations d'Apache pour tous les noms de domaine associés aux hôtes virtuels au moyen d'une seule commande :

```
sudo certbot --apache
```

Lors de l'opération le script nous invite à cocher les domaines pour lesquels on souhaite obtenir les certificats et à choisir de forcer l'usage de <abbr data-original-title="Hypertext Transfert Protocol Secured" title="">HTTPS</abbr> ou pas. Pour des raisons de sécurité, c'est généralement une très bonne idée de forcer <abbr data-original-title="Hypertext Transfert Protocol Secured" title="">HTTPS</abbr>.

Après cette opération les sites devraient être accessibles en <abbr data-original-title="Hypertext Transfert Protocol Secured" title="">HTTPS</abbr> de manière sécurisée, sans que les navigateurs affichent de message d'alerte.

<p class="callout info">Grâce à l'option `–apache`, Certbot s'occupe automatiquement de créer des fichiers de configuration de la forme `/etc/apache2/sites-available/example.com-le-ssl.conf` pour les hôtes virtuels en <abbr data-original-title="Hypertext Transfert Protocol Secured" title="">HTTPS</abbr> sur le port 443 et de les activer (`-le-ssl` pour *Let's Encrypt*).</p>

### Renouvellement automatique

Pour information c'est la commande `certbot renew` qui permet de renouveler les certificats très simplement, mais Certbot créé automatiquement une [tâche cron](https://doc.ubuntu-fr.org/cron "cron") à cet effet dans `/etc/cron.d/certbot`. Il est également créé un « *timer* » systemd qui fait la même chose (/lib/systemd/system/certbot.timer et certbot.service).

Le script est lancé automatiquement toutes les 12 heures, mais les certificats ne seront renouvelés que si nécessaire. En principe il n'y a donc rien à faire.

### Vérifier le HTTPS

Il existe des sites tel que Qualys pour vérifier la sécurité SSL du site.

Lien : [https://www.ssllabs.com/ssltest/](https://www.ssllabs.com/ssltest/)

On remplis le “hostname” avec notre nom de domaine : exemple.com

# Certbot

# Les commandes Certbot

### Créer un certificat 

```shell
sudo certbot --apache
```

### Renouveler les certificats

```shell
sudo certbot renew
```

### Supprimer un ancien certificat

```shell
sudo certbot delete
```

### Afficher les certificats 

```shell
sudo certbot certificates
```

# Nginx

# Installation de Nginx

### Installation 

```shell
sudo apt install nginx
```

#### Lancer le service

```shell
sudo service nginx start
```

Pour vérifier que Nginx fonctionne, entrer l’adresse IP du serveur dans un navigateur http://YOUR\_IP\_OR\_DOMAIN/ et la page par défaut de Nginx doit être visible :

[![image.png](https://wiki.mira-ceti.ovh/uploads/images/gallery/2023-09/scaled-1680-/OziFPmzzSuxy8hiJ-image.png)](https://wiki.mira-ceti.ovh/uploads/images/gallery/2023-09/OziFPmzzSuxy8hiJ-image.png)

### Le dossier Nginx

Il est important de comprendre comment Nginx fonctionne une fois installé.

Tout d'abord toute la configuration de Nginx se trouve à l'arborescence suivante : `/etc/nginx`

Dans cette arborescence il y a les dossiers de configuration des hosts :

- <div class="li">`sites-available` contient les fichiers de configuration des **sites disponibles**</div>
- <div class="li">`sites-enabled` contient des liens symboliques vers les configurations, dans `site-available`. Chaque configuration présente dans ce dossier correspondant aux **sites activés**.</div>

# Protéger un site par mot de passe avec l'authentification de base

##### Prérequis

Tout d'abord pour utiliser la "basic authentification" il faut installer un package appartenant à Apache :

```bash
sudo apt install apache2-utils
```

Il est nécessaire d'installer ce package car nous avons besoin de la commande `htpasswd` qui permet de créer un fichier `.htpasswd` qui contiendra tous les utilisateurs et leurs mot de passe.

##### Création du fichier .htpasswd et d'un utilisateur

```bash
sudo htpasswd -c /path/to/file/.htpasswd <user>

# Exemple
sudo htpasswd -c /etc/nginx/.htpasswd marc
New password: 
Re-type new password: 
Adding password for user marc
```

L'option `-c` permet de créé le <var>fichier-mots-de-passe</var>. Si <var>fichier-mots-de-passe</var> existe déjà, il est réécrit et tronqué.

#####   

# Rediriger un nom domaine sur un container

Se placer dans le répertoire :

`<span class="s1">cd /etc/nginx/conf.d</span>`

<span class="s1">Puis créer un fichier : &lt;nom-de-mon-service&gt;.conf </span>

<span class="s1">exemple : </span>

`<span class="s1">nano msn.conf</span>`

<span class="s1">Puis insérer le contenu suivant en modifiant les variables suivantes : </span>

```
server {
    server_name msn.chiken.ovh;

    location / {
        proxy_pass http://localhost:3001; # Le port exposé par ton Docker
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }

    listen 80;
    listen [::]:80;
}

```

Puis redémarrer nginx :

`<span class="s1">sudo systemctl restart nginx</span>`

Pour mettre le service en HTTPS il faut exécuter la commande suivante :

<span class="s1"> `certbot --nginx`</span>

<span class="s1">Puis entrer le numéro du service correspondant. </span>