Créez et personnalisez votre 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 produit en raison de la mise en cache des fichiers sur les serveurs CDN situés dans différentes régions géographiques. AprÚs avoir demandé des données via CDN, l'utilisateur les reçoit du serveur le plus proche.

Le principe de fonctionnement et de fonctionnalitĂ© de tous les rĂ©seaux de diffusion de contenu est Ă  peu prĂšs le mĂȘme. Ayant reçu une demande de tĂ©lĂ©chargement d'un fichier, le serveur CDN le prend une fois du serveur d'origine et le remet Ă  l'utilisateur, en mĂȘme temps la mise en cache pendant une durĂ©e donnĂ©e. Toutes les demandes suivantes reçoivent une rĂ©ponse du cache. Tous les CDN ont des options pour le prĂ©chargement de fichiers, l'effacement du cache, la dĂ©finition de sa pĂ©riode de rĂ©tention, et bien plus encore.

Il arrive que pour une raison ou une autre, il soit nécessaire d'organiser notre propre réseau de diffusion de contenu, puis - laissez-nous vous aider à construire un autre vélo.


Source: vecteur infographique créé par pikisuperstar - www.freepik.com


Lorsque vous avez besoin de votre propre CDN


Tenez compte des cas lors du démarrage de votre propre CDN:

  • lorsque vous voulez Ă©conomiser de l'argent et que les coĂ»ts de fonctionnement mĂȘme en utilisant des CDN peu coĂ»teux comme BunnyCDN sont de 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 dont vous avez besoin, les services CDN n'ont pas de points de prĂ©sence
  • tout paramĂštre de diffusion de contenu spĂ©cial requis
  • nous voulons accĂ©lĂ©rer la livraison de contenu dynamique en nous rapprochant des utilisateurs du serveur de production
  • il existe une crainte qu'un service CDN tiers puisse collecter ou utiliser illĂ©galement des informations sur le comportement des utilisateurs (accĂšs aux services sans GDPR) ou se livrer Ă  d'autres actions illĂ©gales

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


Ce dont vous avez besoin pour courir


C'est merveilleux si vous avez votre propre systĂšme autonome (AS). Avec lui, vous pouvez attribuer la mĂȘme IP Ă  plusieurs serveurs et suivre cette instruction au niveau du rĂ©seau pour diriger les utilisateurs vers le plus proche. Il faut dire que mĂȘme avec le bloc d'adresses / 24, il est possible de construire un rĂ©seau de diffusion de contenu. Certains fournisseurs de serveurs vous permettent de faire une annonce Ă  utiliser dans toutes les rĂ©gions Ă  leur disposition.

Si vous n'ĂȘtes pas un heureux propriĂ©taire d'un bloc d'adresses IP, alors pour exĂ©cuter un simple CDN, vous aurez besoin de:

  • . ,
  • geoDNS . , ,



Avec l'enregistrement de domaine, tout est simple - inscrivez-vous dans n'importe quelle zone avec n'importe quel registraire. Vous pouvez Ă©galement utiliser un sous-domaine pour un CDN, tel que quelque chose comme cdn.namedomain.com . En fait, dans notre exemple, nous le ferons.

Quant aux serveurs de commande, ils doivent ĂȘtre louĂ©s dans les rĂ©gions et pays oĂč se trouve votre audience d'utilisateurs. Si le projet est intercontinental, il est pratique de choisir immĂ©diatement des hĂ©bergeurs qui proposent des serveurs partout dans le monde. Exemples: OVH , Leaseweb et 100 To pour les serveurs dĂ©diĂ©s, Vultr et DigitalOcean pour le cloud virtuel *.

Pour notre CDN privĂ©, nous commandons 3 serveurs virtuels sur diffĂ©rents continents. À vultrsur le serveur pour 5 $ / mois, nous obtenons 25 Go d' espace SSD et 1 To de trafic . Lors de l'installation, sĂ©lectionnez la derniĂšre Debian. Nos serveurs:

Francfort , ip: 199.247.18.199

Chicago , ip: 149.28.121.123

Singapour , ip: 157.230.240.216

* Vultr et DigitalOcean promettent un prĂȘt de 100 $ aux utilisateurs enregistrĂ©s en utilisant les liens dans l'article immĂ©diatement aprĂšs l'ajout d'un mode de paiement. L'auteur en reçoit Ă©galement un petit compliment, ce qui est trĂšs important pour lui maintenant. Soyez comprĂ©hensif.


Configurer geoDNS


Pour qu'un utilisateur accÚde à un domaine ou sous-domaine CDN, il soit dirigé vers le serveur souhaité (le plus proche de lui), nous avons besoin d'un serveur DNS avec fonction geoDNS.

Le principe et la procédure de geoDNS sont les suivants:

  1. Définit l'IP du client qui a envoyé la demande DNS ou l'IP du serveur DNS récursif utilisé pour traiter la demande client. Ces serveurs récursifs sont généralement des fournisseurs DNS.
  2. Par IP, le client connaßt son pays ou sa région. Pour cela, des bases GeoIP sont utilisées, dont il existe aujourd'hui un grand nombre. Il existe de bonnes options gratuites .
  3. En fonction de l'emplacement du client, il lui donne l'adresse IP du serveur CDN le plus proche.

Vous pouvez crĂ©er vous-mĂȘme un serveur DNS avec la fonction geoDNS , mais il est prĂ©fĂ©rable d'utiliser des solutions prĂȘtes Ă  l'emploi avec un rĂ©seau de serveurs DNS dans le monde entier et Anycast prĂȘt Ă  l'emploi :

  • louDNS Ă  partir de 9,95 $ / mois , tarif GeoDNS, par dĂ©faut il y a un basculement DNS
  • Zilore Ă  partir de 25 $ / mois , basculement DNS activĂ©
  • Amazon Route 53 Ă  partir de 35 $ / mois pour 50 millions de requĂȘtes gĂ©ographiques nettes. Le basculement DNS est facturĂ© sĂ©parĂ©ment
  • DNS Made Easy Ă  partir de 125 $ / mois , il y a 10 basculements DNS
  • Cloudflare , fonction de pilotage gĂ©ographique disponible dans les tarifs d'entreprise

Lors de la commande de geoDNS, vous devez faire attention au nombre de demandes incluses dans le tarif et tenir compte du fait que le nombre réel d'appels vers le domaine peut dépasser plusieurs fois les attentes. Des millions d'araignées, de scanners, de spammeurs et d'autres mauvais esprits travaillent sans relùche.

Presque tous les services DNS incluent un indispensable pour la création d'un service CDN - le basculement DNS. En l'utilisant, vous pouvez configurer la surveillance de vos serveurs et, en l'absence de signes de vie, remplacer automatiquement l'adresse du serveur qui ne fonctionne pas par un serveur de sauvegarde dans les réponses DNS.

Pour construire notre CDN, nous utiliserons ClouDNS , le tarif GeoDNS.

Ajoutez une nouvelle zone DNS dans votre compte, en indiquant votre domaine. Si nous allons crĂ©er le CDN sur un sous-domaine et que le domaine principal est dĂ©jĂ  utilisĂ©, alors immĂ©diatement aprĂšs l'ajout de la zone, n'oubliez pas d'ajouter les enregistrements DNS existants. L'Ă©tape suivante consiste Ă  crĂ©er pour le domaine / sous-domaine CDN plusieurs enregistrements A, dont chacun sera appliquĂ© Ă  la rĂ©gion que nous avons dĂ©finie. Vous pouvez spĂ©cifier des continents ou des pays comme rĂ©gions; des sous-rĂ©gions sont disponibles pour les États-Unis et le Canada.

Dans notre cas, le CDN sera porté sur la cdn.sayt.in sous - domaine . En ajoutant la zone sayt.in , créez le premier enregistrement A pour le sous-domaine et dirigez toute l'Amérique du Nord vers le serveur de Chicago:


Répétez l'opération pour les autres régions, en vous rappelant de créer une entrée pour les régions par défaut. Voici le résultat:



Le dernier enregistrement par défaut dans la capture d'écran signifie que toutes les régions tacites (c'est-à-dire l'Europe, l'Afrique, les utilisateurs d'Internet par satellite, etc.) seront envoyées à un serveur à Francfort.

Ceci termine la configuration DNS de base. Reste à aller sur le site du registraire de domaine et à remplacer les NS de domaine actuels par ceux émis par ClouDNS. Et tandis que les NS seront mis à jour, nous préparerons le serveur.


Installer des certificats SSL


Notre CDN fonctionnera sur HTTPS, donc si vous avez déjà des certificats SSL pour un domaine ou un sous-domaine, téléchargez-les sur tous les serveurs, par exemple, dans le répertoire / etc / ssl / yourdomain /

S'il n'y a pas de certificats, vous pouvez en obtenir un gratuitement auprĂšs de Let's Encrypt. Le script ACME Shell est parfait pour cela . Le client est pratique et facile Ă  configurer, et surtout - vous permet de valider le domaine / sous-domaine pour DNS via l'API de ClouDNS.

Nous n'installerons acme.sh que sur l'un des serveurs - European 199.247.18.199, à partir duquel les certificats seront copiés sur tous les autres. Pour installer, faites:

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

Pendant l'installation du script, une tùche CRON sera créée pour le renouvellement ultérieur des certificats sans notre participation.

La vérification du domaine lors de la délivrance d'un certificat sera effectuée à l'aide de DNS à l'aide de l'API.Par conséquent, dans le compte personnel ClouDNS du menu API du revendeur, vous devez créer une nouvelle API utilisateur et définir un mot de passe pour celle-ci. L'auth-id résultant avec le mot de passe est écrit dans le fichier ~ / .acme.sh / dnsapi / dns_cloudns.sh (à ne pas confondre avec le fichier dns_clou d dns.sh ). Voici les lignes pour décommenter et modifier:

CLOUDNS_AUTH_ID=<auth-id>
CLOUDNS_AUTH_PASSWORD="<>"

Maintenant, nous demandons un 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 spécifié une commande pour recharger automatiquement la configuration du serveur Web aprÚs chaque renouvellement de la période de validité du certificat à l'avenir.

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



rappelez - vous ces chemins, ils devront ĂȘtre spĂ©cifiĂ©s lors de la copie du certificat sur d'autres serveurs, ainsi que dans les paramĂštres du serveur Web. Nous ne prĂȘtons pas attention Ă  l'erreur de rechargement des fichiers de configuration Nginx - sur un serveur entiĂšrement configurĂ©, il ne sera pas prĂ©sent lors du renouvellement des certificats.

Il ne nous reste plus que SSL Ă  copier le certificat reçu sur deux autres serveurs en enregistrant le chemin d'accĂšs aux fichiers. CrĂ©ez les mĂȘmes rĂ©pertoires sur chacun d'eux et faites 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 le renouvellement du certificat soit régulier, nous allons créer une tùche CRON quotidienne sur les deux serveurs 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

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


Installer et configurer Nginx


Pour renvoyer du contenu statique, nous utiliserons Nginx, configuré comme serveur proxy de mise en cache. Mettez à jour la liste des packages et installez-la sur les trois serveurs:

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

Au lieu de la valeur par défaut, utilisez la configuration du spoiler 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;
    }
  }
}


Dans la config, Ă©ditez:

  • max_size - la taille du cache ne dĂ©passe pas l'espace disque disponible
  • inactif - durĂ©e de stockage des donnĂ©es en cache auxquelles personne n'a accĂ©dĂ©
  • ssl_certificate et ssl_certificate_key - chemins d'accĂšs aux certificats SSL et aux fichiers de clĂ©s
  • proxy_cache_valid - durĂ©e de stockage des donnĂ©es mises en cache
  • proxy_pass - l'adresse du serveur d'origine Ă  partir de laquelle le CDN demandera des fichiers pour la mise en cache. Dans notre exemple, c'est sayt.in

Comme vous pouvez le voir, tout est simple. La complexité ne peut survenir que dans la définition du temps de cache en raison de la similitude des directives inactive et proxy_cache_valid . Nous les analyserons dans notre exemple. Voici ce qui se passe avec inactive = 7d et proxy_cache_valid 90d :

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

AprÚs avoir édité nginx.conf , rechargez la configuration:

root@cdn:~# service nginx reload

Notre CDN est complĂštement prĂȘt. Pour 15 $ / mois nous avons des points de prĂ©sence sur trois continents et 3 To de trafic: 1 To Ă  chaque endroit.


VĂ©rification du fonctionnement de CDN


Regardons les pings vers notre CDN à partir de différents emplacements géographiques. Pour cela, tous les services de ping conviennent.
Point de lancementHĂŽteIPTemps moyen, ms
Allemagne Berlincdn.sayt.in199.247.18.1999,6
Pays-Bas, Amsterdamcdn.sayt.in199.247.18.19910.1
France Pariscdn.sayt.in199.247.18.19916,3
Grande-Bretagne, Londrescdn.sayt.in199.247.18.19914,9
Canada Torontocdn.sayt.in149.28.121.12316,2
États-Unis, San Franciscocdn.sayt.in149.28.121.12352,7
États-Unis, Dallascdn.sayt.in149.28.121.12323,1
États-Unis, Chicagocdn.sayt.in149.28.121.1232.6
États-Unis, New Yorkcdn.sayt.in149.28.121.12319,8
Singapourcdn.sayt.in157.230.240.2161,7
Japon Tokyocdn.sayt.in157.230.240.21674,8
Australie, Sydneycdn.sayt.in157.230.240.21695,9
Les résultats sont bons. Nous allons maintenant placer l'image test test.jpg à la racine du site principal et vérifier la vitesse de son téléchargement via CDN. AussitÎt dit, aussitÎt fait . Le contenu est livré rapidement.

Nous allons Ă©crire un petit script au cas oĂč nous voudrions vider le cache sur le point 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 l'intĂ©gralitĂ© du cache, il suffit de l'exĂ©cuter, un fichier sĂ©parĂ© peut ĂȘtre nettoyĂ© comme ceci:

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


Au lieu de conclusions


Enfin, je veux donner quelques conseils utiles afin de franchir immĂ©diatement le rĂąteau, ce qui m'a un jour fait mal Ă  la tĂȘte:

  • Pour augmenter la tolĂ©rance aux pannes CDN, il est recommandĂ© de configurer le basculement DNS, ce qui permet de modifier rapidement un enregistrement A en cas de dĂ©faillance du serveur. Cela se fait dans le panneau de contrĂŽle des enregistrements DNS du domaine
  • CDN, . CDN, 6-7 : , (), (), , ,
  • CDN. , , -
  • , ,
  • Essayez de vĂ©rifier les pings de diffĂ©rents endroits vers vos serveurs. Ainsi, vous pouvez voir les rĂ©gions les plus proches des points CDN et configurer correctement GeoDNS
  • Selon les tĂąches, il n'est pas dĂ©placĂ© de configurer Nginx pour des exigences de mise en cache spĂ©cifiques et en tenant compte de la charge sur le serveur. Les articles sur le cache Nginx - ici et l'accĂ©lĂ©ration du travail sous de lourdes charges: ici et ici m'ont beaucoup aidĂ©.

All Articles