Comment héberger un site Web avec Caddy sur CentOS 7

De Get Docs
Aller à :navigation, rechercher

Introduction

Caddy est un nouveau serveur Web créé dans un souci de simplicité d'utilisation. Il est suffisamment simple pour être utilisé comme serveur de développement rapide et suffisamment robuste pour être utilisé dans des environnements de production.

Il dispose d'un fichier de configuration intuitif, d'une prise en charge HTTP/2 et d'un cryptage TLS automatique. HTTP/2 est la nouvelle version du protocole HTTP qui rend les sites Web plus rapides en utilisant une connexion unique pour transférer plusieurs fichiers et la compression des en-têtes, entre autres fonctionnalités. TLS est utilisé pour servir des sites Web cryptés via une connexion sécurisée et, bien qu'il ait été largement adopté sur Internet, il est souvent difficile d'obtenir et d'installer des certificats manuellement.

Caddy s'intègre étroitement à Let's Encrypt, une autorité de certification qui fournit des certificats TLS/SSL gratuits et obtient et renouvelle automatiquement les certificats si nécessaire. En d'autres termes, chaque site Web desservi par Caddy peut être automatiquement servi via une connexion sécurisée sans configuration ni action supplémentaire nécessaire.

Dans ce tutoriel, vous allez installer et configurer Caddy. Après avoir suivi ce didacticiel, vous disposerez d'un site Web fonctionnel simple servi à l'aide de HTTP/2 et d'une connexion TLS sécurisée.

Conditions préalables

Pour suivre ce tutoriel, vous aurez besoin de :

  • Un serveur CentOS 7 configuré avec ce didacticiel de configuration initiale du serveur, y compris un utilisateur sudo non root.
  • Un nom de domaine configuré pour pointer vers votre serveur. Ceci est nécessaire pour que Caddy obtienne un certificat SSL pour le site Web ; sans utiliser un nom de domaine approprié, le site Web ne sera pas servi en toute sécurité avec le cryptage TLS. Vous pouvez apprendre à faire pointer des domaines vers des gouttelettes DigitalOcean en suivant le tutoriel Comment configurer un nom d'hôte avec DigitalOcean.
  • En option, l'éditeur de texte nano installé avec sudo yum install nano. CentOS est livré avec l'éditeur de texte vi par défaut, mais nano peut être plus convivial.

Étape 1 - Installation des fichiers binaires Caddy

Le projet Caddy fournit un script d'installation qui va récupérer et installer les fichiers binaires du serveur Caddy. Pour l'exécuter, tapez :

curl -s https://getcaddy.com | bash

Vous pouvez afficher le script en visitant https://getcaddy.com dans votre navigateur ou en téléchargeant le fichier avec wget ou curl avant de l'exécuter.

Lors de l'installation, le script utilisera sudo pour obtenir des privilèges administratifs afin de placer les fichiers Caddy dans des répertoires à l'échelle du système, il peut donc vous demander un mot de passe.

La sortie de la commande ressemblera à ceci :

Caddy installation script outputDownloading Caddy for linux/amd64...
https://caddyserver.com/download/linux/amd64?plugins=
Extracting...
Putting caddy in /usr/local/bin (may require password)
[sudo] password for sammy:
Caddy 0.10.2
Successfully installed

Une fois le script terminé, les fichiers binaires Caddy sont installés sur le serveur et prêts à être utilisés. Vous pouvez vérifier que les fichiers binaires Caddy ont été mis en place en utilisant which pour vérifier leur emplacement.

which caddy

La sortie de la commande indiquera que le binaire Caddy peut être trouvé dans /usr/local/bin/caddy.

Caddy ne crée aucune configuration à l'échelle du système lors de l'installation et ne s'installe pas en tant que service, ce qui signifie qu'il ne démarrera pas automatiquement lors du démarrage. Dans les prochaines étapes, nous allons créer le compte utilisateur à utiliser avec Caddy, les fichiers dont Caddy a besoin pour fonctionner et installer son fichier de service.

Étape 2 - Création de l'utilisateur et du groupe pour Caddy

Alors qu'Apache et Nginx, deux serveurs HTTP les plus populaires, créent leurs propres utilisateurs non privilégiés lors de l'installation à partir de packages système, Caddy ne le fait pas. Pour des raisons de sécurité, il ne doit pas non plus être démarré à l'aide du compte superutilisateur root. Dans cette étape, nous allons créer un utilisateur dédié nommé caddy qui sera uniquement utilisé pour exécuter Caddy et accéder à ses fichiers.

Pour créer un utilisateur nommé caddy, tapons :

sudo adduser -r -d /var/www -s /sbin/nologin caddy

Le commutateur -r fait du compte nouvellement créé un compte dit système, le commutateur -d indique le répertoire personnel de cet utilisateur, dans notre cas ce sera /var/www que nous allons créer plus tard. L'utilisateur non privilégié ne devrait pas pouvoir se connecter et accéder au shell système, ce dont nous nous assurons avec le commutateur -s configurant un shell souhaité sur /sbin/nologin, une commande système interdisant la connexion au système. Le dernier paramètre est le nom d'utilisateur lui-même - dans notre cas, caddy.

Maintenant, lorsque nous avons l'utilisateur pour le serveur Web Caddy disponible, nous pouvons configurer les répertoires nécessaires pour stocker les fichiers de configuration Caddy à l'étape suivante.

Étape 3 - Configuration des répertoires nécessaires

La prise en charge automatique de TLS et le fichier d'unité de Caddy (que nous installerons à l'étape suivante) s'attendent à ce que des répertoires et des fichiers particuliers existent avec des autorisations spécifiques. Nous allons tous les créer dans cette étape.

Tout d'abord, créez un répertoire qui hébergera le fichier principal Caddyfile, qui est un fichier de configuration qui indique à Caddy quels sites Web il doit servir et comment.

sudo mkdir /etc/caddy

Changez le propriétaire de ce répertoire en utilisateur root et son groupe en www-data afin que Caddy puisse le lire.

sudo chown -R root:caddy /etc/caddy

Dans ce répertoire, créez un Caddyfile vide que nous modifierons plus tard.

sudo touch /etc/caddy/Caddyfile

Créez un autre répertoire dans /etc/ssl. Caddy en a besoin pour stocker les clés privées SSL et les certificats qu'il obtient automatiquement de Let's Encrypt.

sudo mkdir /etc/ssl/caddy

Caddy doit pouvoir écrire dans ce répertoire lorsqu'il obtient le certificat, faites donc du propriétaire l'utilisateur caddy . Vous pouvez laisser le groupe en tant que root, inchangé par rapport à la valeur par défaut :

sudo chown -R caddy:root /etc/ssl/caddy

Assurez-vous ensuite que personne d'autre ne peut lire ces fichiers en supprimant tous les droits d'accès des autres.

sudo chmod 0770 /etc/ssl/caddy

Le répertoire final que nous devons créer est celui où le site Web lui-même sera publié. Nous utiliserons /var/www, qui est habituel et également le chemin par défaut lors de l'utilisation d'autres serveurs Web, comme Apache ou Nginx.

sudo mkdir /var/www

Ce répertoire doit appartenir entièrement à caddy.

sudo chown caddy:caddy /var/www

Vous avez maintenant préparé l'environnement nécessaire à l'exécution de Caddy. Dans l'étape suivante, nous configurerons Caddy en tant que service système pour nous assurer qu'il démarre avec le démarrage du système et peut être géré avec systemctl.

Étape 4 - Installation de Caddy en tant que service système

Bien que Caddy ne s'installe pas en tant que service, le projet fournit un fichier d'unité systemd officiel. Ce fichier suppose la structure de répertoires que nous avons configurée à l'étape précédente, alors assurez-vous que votre configuration correspond.

Téléchargez le fichier depuis le dépôt officiel de Caddy. Le paramètre -o supplémentaire à la commande curl enregistrera le fichier dans le répertoire /etc/systemd/system/ et le rendra visible pour systemd.

sudo curl -s https://raw.githubusercontent.com/mholt/caddy/master/dist/init/linux-systemd/caddy.service -o /etc/systemd/system/caddy.service

Avant de pouvoir continuer, nous devons modifier légèrement le fichier pour qu'il utilise notre utilisateur non privilégié caddy pour exécuter le serveur.

Ouvrons le fichier avec vi ou votre éditeur de texte préféré (voici une courte introduction à vi)

sudo vi /etc/systemd/system/caddy.service

et trouvez le fragment chargé de spécifier le compte d'utilisateur et le groupe.

/etc/systemd/system/caddy.service

; User and group the process will run as.
User=www-data
Group=www-data

Changez les deux valeurs en caddy comme suit :

/etc/systemd/system/caddy.service

; User and group the process will run as.
User=caddy
Group=caddy

Enregistrez et fermez le fichier pour quitter. Le fichier de service est maintenant prêt à être utilisé avec notre installation. Informez systemd du nouveau fichier de service.

sudo systemctl daemon-reload

Ensuite, activez Caddy pour qu'il s'exécute au démarrage.

sudo systemctl enable caddy.service

Vous pouvez vérifier que le service a été correctement chargé et activé pour démarrer au démarrage en vérifiant son état.

sudo systemctl status caddy.service

La sortie devrait ressembler à ceci :

Caddy service status output● caddy.service - Caddy HTTP/2 web server
   Loaded: loaded (/etc/systemd/system/caddy.service; enabled; vendor preset: disabled)
   Active: inactive (dead)
     Docs: https://caddyserver.com/docs

Plus précisément, il indique que le service est chargé et activé, mais qu'il n'est pas encore en cours d'exécution. Nous n'allons pas encore démarrer le serveur car la configuration est encore incomplète.

Vous avez maintenant configuré Caddy en tant que service système qui démarrera automatiquement au démarrage sans avoir besoin de l'exécuter manuellement. Ensuite, nous allons autoriser le trafic Web à travers le pare-feu.

Étape 5 - Autoriser les connexions HTTP et HTTPS (facultatif)

Si vous avez également suivi le didacticiel Étapes recommandées supplémentaires pour les nouveaux serveurs CentOS 7 et que vous utilisez un pare-feu, nous devons ajouter manuellement des règles de pare-feu pour transmettre le trafic Internet à Caddy.

Caddy sert des sites Web utilisant les protocoles HTTP et HTTPS, nous devons donc autoriser l'accès aux ports appropriés afin de rendre Caddy disponible sur Internet.

sudo firewall-cmd --permanent --zone=public --add-service=http 
sudo firewall-cmd --permanent --zone=public --add-service=https
sudo firewall-cmd --reload

Les trois commandes, lorsqu'elles sont exécutées, afficheront le message de réussite suivant :

firewall-cmd outputsuccess

Cela permettra à Caddy de proposer librement des sites Web aux visiteurs. Dans l'étape suivante, nous allons créer un exemple de page Web et mettre à jour le Caddyfile pour le servir afin de tester l'installation de Caddy.

Étape 6 - Création d'une page Web de test et d'un Caddyfile

Commençons par créer une page HTML très simple qui affichera un simple message Hello World!. Cette commande créera un fichier index.html dans le répertoire du site Web que nous avons créé précédemment avec une seule ligne de texte, <h1>Hello World!</h1>, à l'intérieur.

echo '<h1>Hello World!</h1>' | sudo tee /var/www/index.html

Ensuite, nous remplirons le Caddyfile. Le Caddyfile, dans sa forme la plus simple, consiste en un ou plusieurs blocs de serveur qui définissent chacun la configuration d'un seul site Web. Un bloc de serveur commence par une définition d'adresse et est suivi d'accolades. À l'intérieur des accolades, vous pouvez inclure des directives de configuration à appliquer à ce site Web.

Une définition d'adresse est spécifiée sous la forme protocol://host:port. Caddy assumera lui-même certaines valeurs par défaut si vous laissez certains champs vides. Par exemple, si vous spécifiez le protocole mais pas le port, ce dernier sera automatiquement dérivé (c'est-à-dire le port 80 est supposé pour HTTP et le port 443 est supposé pour HTTPS). Les règles régissant le format d'adresse sont décrites en détail dans la documentation officielle de Caddyfile.

Ouvrez le Caddyfile que vous avez créé à l'étape 2 à l'aide de vi ou de votre éditeur de texte préféré.

sudo vi /etc/caddy/Caddyfile

Collez le contenu suivant :

/etc/caddy/Caddyfile

http:// {
    root /var/www
    gzip
}

Enregistrez ensuite le fichier et quittez. Expliquons ce que fait ce Caddyfile spécifique.

Ici, nous utilisons http:// pour la définition de l'adresse. Cela indique à Caddy qu'il doit se lier au port 80 et servir toutes les requêtes en utilisant le protocole HTTP simple (sans cryptage TLS), quel que soit le nom de domaine utilisé pour se connecter au serveur. Cela vous permettra d'accéder aux sites Web hébergés par Caddy en utilisant l'adresse IP de votre serveur.

À l'intérieur des accolades de notre bloc serveur, il y a deux directives :

  • La directive root indique à Caddy où se trouvent les fichiers du site Web. Dans notre exemple, c'est /var/www, où nous avons créé la page de test.
  • La directive gzip indique à Caddy d'utiliser la compression Gzip pour rendre le site Web plus rapide. Il n'a pas besoin de configuration supplémentaire.

Une fois le fichier de configuration prêt, démarrez le service Caddy.

sudo systemctl start caddy

Nous pouvons maintenant tester si le site Web fonctionne. Pour cela, vous utilisez l'adresse IP publique de votre serveur. Si vous ne connaissez pas l'adresse IP de votre serveur, vous pouvez l'obtenir avec curl -4 icanhazip.com. Une fois que vous l'avez, visitez http://your_server_ip dans votre navigateur préféré pour voir le site Web Hello World!.

Cela signifie que votre installation Caddy fonctionne correctement. Dans l'étape suivante, vous activerez une connexion sécurisée à votre site Web avec le support TLS automatique de Caddy.

Étape 7 - Configuration de TLS automatique

L'une des principales caractéristiques qui distingue Caddy des autres serveurs Web est sa capacité à demander et à renouveler automatiquement les certificats TLS de Let's Encrypt, une autorité de certification (CA) gratuite. De plus, la configuration de Caddy pour qu'il serve automatiquement des sites Web via une connexion sécurisée ne nécessite qu'un changement d'une ligne dans le Caddyfile.

Caddy s'occupe d'activer la connexion HTTPS sécurisée pour tous les blocs de serveur configurés et d'obtenir automatiquement les certificats nécessaires, en supposant que certaines exigences sont satisfaites par la configuration des blocs de serveur.

Pour que TLS fonctionne, les conditions suivantes doivent être remplies :

  • Caddy doit pouvoir se lier au port 443 pour HTTPS, et le même port doit être accessible depuis Internet.
  • Le protocole ne doit pas être défini sur HTTP, le port ne doit pas être défini sur 80 et TLS ne doit pas être explicitement désactivé ou remplacé par d'autres paramètres (par exemple avec la directive tls dans le bloc serveur).
  • Le nom d'hôte doit être un nom de domaine valide ; il ne doit pas être vide ou défini sur localhost ou une adresse IP. Ceci est nécessaire car Let's Encrypt ne peut émettre des certificats que pour des noms de domaine valides.
  • Caddy doit connaître l'adresse e-mail qui peut être utilisée pour la récupération de clé avec Let's Encrypt.

Si vous avez suivi ce didacticiel, la première exigence est déjà remplie. Cependant, l'adresse de bloc de serveur actuelle est configurée simplement comme http://, définissant un schéma HTTP simple sans cryptage ni nom de domaine. Nous n'avons pas non plus fourni à Caddy l'adresse e-mail requise par Let's Encrypt lors de la demande d'un certificat. Si l'adresse n'est pas fournie dans la configuration, Caddy la demande au démarrage. Cependant, étant donné que Caddy est installé en tant que service système, il ne peut pas poser de questions lors du démarrage et, par conséquent, il ne démarrera pas correctement du tout.

Pour résoudre ce problème, ouvrez à nouveau le Caddyfile pour le modifier.

sudo vi /etc/caddy/Caddyfile

Tout d'abord, remplacez la définition d'adresse de http:// par votre domaine. Cela supprime la connexion non sécurisée forcée par HTTP et fournit un nom de domaine pour le certificat TLS. Deuxièmement, fournissez à Caddy une adresse e-mail en utilisant la directive tls à l'intérieur du bloc serveur.

Le Caddyfile modifié devrait ressembler à ceci, avec votre domaine et votre adresse e-mail remplacés dans :

/etc/caddy/Caddyfile

example.com {
    root /var/www
    gzip
    tls [email protected]
}

Enregistrez le fichier et quittez l'éditeur. Pour appliquer les modifications, redémarrez Caddy.

sudo systemctl restart caddy

Dirigez maintenant votre navigateur vers https://example.com pour vérifier si les modifications ont été appliquées correctement. Si tel est le cas, vous devriez à nouveau voir la page Hello World!. Cette fois, vous pouvez vérifier que le site Web est servi avec HTTPS en regardant l'URL ou un symbole de cadenas dans la barre d'URL.

Conclusion

Vous avez maintenant configuré Caddy pour servir correctement votre site Web via une connexion TLS sécurisée. Il obtiendra et renouvellera automatiquement les certificats de Let's Encrypt, servira votre site via une connexion sécurisée à l'aide du nouveau protocole HTTP/2 et réduira le temps de chargement en utilisant la compression gzip.

Ceci est un exemple simple pour démarrer avec Caddy. Vous pouvez en savoir plus sur les fonctionnalités uniques de Caddy et les directives de configuration pour le Caddyfile dans la documentation officielle de Caddy.