Nous assemblons et configurons notre CDN

Les réseaux de distribution de contenu (CDN) sont utilisés sur les sites et dans les applications principalement pour accélérer le chargement des éléments statiques. Cela se fait grùce à la mise en cache des fichiers sur des serveurs CDN situés dans différentes régions géographiques. En demandant des données via le CDN, l'utilisateur les reçoit depuis le serveur le plus proche.

Le principe de fonctionnement et la fonctionnalitĂ© des rĂ©seaux de distribution de contenu sont Ă  peu prĂšs les mĂȘmes. Lorsqu'un serveur CDN reçoit une demande de chargement de fichier, il le rĂ©cupĂšre une fois depuis le serveur d'origine et le transmet Ă  l'utilisateur, tout en le mettant en cache pour une pĂ©riode dĂ©terminĂ©e. Pour toutes les demandes suivantes, la rĂ©ponse provient du cache. Tous les CDN disposent d'options de prĂ©-chargement des fichiers, de nettoyage du cache, de configuration de la durĂ©e de conservation, et bien plus encore.

Il arrive que pour diverses raisons, il soit nĂ©cessaire d'organiser son propre rĂ©seau de distribution de contenu, et alors — que notre guide d'assemblage d'un vĂ©lo nous aide.

Nous assemblons et configurons notre CDN
Source : Infographie vectorielle créée par pikisuperstar — www.freepik.com

Quand a-t-on besoin d'un CDN propre?

Examinons les cas oĂč le lancement de son propre CDN a du sens :

  • quand il y a un dĂ©sir d'Ă©conomiser, alors que les dĂ©penses actuelles mĂȘme en utilisant des CDN peu coĂ»teux comme BunnyCDN s'Ă©lĂšvent Ă  plusieurs centaines de dollars par mois
  • si nous voulons obtenir un cache permanent ou un cache sans voisins sur le serveur et le canal
  • dans la rĂ©gion souhaitĂ©e, il n'y a pas de points de prĂ©sence pour les services CDN
  • des configurations particuliĂšres de livraison de contenu sont nĂ©cessaires
  • nous voulons accĂ©lĂ©rer la livraison de contenu dynamique en rapprochant les serveurs de production des utilisateurs
  • il y a des inquiĂ©tudes qu'un service CDN tiers pourrait collecter ou utiliser indĂ»ment des informations sur le comportement des utilisateurs (salut aux services non conformes au RGPD) ou se livrer Ă  d'autres actions inappropriĂ©es

Dans la plupart des autres cas, il est plus judicieux d'utiliser des solutions prĂȘtes Ă  l'emploi existantes.

Que faut-il pour lancer ?

C'est merveilleux si vous avez votre propre systĂšme autonome (AS). Avec cela, vous pouvez attribuer la mĂȘme IP Ă  plusieurs serveurs et suivre ce guide au niveau du rĂ©seau pour orienter les utilisateurs vers le plus proche. Il convient de noter qu'il est mĂȘme possible de construire un rĂ©seau de distribution de contenu avec un bloc d'adresses /24. Certains fournisseurs de serveurs permettent de faire une annonce pour une utilisation dans toutes les rĂ©gions accessibles.

Si vous ne possédez pas un bloc d'adresses IP, vous aurez besoin de pour lancer un CDN simple :

  • un nom de domaine ou un sous-domaine
  • au moins deux serveurs dans diffĂ©rentes rĂ©gions. Le serveur peut ĂȘtre dĂ©diĂ© ou virtuel
  • un outil geoDNS. GrĂące Ă  cela, l'utilisateur, en se rendant sur le domaine, sera dirigĂ© vers le serveur le plus proche

Nous enregistrons le domaine et commandons les serveurs

L'enregistrement du domaine est simple — on s'inscrit dans n'importe quelle zone auprĂšs de n'importe quel registrar. Vous pouvez Ă©galement utiliser un sous-domaine pour le CDN, par exemple quelque chose comme cdn.nomdedomaine.com. En fait, c'est ce que nous allons faire dans notre exemple.

Concernant la commande des serveurs, il est prĂ©fĂ©rable de les louer dans les rĂ©gions et les pays oĂč se trouve votre audience. Si le projet est intercontinental, il est pratique de choisir des fournisseurs d'hĂ©bergement offrant des serveurs partout dans le monde. Exemples : OVH, Leaseweb et 100Tb — pour les serveurs dĂ©diĂ©s, Vultr et DigitalOcean — pour les cloud virtuels*.

Pour notre CDN privĂ©, nous allons commander 3 serveurs virtuels sur diffĂ©rents continents. À Vultr notre serveur Ă  $5/mois nous aurons 25Go SSD d'espace et 1 To de trafic. Lors de l'installation, nous choisirons la derniĂšre version de Debian. Nos serveurs :

Nous assemblons et configurons notre CDN Francfort, ip : 199.247.18.199

Nous assemblons et configurons notre CDN Chicago, ip : 149.28.121.123

Nous assemblons et configurons notre CDN Singapour, ip : 157.230.240.216

* Vultr et DigitalOcean offrent un crédit de $100 aux utilisateurs s'inscrivant via les liens de l'article, immédiatement aprÚs l'ajout d'un mode de paiement. L'auteur reçoit également un petit bonus, ce qui est significatif pour lui en ce moment. Merci de votre compréhension.

Configurons le geoDNS

Pour que l'utilisateur soit dirigé vers le serveur adéquat (le plus proche de lui) lorsqu'il accÚde au domaine ou au sous-domaine du CDN, nous avons besoin d'un serveur DNS avec la fonction geoDNS.

Le principe et le fonctionnement du geoDNS sont les suivants :

  1. Il dĂ©termine l'IP du client qui a envoyĂ© la requĂȘte DNS, ou l'IP du serveur DNS rĂ©cursif utilisĂ© lors du traitement de la demande du client. De tels serveurs rĂ©cursifs sont gĂ©nĂ©ralement des DNS des fournisseurs.
  2. Par l'IP du client, il détermine son pays ou sa région. Pour cela, on utilise des bases GeoIP, qui sont nombreuses aujourd'hui. Il existe de bonnes options gratuites.
  3. En fonction de l'emplacement du client, il lui attribue l'IP du serveur CDN le plus proche.

Un serveur DNS avec la fonction geoDNS peut construit soi-mĂȘme, mais il est prĂ©fĂ©rable d'utiliser des solutions toutes faites avec un rĂ©seau de serveurs DNS Ă  travers le monde et Anycast par dĂ©faut :

  • CloudDNS Ă  partir de $9.95/mois, tarif GeoDNS, par dĂ©faut il y a un DNS Failover
  • Zilore Ă  partir de $25/mois, DNS Failover inclus
  • Amazon Route 53 Ă  partir de 35 $/mois pour 50 millions de requĂȘtes gĂ©ographiques. DNS Failover est facturĂ© sĂ©parĂ©ment
  • DNS Made Easy Ă  partir de 125 $/mois, il y a 10 DNS Failover
  • Cloudflare, la fonction « Geo Steering » est disponible dans les plans Enterprise

Lors de la commande de geoDNS, il est important de prĂȘter attention au nombre de requĂȘtes incluses dans le plan et de garder Ă  l'esprit que le nombre rĂ©el d'appels au domaine peut largement dĂ©passer les attentes. Des millions d'araignĂ©es, de robots, de spammeurs et autres nuisibles travaillent sans relĂąche.

Pratiquement tous les services DNS incluent dans leur tarif le service indispensable à la construction d'un CDN : DNS Failover. Grùce à cela, vous pouvez configurer la surveillance de vos serveurs et, en cas d'absence de réponse, remplacer automatiquement l'adresse du serveur non fonctionnel par celle d'un secours dans les réponses DNS.

Pour construire notre CDN, nous allons utiliser ClouDNS, le plan GeoDNS.

Ajoutons dans le tableau de bord une nouvelle zone DNS en spĂ©cifiant votre domaine. Si nous construisons le CDN sur un sous-domaine et que le domaine principal est dĂ©jĂ  utilisĂ©, n'oubliez pas d'ajouter les enregistrements DNS existants immĂ©diatement aprĂšs l'ajout de la zone. La prochaine Ă©tape consiste Ă  crĂ©er plusieurs enregistrements A pour le domaine/sous-domaine du CDN, chacun Ă©tant appliquĂ© Ă  la rĂ©gion que nous avons spĂ©cifiĂ©e. Pour les rĂ©gions, vous pouvez indiquer des continents ou des pays, avec des sous-rĂ©gions disponibles pour les États-Unis et le Canada.

Dans notre cas, le CDN sera mis en place sur le sous-domaine cdn.sayt.in. En ajoutant la zone sayt.in, nous allons créer le premier enregistrement A pour le sous-domaine et diriger toute l'Amérique du Nord vers un serveur à Chicago :

Nous assemblons et configurons notre CDN
Répétons l'action pour d'autres régions, n'oublions pas de créer un enregistrement pour les régions par défaut. Voici ce que cela donnera au final :

Nous assemblons et configurons notre CDN

Le dernier enregistrement par défaut sur la capture d'écran signifie que toutes les régions non spécifiées (c'est-à-dire l'Europe, l'Afrique, les utilisateurs d'internet par satellite, etc.) seront dirigées vers un serveur à Francfort.

Nous avons donc terminé la configuration de base du DNS. Il reste à se rendre sur le site de l'enregistrement de domaine et à remplacer les NS actuels du domaine par ceux fournis par ClouDNS. Pendant que les NS seront mis à jour, nous préparerons les serveurs.

Installation des certificats SSL

Notre CDN fonctionnera en HTTPS, donc si vous avez dĂ©jĂ  des certificats SSL pour le domaine ou le sous-domaine, veuillez les tĂ©lĂ©charger sur tous les serveurs, par exemple dans le rĂ©pertoire /etc/ssl/ĐČĐ°ŃˆĐŽĐŸĐŒĐ”Đœ/

S'il n'y a pas de certificats, vous pouvez obtenir un certificat gratuit de Let’s Encrypt. Un bon choix serait d'utiliser le script ACME ShellLe client est facile et simple à configurer, et surtout, il permet de valider le domaine/sous-domaine via DNS à travers l'API de ClouDNS.

Nous installerons acme.sh uniquement sur un des serveurs - le serveur européen 199.247.18.199, à partir duquel les certificats seront copiés vers tous les autres. Pour l'installation, exécutez :

root@cdn:~# wget -O - https://get.acme.sh | bash; source ~/.bashrc

Au cours de l'installation du script, une tùche CRON sera créée pour la mise à jour future des certificats sans notre intervention.

La vérification du domaine lors de la délivrance du certificat sera effectuée via DNS en utilisant l'API, donc dans le cabinet personnel de ClouDNS, dans le menu Reseller API, vous devez créer un nouvel utilisateur API et définir un mot de passe pour celui-ci. Nous allons inscrire l'auth-id obtenu avec le mot de passe dans le fichier ~/.acme.sh/dnsapi/dns_cloudns.sh (ne pas confondre avec le fichier dns_clouddns.sh). Voici les lignes à décommenter et à modifier :

CLOUDNS_AUTH_ID=
CLOUDNS_AUTH_PASSWORD=""

Maintenant, demandons la délivrance du certificat SSL pour cdn.sayt.in

root@cdn:~# acme.sh --issue --dns dns_cloudns -d cdn.sayt.in --reloadcmd "service nginx reload"

Dans les paramÚtres, pour l'avenir, nous avons indiqué la commande pour un redémarrage automatique de la configuration du serveur web aprÚs chaque mise à jour de la durée de validité des certificats par la suite.

Tout le processus d'obtention du certificat peut prendre jusqu'Ă  2 minutes, ne l'interrompez pas. Si une erreur de validation de domaine survient, essayez d'exĂ©cuter la commande Ă  nouveau. À la fin, nous verrons oĂč les certificats ont Ă©tĂ© chargĂ©s :

Nous assemblons et configurons notre CDN

Gardons en mĂ©moire ces chemins, ils devront ĂȘtre indiquĂ©s lors de la copie du certificat sur d'autres serveurs, ainsi que dans les paramĂštres du serveur web. Ne faisons pas attention aux erreurs de redĂ©marrage des configs Nginx, - sur un serveur complĂštement configurĂ©, lors de la mise Ă  jour des certificats, cela ne se produira pas.

Tout ce qui nous reste Ă  faire concernant SSL, c'est de copier le certificat obtenu sur deux autres serveurs en gardant le chemin vers les fichiers. CrĂ©ons sur chacun d'eux les mĂȘmes rĂ©pertoires et faisons une copie :

root@cdn:~# mkdir -p /root/.acme.sh/cdn.sayt.in/
root@cdn:~# scp -r root@199.247.18.199:/root/.acme.sh/cdn.sayt.in/* /root/.acme.sh/cdn.sayt.in/

Pour que la mise à jour des certificats soit réguliÚre, créons sur les deux serveurs une tùche CRON quotidienne avec la commande :

scp -r root@199.247.18.199:/root/.acme.sh/cdn.sayt.in/* /root/.acme.sh/cdn.sayt.in/ && service nginx reload

À cet Ă©gard, l'accĂšs au serveur distant source doit ĂȘtre configurĂ© par clĂ©, c'est-Ă -dire sans saisie de mot de passe. N'oubliez pas de le faire.

Installation et configuration de Nginx

Pour la distribution de contenu statique, nous allons utiliser Nginx, configuré en tant que proxy-cache. Nous allons mettre à jour les listes de paquets et l'installer sur les trois serveurs :

root@cdn:~# apt update
root@cdn:~# apt install nginx

Utilisons Ă  la place la configuration ci-dessous :
nginx.conf

user www-data;
worker_processes auto;
pid /run/nginx.pid;

events {
    worker_connections 4096;
    multi_accept on;
}

http {
    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    types_hash_max_size 2048;

    include /etc/nginx/mime.types;
    default_type application/octet-stream;

    access_log off;
    error_log /var/log/nginx/error.log;

    gzip on;
    gzip_disable "msie6";
    gzip_comp_level 6;
    gzip_proxied any;
    gzip_vary on;
    gzip_types text/plain application/javascript text/javascript text/css application/json application/xml text/xml application/rss+xml;
    gunzip on;

    proxy_temp_path /var/cache/tmp;
    proxy_cache_path /var/cache/cdn levels=1:2 keys_zone=cdn:64m max_size=20g inactive=7d;
    proxy_cache_bypass $http_x_update;

server {
  listen 443 ssl;
  server_name cdn.sayt.in;

  ssl_certificate /root/.acme.sh/cdn.sayt.in/cdn.sayt.in.cer;
  ssl_certificate_key /root/.acme.sh/cdn.sayt.in/cdn.sayt.in.key;

  location / {
    proxy_cache cdn;
    proxy_cache_key $uri$is_args$args;
    proxy_cache_valid 90d;
    proxy_pass https://sayt.in;
    }
  }
}

Modifions la configuration :

  • max_size — la taille du cache, ne dĂ©passant pas l'espace disponible sur le disque
  • inactive — la durĂ©e de conservation des donnĂ©es mises en cache qui n'ont pas Ă©tĂ© sollicitĂ©es
  • ssl_certificate et ssl_certificate_key — chemins vers les fichiers de certificat SSL et la clĂ©
  • proxy_cache_valid — durĂ©e de conservation des donnĂ©es mises en cache
  • proxy_pass — adresse du serveur d'origine, Ă  partir duquel le CDN demandera des fichiers pour la mise en cache. Dans notre exemple, c'est sayt.in

Comme nous le voyons, c'est simple. La complexité peut seulement surgir dans la configuration du temps de mise en cache en raison de la similitude des directives. inactive et proxy_cache_validAnalysons-les dans notre exemple. Voici ce qui se passe avec inactive=7d et proxy_cache_valid 90d:

  • si la requĂȘte n'est pas rĂ©pĂ©tĂ©e pendant 7 jours, les donnĂ©es seront supprimĂ©es du cache Ă  l'expiration de cette pĂ©riode.
  • si la requĂȘte est rĂ©pĂ©tĂ©e au moins une fois tous les 7 jours, les donnĂ©es dans le cache seront considĂ©rĂ©es comme obsolĂštes aprĂšs 90 jours et lors de la prochaine requĂȘte, Nginx les mettra Ă  jour en les rĂ©cupĂ©rant sur le serveur d'origine.

Une fois les modifications terminées, nginx.confnous allons recharger la configuration :

root@cdn:~# service nginx reload

Notre CDN est entiĂšrement prĂȘt. Pour 15 $/mois, nous avons obtenu des points de prĂ©sence sur trois continents et 3 To de trafic : 1 To dans chaque localisation.

Vérifions le fonctionnement du CDN

Jetons un Ɠil aux pings vers notre CDN depuis diffĂ©rentes localisations gĂ©ographiques. Tous les services de ping devraient fonctionner.

Point de lancement
HĂŽte
IP
Temps moyen, ms

Allemagne, Berlin
cdn.sayt.in
199.247.18.199
9.6

Pays-Bas, Amsterdam
cdn.sayt.in
199.247.18.199
10.1

France, Paris
cdn.sayt.in
199.247.18.199
16.3

Royaume-Uni, Londres
cdn.sayt.in
199.247.18.199
14.9

Canada, Toronto
cdn.sayt.in
149.28.121.123
16.2

États-Unis, San Francisco
cdn.sayt.in
149.28.121.123
52.7

États-Unis, Dallas
cdn.sayt.in
149.28.121.123
23.1

États-Unis, Chicago
cdn.sayt.in
149.28.121.123
2.6

États-Unis, New York
cdn.sayt.in
149.28.121.123
19.8

Singapour
cdn.sayt.in
157.230.240.216
1.7

Japon, Tokyo
cdn.sayt.in
157.230.240.216
74.8

Australie, Sydney
cdn.sayt.in
157.230.240.216
95.9

Les rĂ©sultats sont bons. Nous allons maintenant placer une image test Ă  la racine du site principal test.jpg et vĂ©rifier la vitesse de chargement via le CDN. Il a Ă©tĂ© dit, — a Ă©tĂ© fait. Le contenu se charge rapidement.

Nous allons Ă©crire un petit script au cas oĂč nous souhaiterions vider le cache au niveau du CDN.
purge.sh

#!/bin/bash
if [ -z "$1" ]
then
    echo "Purging all cache"
    rm -rf /var/cache/cdn/*
else
    echo "Purging $1"
    FILE=`echo -n "$1" | md5sum | awk '{print $1}'`
    FULLPATH=/var/cache/cdn/${FILE:31:1}/${FILE:29:2}/${FILE}
    rm -f "${FULLPATH}"
fi

Pour supprimer tout le cache, il suffit de le lancer, un fichier sĂ©parĂ© peut ĂȘtre vidĂ© comme suit :

root@cdn:~# ./purge.sh /test.jpg

Au lieu des conclusions

Enfin, je veux donner quelques conseils utiles pour éviter les piÚges qui m'ont fait souffrir par le passé :

  • Pour amĂ©liorer la rĂ©silience du CDN, il est recommandĂ© de configurer le DNS Failover, qui aide Ă  changer rapidement l'enregistrement A en cas de panne du serveur. Cela se fait dans le panneau de gestion des enregistrements DNS du domaine.
  • Les sites avec une large couverture gĂ©ographique nĂ©cessitent sans aucun doute un grand nombre de points CDN, mais faisons-le sans excĂšs. Il est probable que l'utilisateur ne remarquera pas de diffĂ©rence significative par rapport Ă  un CDN payant si vous placez des serveurs dans 6 Ă  7 emplacements : Europe, AmĂ©rique du Nord (est), AmĂ©rique du Nord (ouest), Singapour, Australie, Hong Kong ou Japon.
  • Parfois, les hĂ©bergeurs n'autorisent pas l'utilisation de serveurs louĂ©s Ă  des fins de CDN. Donc, si jamais vous dĂ©cidez de dĂ©ployer un rĂ©seau de livraison de contenu en tant que service, n'oubliez pas de lire Ă  l'avance les rĂšgles spĂ©cifiques du fournisseur d'hĂ©bergement.
  • Étudiez la carte des communications sous-marines, pour comprendre comment les continents sont liĂ©s et prendre cela en compte lors de la construction du rĂ©seau de livraison de contenu.
  • Essayez de vĂ©rifier les pings depuis diffĂ©rents endroits vers vos serveurs. Cela permet de voir les rĂ©gions les plus proches des points CDN et de configurer plus correctement le GeoDNS.
  • Selon les tĂąches, il peut ĂȘtre utile de rĂ©gler Nginx en fonction des exigences spĂ©cifiques de mise en cache et en tenant compte de la charge sur le serveur. Les articles sur le cache Nginx m'ont beaucoup aidĂ© dans ce domaine — ici et sur l'accĂ©lĂ©ration des performances en cas de charges importantes : ici et ici

Source : habr.com

Acheter un hĂ©bergement fiable pour les sites avec protection DDoS, serveurs VPS VDS đŸ”„ Acheter un hĂ©bergement fiable pour les sites avec protection DDoS, serveurs VPS VDS | ProHoster