# Introduction

**Dans le monde de l’hébergement de sites web, choisir le bon serveur web peut faire toute la différence en termes de performance, de sécurité et de facilité de gestion. Caddy est un serveur web moderne et performant qui se distingue par sa simplicité d’utilisation et ses fonctionnalités avancées. Conçu pour automatiser les tâches fastidieuses comme la gestion des certificats SSL/TLS, Caddy permet aux administrateurs systèmes de se concentrer sur des aspects plus importants de leur infrastructure. Dans cet article, je vais vous présenter les caractéristiques principales de Caddy, son historique, les concepts de base, et quelques exemples de configurations pour que vous puissiez tirer le meilleur parti de ce serveur web innovant.**

## Historique de Caddy

**Caddy** a vu le jour en 2015, créé par **Matt Holt** avec une vision claire : simplifier la configuration et la gestion des serveurs web tout en intégrant des fonctionnalités modernes dès le départ. À l’époque, la gestion des certificats SSL/TLS était une tâche compliquée et chronophage pour les administrateurs systèmes. **Matt Holt** a voulu changer cela en intégrant le support automatique de Let’s Encrypt directement dans **Caddy**, rendant ainsi la sécurité web accessible à tous sans effort supplémentaire.

Dès sa sortie, **Caddy** s’est distingué par sa philosophie axée sur la simplicité et l’automatisation. En plus de la gestion automatisée des certificats SSL/TLS, **Caddy** a introduit une syntaxe de configuration claire et lisible, appelée le **Caddyfile**, facilitant ainsi la vie des développeurs et des administrateurs systèmes.

Au fil des années, **Caddy** a continué d’évoluer et d’innover, ajoutant des fonctionnalités comme le support des plugins pour étendre ses capacités, une meilleure gestion des performances et des améliorations constantes en termes de sécurité. La communauté autour de **Caddy** a également grandi, contribuant à son développement et à son adoption dans divers environnements, des petits sites web personnels aux grandes infrastructures d’entreprise.

Aujourd’hui, **Caddy** est reconnu non seulement pour sa simplicité et ses fonctionnalités intégrées, mais aussi pour sa robustesse et sa flexibilité, faisant de lui un choix populaire parmi les administrateurs systèmes cherchant une solution moderne et efficace pour leurs besoins en serveur web.

## Fonctionnalités principales de Caddy

**Caddy** se distingue par un ensemble de fonctionnalités qui le rendent unique parmi les serveurs web. Voici quelques-unes des fonctionnalités principales qui font de **Caddy** un choix populaire pour les administrateurs systèmes et les développeurs :

L’une des forces de Caddy réside dans sa facilité de configuration. Il utilise un fichier de configuration appelé **Caddyfile**, qui est conçu pour être lisible et facile à écrire. Voici un exemple de **Caddyfile** minimaliste :

<div class="expressive-code" id="bkmrk-example.com-%7B-root-%2A"><figure class="frame"><div class="ec-line">  
</div><div class="ec-line"><div class="code">  
</div></div>```
example.com {
    root * /var/www/html
    file_server
}
```

</figure></div>Dans cet exemple, **Caddy** sert le contenu du répertoire `/var/www/html` lorsque le domaine `example.com` est accédé.

### HTTPS automatique

**Caddy** automatise entièrement la gestion des certificats SSL/TLS via Let’s Encrypt. Cela signifie que dès que vous configurez un domaine dans **Caddy**, il obtient automatiquement les certificats nécessaires et les renouvelle périodiquement sans intervention manuelle. Cette fonctionnalité simplifie grandement la sécurisation des sites web.

### Extensibilité

**Caddy** est conçu pour être extensible grâce à un système de plugins. Ces plugins peuvent ajouter des fonctionnalités supplémentaires comme des authentifications spécifiques, des redirections avancées ou des intégrations avec d’autres services. La communauté développe activement des plugins pour répondre à divers besoins.

### Performances élevées

**Caddy** est conçu pour être rapide et efficient en termes de ressources. Il utilise des techniques modernes pour gérer les connexions et les requêtes, ce qui permet de servir un grand nombre de requêtes simultanées sans sacrifier la performance.

### Support natif des HTTP/2 et HTTP/3

**Caddy** prend en charge les protocoles HTTP/2 et HTTP/3 nativement, ce qui améliore la vitesse de chargement des pages et la sécurité. Ces protocoles sont conçus pour offrir une meilleure performance en termes de latence et de débit.

### Gestion des fichiers statiques

Avec la directive `file_server`, **Caddy** peut facilement servir des fichiers statiques. Il peut également gérer les répertoires et fournir des listings de répertoires automatiquement.

### Reverse proxy

**Caddy** peut agir en tant que revers-proxy, redirigeant les requêtes vers d’autres serveurs backend. Cette fonctionnalité est particulièrement utile pour les applications réparties sur plusieurs serveurs ou pour les microservices.

### Redirections et réécritures d’URL

**Caddy** offre des fonctionnalités puissantes pour la redirection et la réécriture d’URL. Vous pouvez facilement configurer des redirections permanentes ou temporaires, ainsi que des réécritures d’URL complexes.

### Journaux et surveillance

**Caddy** fournit des journaux détaillés et des outils de surveillance intégrés qui permettent de suivre l’activité du serveur et de diagnostiquer les problèmes. Ces outils sont essentiels pour maintenir une infrastructure stable et performante.

### Sécurité renforcée

En plus de la gestion automatisée des certificats, **Caddy** intègre des fonctionnalités de sécurité telles que la prévention des attaques DDoS, la protection contre les scripts intersites (XSS) et bien d’autres.

Avec toutes ces fonctionnalités, **Caddy** se positionne comme un serveur web moderne et performant, idéal pour une variété de cas d’utilisation, des sites web simples aux infrastructures complexes nécessitant une gestion avancée des requêtes et des ressources.

## Concepts de base

Pour tirer pleinement parti de **Caddy**, il est essentiel de comprendre quelques concepts de base. Ces concepts vous aideront à configurer et à gérer efficacement votre serveur web avec Caddy.

### Caddyfile

Le **Caddyfile** est le fichier de configuration principal de Caddy. Il est conçu pour être simple et lisible, ce qui facilite la configuration des sites et des services. Un Caddyfile typique est structuré en blocs de configuration, chacun représentant un site ou un service distinct.

Voici un exemple de Caddyfile de base :

<div class="expressive-code" id="bkmrk-example.com-%7B-root-%2A-1"><figure class="frame"><div class="ec-line">  
</div>```
example.com {
    root * /var/www/html
    file_server
}
```

</figure></div>Dans cet exemple, le bloc `example.com` configure le domaine `example.com` pour servir le contenu du répertoire `/var/www/html` en utilisant la directive `file_server`.

### Directives

Les **directives** sont des commandes spécifiques utilisées dans le Caddyfile pour configurer le comportement du serveur. Chaque directive a une fonction particulière, comme servir des fichiers statiques, rediriger des requêtes, ou configurer des paramètres de sécurité. Par exemple :

<div class="expressive-code" id="bkmrk-root-%2A-%2Fvar%2Fwww%2Fhtml"><figure class="frame"><div class="ec-line">  
</div>```
root * /var/www/html
file_server
```

</figure></div>Ces directives configurent le serveur pour servir des fichiers statiques à partir du répertoire `/var/www/html`.

### Plugins

**Caddy** est conçu pour être extensible grâce à son support pour les **plugins**. Ces plugins permettent d’ajouter des fonctionnalités supplémentaires à Caddy, telles que l’authentification, la gestion des URL courtes ou des intégrations avec d’autres services. Les plugins peuvent être installés et configurés via le Caddyfile.

### Routes et gestion des chemins

Les **routes** dans Caddy permettent de gérer comment les requêtes sont dirigées et traitées. Vous pouvez configurer des routes pour rediriger certaines requêtes vers des services backend, pour appliquer des réécritures d’URL, ou pour servir différents contenus selon le chemin de la requête. Voici un exemple de configuration de route pour un proxy inversé :

<div class="expressive-code" id="bkmrk-example.com-%7B-revers"><figure class="frame"><div class="ec-line">  
</div>```
example.com {
reverse_proxy /api/* http://backend:8080
}
```

<div class="copy">  
</div></figure></div>Dans cet exemple, toutes les requêtes vers `example.com/api/*` sont redirigées vers un serveur backend fonctionnant sur `http://backend:8080`.

## Installation de Caddy

L’installation de **Caddy** est un processus simple et direct, que vous soyez sur un système d’exploitation Linux, macOS ou Windows. Dans cette section, je vais vous guider à travers les étapes d’installation de Caddy sur différents systèmes.

### Installation sur Linux

Pour installer **Caddy** sur un système basé sur Debian (comme Ubuntu), vous pouvez suivre ces étapes :

Mettez à jour la liste des paquets et installez les prérequis :

<div class="expressive-code" id="bkmrk-sudo-apt-update-sudo"><figure class="frame is-terminal"><figcaption class="header"></figcaption>```bash
sudo apt update
sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https
```

<div class="copy">  
</div></figure></div>Ajoutez la clé GPG de Caddy et le dépôt APT :

<div class="expressive-code" id="bkmrk-curl--1slf-%27https%3A%2F%2F"><figure class="frame is-terminal"><figcaption class="header"></figcaption><div class="ec-line">  
</div>```bash
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | sudo tee /etc/apt/trusted.gpg.d/caddy-stable.asc
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | sudo tee /etc/apt/sources.list.d/caddy-stable.list
```

</figure></div>Mettez à jour la liste des paquets et installez Caddy :

<div class="expressive-code" id="bkmrk-sudo-apt-update-sudo-1"><figure class="frame is-terminal"><figcaption class="header"></figcaption><div class="ec-line">  
</div>```bash
sudo apt update
sudo apt install caddy
```

</figure></div>#### Installation sur macOS

Pour installer Caddy sur macOS, vous pouvez utiliser Homebrew, un gestionnaire de paquets populaire pour macOS :

Installez Homebrew si ce n’est pas déjà fait. Vous pouvez le faire en suivant les instructions sur [brew.sh ↗](https://brew.sh/).

Installez Caddy en utilisant Homebrew :

<div class="expressive-code" id="bkmrk-brew-install-caddy"><figure class="frame is-terminal"><figcaption class="header"></figcaption>```
brew install caddy
```

</figure></div>### Installation sur Windows

Pour installer Caddy sur Windows, vous pouvez télécharger l’exécutable directement depuis le site officiel ou utiliser un gestionnaire de paquets comme Scoop ou Chocolatey.

#### Utilisation de Scoop

Installez Scoop si ce n’est pas déjà fait. Vous pouvez le faire en suivant les instructions sur [scoop.sh ↗](https://scoop.sh/).

Installez Caddy en utilisant Scoop :

<div class="expressive-code" id="bkmrk-scoop-install-caddy"><figure class="frame is-terminal"><figcaption class="header"></figcaption>```
scoop install caddy
```

</figure></div>#### Utilisation de Chocolatey

Installez Chocolatey si ce n’est pas déjà fait. Vous pouvez le faire en suivant les instructions sur [chocolatey.org ↗](https://chocolatey.org/).

Installez Caddy en utilisant Chocolatey :

<div class="expressive-code" id="bkmrk-choco-install-caddy"><figure class="frame is-terminal"><figcaption class="header"></figcaption>```
choco install caddy
```

</figure></div>### Vérification de l’installation

Après avoir installé Caddy, vous pouvez vérifier que l’installation a réussi en exécutant la commande suivante dans votre terminal ou votre invite de commande :

<div class="expressive-code" id="bkmrk-caddy-version"><figure class="frame is-terminal"><figcaption class="header"></figcaption>```
caddy version
```

</figure></div>Cette commande doit afficher la version de Caddy installée sur votre système.

### Démarrage et arrêt de Caddy

Pour démarrer Caddy en utilisant un fichier de configuration, utilisez la commande suivante :

<div class="expressive-code" id="bkmrk-caddy-run---config-%2F"><figure class="frame is-terminal"><figcaption class="header"></figcaption>```
caddy run --config /path/to/Caddyfile
```

</figure></div>Pour arrêter Caddy, vous pouvez utiliser `Ctrl+C` dans le terminal où Caddy est en cours d’exécution.

### Exécution en tant que service

Sur les systèmes Linux, vous pouvez configurer Caddy pour qu’il s’exécute en tant que service système, ce qui permet de démarrer automatiquement Caddy au démarrage du système. Voici comment faire sur un système utilisant `systemd` :

Créez un fichier de service `systemd` pour Caddy :

<div class="expressive-code" id="bkmrk-sudo-nano-%2Fetc%2Fsyste"><figure class="frame is-terminal"><figcaption class="header"></figcaption>```bash
sudo nano /etc/systemd/system/caddy.service
```

</figure></div>Ajoutez les lignes suivantes dans ce fichier :

<div class="expressive-code" id="bkmrk-%5Bunit%5D-description%3Dc"><figure class="frame">```
[Unit]
Description=Caddy web server
After=network.target


[Service]
ExecStart=/usr/bin/caddy run --config /etc/caddy/Caddyfile
Restart=always
User=caddy
Group=caddy


[Install]
WantedBy=multi-user.target
```

<div class="copy">  
</div></figure></div>Rechargez `systemd` et démarrez le service Caddy :

<div class="expressive-code" id="bkmrk-sudo-systemctl-daemo"><figure class="frame is-terminal"><figcaption class="header"></figcaption><div class="ec-line">  
</div>```bash
sudo systemctl daemon-reload
sudo systemctl start cadd
sudo systemctl enable caddy
```

</figure></div>Avec ces instructions, vous êtes prêt à installer et à exécuter Caddy sur différentes plateformes. Dans la prochaine section, je vais vous montrer comment configurer Caddy pour servir des sites web et des applications.

## Configuration de base

Une fois **Caddy** installé, la prochaine étape consiste à le configurer pour servir des sites web et des applications. Dans cette section, je vais vous montrer comment créer un fichier de configuration Caddyfile et expliquer les directives de base pour démarrer rapidement.

### Création du Caddyfile

Le **Caddyfile** est le fichier de configuration principal de Caddy. Il est conçu pour être simple et lisible. Voici un exemple de Caddyfile minimaliste pour servir un site web statique :

<div class="expressive-code" id="bkmrk-example.com-%7B-root-%2A-2"><figure class="frame"><div class="ec-line">  
</div>```
example.com {
root * /var/www/html
file_server
}
```

</figure></div>Dans cet exemple :

- `example.com` est le domaine pour lequel Caddy doit servir les fichiers.
- `root * /var/www/html` spécifie le répertoire racine contenant les fichiers du site web.
- `file_server` indique à Caddy de servir les fichiers statiques à partir du répertoire racine.

### Servir des fichiers statiques

Pour servir des fichiers statiques à partir d’un répertoire, utilisez la directive `file_server`. Voici un exemple de configuration complète :

<div class="expressive-code" id="bkmrk-example.com-%7B-root-%2A-3"><figure class="frame"><div class="ec-line">  
</div>```
example.com {
root * /var/www/html
file_server browse
}
```

</figure></div>Avec `browse`, Caddy générera automatiquement une liste des fichiers et des répertoires si l’index du répertoire n’est pas trouvé.

### Utilisation de variables d’environnement

Caddy permet l’utilisation de variables d’environnement pour rendre la configuration plus flexible. Voici comment définir et utiliser une variable d’environnement dans le Caddyfile :

<div class="expressive-code" id="bkmrk-%7B%24site_domain%7D-%7B-roo"><figure class="frame"><div class="ec-line">  
</div>```
{$SITE_DOMAIN} {
root * /var/www/html
file_server
tls {$EMAIL}
}
```

</figure></div>Avant de démarrer Caddy, vous pouvez définir les variables d’environnement :

<div class="expressive-code" id="bkmrk-export-site_domain%3De"><figure class="frame is-terminal"><figcaption class="header"></figcaption><div class="ec-line">  
</div>```
export SITE_DOMAIN=example.com
export EMAIL=email@example.com
caddy run --config /path/to/Caddyfile
```

</figure></div>### Gérer les erreurs personnalisées

Caddy permet de définir des pages d’erreur personnalisées pour différents codes d’erreur HTTP. Voici comment configurer une page d’erreur personnalisée pour les erreurs 404 :

<div class="expressive-code" id="bkmrk-example.com-%7B-root-%2A-4"><figure class="frame"><div class="ec-line">  
</div>```
example.com {
root * /var/www/html
file_server
handle_errors {
@404 {
expression {http.error.status_code} == 404
}
rewrite @404 /html
file_server
}
}
```

</figure></div>### Activer la compression

Pour améliorer les performances, vous pouvez activer la compression des réponses HTTP. Caddy prend en charge la compression gzip et zstd :

<div class="expressive-code" id="bkmrk-example.com-%7B-root-%2A-5"><figure class="frame"><div class="ec-line">  
</div>```
example.com {
root * /var/www/html
file_server
encode gzip zstd
}
```

</figure></div>### Utilisation des directives de réécriture

Les directives de réécriture permettent de modifier les URL des requêtes avant qu’elles ne soient traitées. Voici un exemple de réécriture d’URL :

<div class="expressive-code" id="bkmrk-example.com-%7B-root-%2A-6"><figure class="frame"><div class="ec-line">  
</div>```
example.com {
root * /var/www/html
file_server
rewrite /old-path /new-path
}
```

</figure></div>### Configuration des en-têtes HTTP

Caddy permet de définir des en-têtes HTTP personnalisés pour les réponses. Voici un exemple de configuration des en-têtes :

<div class="expressive-code" id="bkmrk-example.com-%7B-root-%2A-7"><figure class="frame"><div class="ec-line">  
</div>```
example.com {
root * /var/www/html
file_server
header {
Strict-Transport-Security "max-age=31536000;"
X-Content-Type-Options "nosniff"
}
}
```

</figure></div>### Rechargement de la configuration

Pour appliquer les modifications apportées au Caddyfile, vous devez recharger la configuration de Caddy. Cela peut être fait sans redémarrer le serveur en utilisant la commande suivante :

<div class="expressive-code" id="bkmrk-caddy-reload---confi"><figure class="frame is-terminal"><figcaption class="header"></figcaption>```
caddy reload --config /path/to/Caddyfile
```

<div class="copy">  
</div></figure></div>Avec ces configurations de base, vous pouvez commencer à utiliser Caddy pour servir des sites web et des applications. La prochaine section abordera la gestion des certificats SSL/TLS de manière plus détaillée.

## Gestion des certificats SSL/TLS

Une des fonctionnalités les plus appréciées de **Caddy** est sa capacité à gérer automatiquement les certificats SSL/TLS. Cette fonctionnalité simplifie grandement la sécurisation des sites web, éliminant la nécessité de gérer manuellement les certificats.

### Obtention automatique des certificats

Caddy obtient automatiquement les certificats SSL/TLS pour vos domaines via Let’s Encrypt. Dès que vous configurez un domaine dans le Caddyfile, Caddy se charge d’obtenir et de renouveler les certificats sans intervention supplémentaire. Voici un exemple de configuration de base pour un site sécurisé :

<div class="expressive-code" id="bkmrk-example.com-%7B-root-%2A-8"><figure class="frame"><div class="ec-line">  
</div><div class="ec-line"><div class="code">  
</div></div>```
example.com {
root * /var/www/html
file_server
tls email@example.com
}
```

</figure></div>Dans cet exemple, la directive `tls` avec une adresse email permet à Caddy de gérer les certificats SSL/TLS pour `example.com`.

### Configuration avancée des certificats

Caddy offre des options avancées pour la gestion des certificats, comme l’utilisation de certificats personnalisés ou le contrôle des paramètres de TLS. Voici comment configurer des certificats personnalisés :

<div class="expressive-code" id="bkmrk-example.com-%7B-root-%2A-9"><figure class="frame"><div class="ec-line">  
</div>```
example.com {
root * /var/www/html
file_server
tls /path/to/cert.pem /path/to/key.pem
}
```

</figure></div>Dans cet exemple, Caddy utilise les fichiers `cert.pem` et `key.pem` pour le certificat et la clé privée.

### Utilisation de DNS Challenge

Pour les domaines où le HTTP Challenge ne fonctionne pas (par exemple, les domaines wildcard), vous pouvez utiliser le DNS Challenge. Cela nécessite des configurations spécifiques pour le DNS provider. Voici un exemple pour Cloudflare :

Installez le plugin DNS correspondant :

<div class="expressive-code" id="bkmrk-xcaddy-build---with-"><figure class="frame is-terminal"><figcaption class="header"></figcaption>```
xcaddy build --with github.com/caddy-dns/cloudflare
```

</figure></div>Configurez le DNS Challenge dans le Caddyfile :

<div class="expressive-code" id="bkmrk-example.com-%7B-root-%2A-10"><figure class="frame"><div class="ec-line">  
</div>```
example.com {
root * /var/www/html
file_server
tls {
dns cloudflare {env.CLOUDFLARE_API_TOKEN}
}
}
```

</figure></div>Définissez la variable d’environnement avec votre token API Cloudflare :

<div class="expressive-code" id="bkmrk-export-cloudflare_ap"><figure class="frame is-terminal"><figcaption class="header"></figcaption>```
export CLOUDFLARE_API_TOKEN=your-cloudflare-api-token
caddy run --config /path/to/Caddyfile
```

</figure></div>### Renouvellement des certificats

Caddy gère le renouvellement automatique des certificats avant leur expiration. Vous n’avez donc pas besoin de vous inquiéter de l’expiration des certificats. Caddy surveille les certificats et les renouvelle au besoin.

### Gestion des erreurs liées aux certificats

Il est important de surveiller les logs de Caddy pour détecter toute erreur liée aux certificats, comme l’échec de l’obtention ou du renouvellement des certificats. Voici comment configurer Caddy pour journaliser les erreurs liées aux certificats :

<div class="expressive-code" id="bkmrk-example.com-%7B-root-%2A-11"><figure class="frame"><div class="ec-line">  
</div><div class="ec-line"><div class="code">  
</div></div>```
example.com {
root * /var/www/html
file_server
tls email@example.com
log {
output file /var/log/caddy/caddy.log
level ERROR
}
}
```

</figure></div>### Paramètres TLS avancés

Pour les utilisateurs avancés, Caddy permet de configurer des paramètres TLS spécifiques, comme les suites de chiffrement ou les protocoles à utiliser. Voici un exemple de configuration TLS avancée :

<div class="expressive-code" id="bkmrk-example.com-%7B-root-%2A-12"><figure class="frame"><div class="ec-line">  
</div>```
example.com {
root * /var/www/html
file_server
tls email@example.com {
protocols tlstls3
ciphers TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
}
}
```

</figure></div>Dans cet exemple, Caddy est configuré pour utiliser uniquement TLS et avec des suites de chiffrement spécifiques.

### Monitoring et gestion des certificats

Pour une gestion proactive, vous pouvez utiliser des outils de monitoring pour surveiller l’état des certificats SSL/TLS et recevoir des alertes en cas de problème. Des solutions comme Let’s Monitor ou des scripts personnalisés peuvent être intégrés à votre infrastructure de surveillance.

Avec ces fonctionnalités de gestion des certificats SSL/TLS, Caddy simplifie la sécurisation de vos sites web, en s’assurant que les certificats sont toujours à jour et configurés correctement. Dans la prochaine section, nous allons explorer l’utilisation des plugins pour étendre les capacités de Caddy.

## Utilisation des plugins Caddy

**Caddy** est conçu pour être extensible et une des manières principales d’étendre ses fonctionnalités est par l’utilisation de **plugins**. Ces plugins permettent d’ajouter des fonctionnalités supplémentaires telles que l’authentification, la gestion des URL courtes, ou des intégrations avec d’autres services.

Les plugins pour Caddy sont disponibles sous forme de modules que vous pouvez inclure lors de la compilation de Caddy. Ils peuvent ajouter des fonctionnalités spécifiques ou modifier le comportement par défaut de Caddy. Vous pouvez trouver une liste des plugins disponibles sur le site officiel de Caddy.

### Installation de plugins avec xcaddy

Pour installer des plugins, vous pouvez utiliser l’outil `xcaddy`, qui permet de compiler Caddy avec les plugins souhaités. Voici comment installer `xcaddy` et compiler Caddy avec un plugin :

Installez `xcaddy` :

```
go install github.com/caddyserver/xcaddy/cmd/xcaddy@latest
```

Compilez Caddy avec un plugin, par exemple le plugin `caddy-l4` pour le support de niveau 4 (TCP/UDP) :

<div class="expressive-code" id="bkmrk-xcaddy-build---with--1"><figure class="frame is-terminal"><figcaption class="header"></figcaption>```
xcaddy build --with github.com/mholt/caddy-l4
```

</figure></div>Une fois la compilation terminée, un nouveau binaire `caddy` est créé avec le plugin intégré.

### Authentification

Le plugin `http.authz` permet d’ajouter des mécanismes d’authentification à vos sites web. Voici un exemple de configuration pour utiliser HTTP Basic Auth :

<div class="expressive-code" id="bkmrk-example.com-%7B-root-%2A-13"><figure class="frame"><div class="ec-line">  
</div>```
example.com {
root * /var/www/html
file_server


basicauth {
user hashed-password
}
}
```

</figure></div>Vous pouvez générer le mot de passe haché en utilisant une commande comme `htpasswd` :

<div class="expressive-code" id="bkmrk-htpasswd--nb-user"><figure class="frame is-terminal"><figcaption class="header"></figcaption>```
htpasswd -nB user
```

</figure></div>### Gestion des URL courtes

Le plugin `http.urlshort` permet de créer des redirections courtes. Voici un exemple de configuration :

<div class="expressive-code" id="bkmrk-example.com-%7B-route-"><figure class="frame"><div class="ec-line">  
</div><div class="ec-line"><div class="code">  
</div></div>```
example.com {
route /short {
redir /long-url
}
}
```

</figure></div>### WebSocket

Pour ajouter le support WebSocket, vous pouvez utiliser le plugin `caddy.websocket`. Voici un exemple de configuration pour un serveur WebSocket simple :

<div class="expressive-code" id="bkmrk-example.com-%7B-root-%2A-14"><figure class="frame"><div class="ec-line">  
</div>```
example.com {
root * /var/www/html
file_server
reverse_proxy /ws localhost:8080 {
transport http {
versions h2c 2
}
}
}
```

</figure></div>### Cloudflare DNS

Le plugin `caddy-dns/cloudflare` permet d’utiliser le DNS Challenge avec Cloudflare pour les certificats SSL/TLS. Voici un exemple de configuration :

<div class="expressive-code" id="bkmrk-example.com-%7B-root-%2A-15"><figure class="frame"><div class="ec-line">  
</div>```
example.com {
root * /var/www/html
file_server
tls {
dns cloudflare {env.CLOUDFLARE_API_TOKEN}
}
}
```

</figure></div>### Configuration des plugins dans le Caddyfile

Les plugins sont configurés dans le Caddyfile en utilisant des directives spécifiques à chaque plugin. Chaque plugin dispose de sa propre documentation pour les options de configuration disponibles. Voici un exemple de Caddyfile avec plusieurs plugins configurés :

<div class="expressive-code" id="bkmrk-example.com-%7B-root-%2A-16"><figure class="frame">```
example.com {
root * /var/www/html
file_server
 

# Basic Auth plugin
basicauth {
user hashed-password
}


# URL Shortener plugin
route /short {
redir /long-url
}


# WebSocket plugin
reverse_proxy /ws localhost:8080 {
transport http {
versions h2c 2
}
}


# Cloudflare DNS plugin
tls {
dns cloudflare {env.CLOUDFLARE_API_TOKEN}
}
} 
```

<div class="ec-line">  
</div><div class="ec-line">  
</div></figure></div>### Mise à jour et gestion des plugins

Pour mettre à jour Caddy avec les plugins, vous pouvez simplement recompiler Caddy avec `xcaddy` en spécifiant les versions mises à jour des plugins. Il est important de vérifier régulièrement les mises à jour de sécurité et les nouvelles fonctionnalités des plugins utilisés.

### Dépannage des plugins

En cas de problèmes avec les plugins, consultez les logs de Caddy pour obtenir des informations sur les erreurs. Vous pouvez également consulter la documentation spécifique du plugin et les forums de support pour obtenir de l’aide.

Avec cette flexibilité offerte par les plugins, vous pouvez adapter Caddy à une multitude de scénarios et besoins spécifiques. La prochaine section traitera des meilleures pratiques pour la gestion et l’optimisation des performances de Caddy.

## Gestion et optimisation des performances

**Caddy** est conçu pour être performant dès la sortie de la boîte, mais il existe des pratiques et des configurations supplémentaires qui peuvent améliorer encore plus ses performances. Dans cette section, je vais aborder les techniques de gestion et d’optimisation des performances pour tirer le meilleur parti de votre serveur Caddy.

### Gestion de la mémoire et des ressources

Pour surveiller et gérer l’utilisation de la mémoire et des ressources CPU par Caddy, vous pouvez utiliser des outils de monitoring comme **Prometheus** et **Grafana**. Voici comment configurer Caddy pour exporter des métriques compatibles avec Prometheus :

Ajoutez le module Prometheus lors de la compilation de Caddy :

<div class="expressive-code" id="bkmrk-xcaddy-build---with--2"><figure class="frame is-terminal"><figcaption class="header"></figcaption>```
xcaddy build --with github.com/prometheus/client_golang/prometheus
```

<div class="copy">  
</div></figure></div>Configurez le Caddyfile pour exporter les métriques :

<div class="expressive-code" id="bkmrk-%7B-metrics-%7B-promethe"><figure class="frame">```
{
    metrics {
        prometheus
    }
}

example.com {
    root * /var/www/html
    file_server
}
```

<div class="copy">  
</div></figure></div>Configurez Prometheus pour scraper les métriques exportées par Caddy en ajoutant cette section dans le fichier de configuration de Prometheus (`prometheus.yml`) :

<div class="expressive-code" id="bkmrk-scrape_configs%3A---jo"><figure class="frame"><div class="ec-line">  
</div>```
scrape_configs:
- job_name: "caddy"
static_configs:
- targets: ["localhost:2019"]
```

</figure></div>### Compression et mise en cache

La compression et la mise en cache des réponses peuvent considérablement améliorer les performances de votre site web.

#### Compression

Pour activer la compression des réponses HTTP, utilisez la directive `encode` :

<div class="expressive-code" id="bkmrk-example.com-%7B-root-%2A-17"><figure class="frame"><div class="ec-line">  
</div>```
example.com {
root * /var/www/html
file_serve
encode gzip zstd
}
```

</figure></div>#### Mise en cache

Bien que Caddy ne propose pas de solution de mise en cache intégrée, vous pouvez utiliser des solutions externes comme **Varnish** ou des modules tiers pour gérer la mise en cache des réponses. Voici un exemple de configuration de Varnish avec Caddy :

Installez Varnish sur votre serveur.

Configurez Varnish pour écouter sur le port 80 et configurer Caddy pour écouter sur un port différent (par exemple, 8080).

Modifiez le fichier de configuration de Varnish (`default.vcl`) pour rediriger les requêtes vers Caddy :

<div class="expressive-code" id="bkmrk-vcl-0%3B-backend-defau"><figure class="frame"><div class="ec-line">  
</div>```
vcl 0;


backend default {
.host = "1";
.port = "8080";
}


sub vcl_recv {
if (req.method == "PURGE") {
if (!client.ip ~ purgers) {
return (synth(405, "Not allowed."));
}
return (purge);
}
}


sub vcl_backend_response {
if (beresp.status == 200) {
set beresp.ttl = 10m;
}
}
```

</figure></div>Configurez le Caddyfile pour écouter sur le port 8080 :

<div class="expressive-code" id="bkmrk-example.com-%7B-root-%2A-18"><figure class="frame"><div class="ec-line">  
</div>```
example.com {
root * /var/www/html
file_server
encode gzip zstd
reverse_proxy localhost:8080
}
```

</figure></div>### Optimisation des en-têtes HTTP

L’optimisation des en-têtes HTTP peut améliorer la sécurité et les performances de votre site web.

#### En-têtes de sécurité

Ajoutez des en-têtes de sécurité pour protéger votre site contre les attaques courantes :

<div class="expressive-code" id="bkmrk-example.com-%7B-root-%2A-19"><figure class="frame"><div class="ec-line">  
</div>```
example.com {
root * /var/www/html
file_server
header {
Strict-Transport-Security "max-age=31536000;"
X-Content-Type-Options "nosniff"
X-Frame-Options "DENY"
Referrer-Policy "no-referrer"
Content-Security-Policy "default-src 'self'"
}
}
```

</figure></div>#### En-têtes de mise en cache

Configurez des en-têtes de mise en cache pour les ressources statiques :

<div class="expressive-code" id="bkmrk-example.com-%7B-root-%2A-20"><figure class="frame"><div class="ec-line">  
</div>```
example.com {
    root * /var/www/html
    file_server
    header /static/* {
        Cache-Control "public, max-age=31536000, immutable"
    }
}
```

<div class="ec-line">  
</div></figure></div>#### Gestion des connexions

Configurer le nombre maximal de connexions et de workers peut aider à gérer la charge sur votre serveur :

<div class="expressive-code" id="bkmrk-example.com-%7B-root-%2A-21"><figure class="frame"><div class="ec-line">  
</div><div class="ec-line"><div class="code">  
</div></div>```
example.com {
    root * /var/www/html
    file_server
    tls email@example.com
    max_conns 100
    max_header_bytes 1048576
}
```

<div class="ec-line">  
</div></figure></div>#### Utilisation de HTTP/2 et HTTP/3

Caddy supporte HTTP/2 par défaut et peut également être configuré pour utiliser HTTP/3 pour des performances encore meilleures :

<div class="expressive-code" id="bkmrk-activez-http%2F3-dans-"><figure class="frame"><div class="ec-line"><div class="code">Activez HTTP/3 dans le Caddyfile :</div><div class="code">  
</div></div>```
example.com {
    root * /var/www/html
    file_server
    tls {
        alpn h3
    }
}
```

<div class="ec-line">  
</div><div class="ec-line">  
</div></figure></div>Vérifiez que votre serveur supporte HTTP/3 et que les ports UDP nécessaires sont ouverts.

#### Load Balancing

Pour gérer un trafic important, vous pouvez configurer Caddy en tant que load balancer :

<div class="expressive-code" id="bkmrk-example.com-%7B-revers-1"><figure class="frame">```
example.com {
    reverse_proxy {
        to backend1:8080 backend2:8080 backend3:8080
        lb_policy round_robin
    }
}
```

</figure></div>#### Optimisation des logs

<div class="expressive-code" id="bkmrk-example.com-%7B-root-%2A-22"><figure class="frame">```
example.com {
    root * /var/www/html
    file_server
    log {
        output file /var/log/caddy/access.log {
            roll_size 50mb
            roll_keep 5
            roll_keep_for 48h
        }
        level INFO
    }
}
```

</figure></div>En appliquant ces techniques de gestion et d’optimisation des performances, vous pouvez garantir que votre serveur Caddy fonctionne efficacement et reste performant même sous des charges élevées. Dans la prochaine section, je conclurai notre exploration de Caddy et résumerai les points clés abordés.

## Conclusion

Au fil de ce billet, j’ai détaillé les nombreuses fonctionnalités et avantages qu’offre **Caddy** en tant que serveur web moderne et performant. Nous avons exploré son historique, ses concepts clés et ses fonctionnalités principales telles que la gestion automatique des certificats SSL/TLS, la flexibilité du fichier de configuration Caddyfile et l’utilisation de plugins pour étendre ses capacités.

En conclusion, **Caddy** se positionne comme un choix robuste et flexible pour la gestion des serveurs web. Grâce à ses fonctionnalités intégrées et à son extensibilité, il offre une solution complète pour déployer et gérer des sites web sécurisés et performants. J’espère que ce billet vous a aidé à mieux comprendre les avantages de **Caddy** et comment l’utiliser efficacement dans vos projets.

<div class="ec-line" id="bkmrk-"></div>