Erstellen und passen Sie Ihr CDN an

Content Delivery Networks (CDNs) werden auf Websites und in Anwendungen hauptsächlich verwendet, um das Laden statischer Elemente zu beschleunigen. Dies geschieht durch das Zwischenspeichern von Dateien auf CDN-Servern in verschiedenen geografischen Regionen. Nachdem der Benutzer Daten über CDN angefordert hat, erhält er sie vom nächstgelegenen Server.

Das Funktionsprinzip und die Funktionalität aller Content Delivery-Netzwerke sind ungefähr gleich. Nachdem der CDN-Server eine Anforderung zum Herunterladen einer Datei erhalten hat, nimmt er diese einmal vom ursprünglichen Server und gibt sie an den Benutzer weiter, wobei er sie für einen bestimmten Zeitraum zwischenspeichert. Alle nachfolgenden Anfragen werden aus dem Cache beantwortet. Alle CDNs bieten Optionen zum Vorladen von Dateien, zum Löschen des Caches, zum Festlegen der Aufbewahrungsdauer und vieles mehr.

Es kommt vor, dass Sie aus dem einen oder anderen Grund Ihr eigenes Netzwerk für die Bereitstellung von Inhalten organisieren müssen und dann - lassen Sie sich von uns beim Bau eines weiteren Fahrrads unterstützen.


Quelle: Infografik-Vektor erstellt von pikisuperstar - www.freepik.com


Wenn Sie Ihr eigenes CDN benötigen


Berücksichtigen Sie die Fälle, in denen das Starten eines eigenen CDN sinnvoll ist:

  • Wenn Sie Geld sparen möchten und die laufenden Kosten selbst bei Verwendung kostengünstiger CDNs wie BunnyCDN mehrere hundert Dollar pro Monat betragen
  • wenn wir einen permanenten Cache oder einen Cache ohne Nachbarn auf dem Server und dem Kanal erhalten möchten
  • In der Region, die Sie benötigen, haben CDN-Dienste keine Präsenzpunkte
  • Alle speziellen Einstellungen für die Bereitstellung von Inhalten sind erforderlich
  • Wir möchten die Bereitstellung dynamischer Inhalte beschleunigen, indem wir näher an die Benutzer des Produktionsservers heranrücken
  • Es besteht die Sorge, dass ein CDN-Dienst eines Drittanbieters unrechtmäßig Informationen über das Benutzerverhalten sammelt oder verwendet (Hi-to-Dienste ohne GDPR-Konformität) oder andere illegale Handlungen ausführt

In den meisten anderen Fällen ist es ratsamer, vorhandene vorgefertigte Lösungen zu verwenden.


Was du zum Laufen brauchst


Es ist wunderbar, wenn Sie ein eigenes autonomes System (AS) haben. Damit können Sie mehreren Servern dieselbe IP zuweisen und diese Anweisung auf Netzwerkebene befolgen , um Benutzer zum nächsten zu leiten. Es ist erwähnenswert, dass es auch mit dem Adressblock / 24 möglich ist, ein Netzwerk für die Bereitstellung von Inhalten aufzubauen. Bei einigen Serveranbietern können Sie ihnen eine Ankündigung zur Verwendung in allen Regionen zur Verfügung stellen.

Wenn Sie kein glücklicher Besitzer eines IP-Adressblocks sind, benötigen Sie zum Ausführen eines einfachen CDN Folgendes:

  • . ,
  • geoDNS . , ,



Mit der Domainregistrierung ist alles einfach - registrieren Sie sich in jeder Zone bei jedem Registrar. Sie können auch eine Subdomain für ein CDN verwenden, z. B. cdn.namedomain.com . In unserem Beispiel werden wir dies tatsächlich tun.

Die Bestellung von Servern sollte in den Regionen und Ländern gemietet werden, in denen sich Ihre Benutzergruppe befindet. Wenn das Projekt interkontinental ist, ist es bequem, Hosting-Anbieter auszuwählen, die Server auf der ganzen Welt sofort anbieten. Beispiele: OVH , Leaseweb und 100 TB für dedizierte Server, Vultr und DigitalOcean für die virtuelle Cloud *.

Für unser privates CDN bestellen wir 3 virtuelle Server auf verschiedenen Kontinenten. Bei vultrAuf dem Server für 5 US-Dollar pro Monat erhalten wir 25 GB SSD- Speicherplatz und 1 TB Datenverkehr . Wählen Sie bei der Installation das neueste Debian aus. Unsere Server:

Frankfurt , IP: 199.247.18.199

Chicago , IP: 149.28.121.123

Singapur , IP: 157.230.240.216

* Vultr und DigitalOcean versprechen Benutzern, die über die Links im Artikel registriert sind, unmittelbar nach dem Hinzufügen einer Zahlungsmethode ein Darlehen in Höhe von 100 USD. Der Autor erhält auch ein kleines Kompliment, das für ihn jetzt sehr wichtig ist. Bitte haben Sie Verständnis.


Konfigurieren Sie geoDNS


Wenn ein Benutzer auf eine CDN-Domäne oder Subdomäne zugreift und zu dem gewünschten (ihm am nächsten gelegenen) Server geleitet wird, benötigen wir einen DNS-Server mit der Funktion geoDNS.

Das Prinzip und Verfahren von geoDNS lautet wie folgt:

  1. Definiert die IP des Clients, der die DNS-Anforderung gesendet hat, oder die IP des rekursiven DNS-Servers, der zur Verarbeitung der Clientanforderung verwendet wird. Diese rekursiven Server sind normalerweise DNS-Anbieter.
  2. Per IP kennt der Kunde sein Land oder seine Region. Hierfür werden GeoIP-Basen verwendet, von denen es heute sehr viele gibt. Es gibt einige gute kostenlose Optionen .
  3. Abhängig vom Standort des Clients gibt er ihm die IP-Adresse des nächstgelegenen CDN-Servers.

Sie können einen DNS-Server mit der geoDNS-Funktion selbst erstellen. Es ist jedoch besser, vorgefertigte Lösungen mit einem Netzwerk von DNS-Servern auf der ganzen Welt und Anycast out of the box zu verwenden:

  • DlouDNS ab 9,95 USD / Monat , GeoDNS-Tarif, standardmäßig gibt es ein DNS-Failover
  • Zilore ab 25 US-Dollar / Monat , DNS-Failover aktiviert
  • Amazon Route 53 ab 35 USD / Monat für 50 Mio. Netto-Geo-Anfragen. DNS-Failover wird separat berechnet
  • DNS leicht gemacht ab 125 US-Dollar / Monat , es gibt 10 DNS-Failover
  • Cloudflare , Geolenkungsfunktion in Enterprise-Tarifen verfügbar

Bei der Bestellung von geoDNS sollten Sie auf die Anzahl der im Tarif enthaltenen Anfragen achten und berücksichtigen, dass die tatsächliche Anzahl der Anrufe in die Domain die Erwartungen um ein Vielfaches übertreffen kann. Millionen von Spinnen, Scannern, Spammern und anderen bösen Geistern arbeiten unermüdlich.

Fast alle DNS-Dienste enthalten ein für den Aufbau eines CDN-Dienstes unverzichtbares DNS-Failover. Mithilfe dieser Funktion können Sie die Überwachung Ihrer Server konfigurieren und in Abwesenheit von Lebenszeichen die nicht funktionierende Serveradresse in DNS-Antworten automatisch durch einen Sicherungsserver ersetzen.

Für die Erstellung unseres CDN verwenden wir ClouDNS , den GeoDNS-Tarif.

Fügen Sie Ihrem Konto eine neue DNS-Zone hinzu, die Ihre Domain angibt. Wenn Sie das CDN auf einer Subdomain erstellen und die Hauptdomäne bereits verwendet wird, vergessen Sie nicht, unmittelbar nach dem Hinzufügen der Zone die vorhandenen funktionierenden DNS-Einträge hinzuzufügen. Der nächste Schritt besteht darin, für die CDN-Domäne / Subdomäne mehrere A-Datensätze zu erstellen, von denen jeder auf die von uns festgelegte Region angewendet wird. Sie können Kontinente oder Länder als Regionen angeben. Für die USA und Kanada sind Unterregionen verfügbar.

In unserem Fall wird das CDN in der Subdomain cdn.sayt.in ausgelöst . Wenn Sie die Zone sayt.in hinzufügen , erstellen Sie den ersten A-Datensatz für die Subdomain und leiten Sie ganz Nordamerika an den Server in Chicago weiter:


Wiederholen Sie diesen Vorgang für andere Regionen, und denken Sie daran, einen Eintrag für die Standardregionen zu erstellen. Hier ist das Ergebnis:



Der letzte Standarddatensatz im Screenshot bedeutet, dass alle unausgesprochenen Regionen (und dies sind Europa, Afrika, Satelliten-Internetnutzer usw.) an einen Server in Frankfurt gesendet werden.

Damit ist die grundlegende DNS-Konfiguration abgeschlossen. Es bleibt, auf die Website des Domain-Registrars zu gehen und die aktuellen Domain-NS durch die von ClouDNS herausgegebenen zu ersetzen. Und während NSs aktualisiert werden, bereiten wir den Server vor.


Installieren Sie SSL-Zertifikate


Unser CDN funktioniert mit HTTPS. Wenn Sie also bereits SSL-Zertifikate für eine Domain oder Subdomain haben, laden Sie diese auf alle Server hoch , z. B. im Verzeichnis / etc / ssl / yourdomain /

Wenn keine Zertifikate vorhanden sind, können Sie ein kostenloses Zertifikat von Let's Encrypt erhalten. Das ACME Shell-Skript ist dafür perfekt geeignet . Der Client ist bequem und einfach zu konfigurieren und ermöglicht es Ihnen vor allem, die Domain / Subdomain für DNS über die API von ClouDNS zu validieren.

Wir werden acme.sh nur auf einem der Server installieren - European 199.247.18.199, von dem Zertifikate auf alle anderen kopiert werden. Gehen Sie zum Installieren wie folgt vor:

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

Während der Installation des Skripts wird eine CRON-Aufgabe zur weiteren Erneuerung von Zertifikaten ohne unsere Teilnahme erstellt.

Die Domänenüberprüfung bei der Ausstellung eines Zertifikats erfolgt über DNS mithilfe der API. Daher müssen Sie im persönlichen ClouDNS-Konto im Menü Reseller-API eine neue Benutzer-API erstellen und ein Kennwort dafür festlegen. Die resultierende Auth-ID mit dem Passwort wird in die Datei ~ / .acme.sh / dnsapi / dns_cloudns.sh geschrieben (nicht zu verwechseln mit der Datei dns_clou d dns.sh ). Hier sind die Zeilen zum Kommentieren und Bearbeiten:

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

Jetzt bitten wir um ein SSL-Zertifikat für cdn.sayt.in

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

In den Parametern für die Zukunft haben wir einen Befehl angegeben, um die Webserverkonfiguration nach jeder Erneuerung der Gültigkeitsdauer des Zertifikats in der Zukunft automatisch neu zu laden.

Der gesamte Vorgang zum Erhalten eines Zertifikats kann bis zu 2 Minuten dauern. Unterbrechen Sie es nicht. Wenn ein Domänenüberprüfungsfehler auftritt, führen Sie den Befehl erneut aus. Am Ende werden wir sehen, wo die Zertifikate hochgeladen wurden:



Denken Sie daran, dass diese Pfade beim Kopieren des Zertifikats auf andere Server sowie in den Webservereinstellungen angegeben werden müssen. Wir achten nicht auf den Fehler beim erneuten Laden von Nginx-Konfigurationsdateien - auf einem vollständig konfigurierten Server ist er beim Erneuern von Zertifikaten nicht vorhanden.

Über SSL bleibt uns lediglich das Kopieren des empfangenen Zertifikats auf zwei andere Server, wobei der Pfad zu den Dateien gespeichert wird. Erstellen Sie für jedes Verzeichnis die gleichen Verzeichnisse und erstellen Sie eine Kopie:

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/

Damit die Zertifikatserneuerung regelmäßig erfolgt, erstellen wir auf beiden Servern mit dem folgenden Befehl eine tägliche CRON-Task:
scp -r root@199.247.18.199:/root/.acme.sh/cdn.sayt.in/* /root/.acme.sh/cdn.sayt.in/ && service nginx reload

In diesem Fall muss der Zugriff auf den Remote-Quellserver über einen Schlüssel konfiguriert werden , d. H. ohne ein Passwort einzugeben. Vergiss nicht es zu tun.


Installieren und konfigurieren Sie Nginx


Um statischen Inhalt zurückzugeben, verwenden wir Nginx, das als Caching-Proxyserver konfiguriert ist. Aktualisieren Sie die Liste der Pakete und installieren Sie sie auf allen drei Servern:

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

Verwenden Sie anstelle der Standardeinstellung die Konfiguration aus dem folgenden Spoiler:
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;
    }
  }
}


Bearbeiten Sie in der Konfiguration:

  • max_size - Cache-Größe, die den verfügbaren Speicherplatz nicht überschreitet
  • inaktiv - Speicherzeit für zwischengespeicherte Daten, auf die niemand zugegriffen hat
  • ssl_certificate und ssl_certificate_key - Pfade zu SSL-Zertifikat- und Schlüsseldateien
  • proxy_cache_valid - Speicherzeit für zwischengespeicherte Daten
  • proxy_pass - Die Adresse des ursprünglichen Servers, von dem das CDN Dateien zum Zwischenspeichern anfordert. In unserem Beispiel ist dies sayt.in

Wie Sie sehen, ist alles einfach. Komplexität kann nur beim Festlegen der Cache-Zeit aufgrund der Ähnlichkeit der Anweisungen inaktiv und proxy_cache_valid auftreten . Wir werden sie in unserem Beispiel analysieren. Folgendes passiert mit inactive = 7d und proxy_cache_valid 90d :

  • Wird die Anforderung nicht innerhalb von 7 Tagen wiederholt, werden die Daten nach diesem Zeitraum aus dem Cache gelöscht
  • Wenn die Anforderung mindestens alle 7 Tage wiederholt wird, gelten die Daten im Cache nach 90 Tagen als veraltet. Bei der nächsten Anforderung aktualisiert Nginx sie, indem sie vom ursprünglichen Server übernommen werden

Nachdem Sie die Bearbeitung von nginx.conf abgeschlossen haben , laden Sie die Konfiguration neu:

root@cdn:~# service nginx reload

Unser CDN ist komplett fertig. Für 15 $ / Monat Wir haben Präsenzpunkte auf drei Kontinenten und 3 TB Verkehr: 1 TB an jedem Standort.


Überprüfen der Funktion von CDN


Schauen wir uns die Pings zu unserem CDN von verschiedenen geografischen Standorten aus an. Hierfür sind alle Ping-Dienste geeignet.
StartpunktWirtIPDurchschnittliche Zeit, ms
Deutschland Berlincdn.sayt.in199.247.18.1999.6
Niederlande, Amsterdamcdn.sayt.in199.247.18.19910.1
Frankreich Pariscdn.sayt.in199.247.18.19916.3
Großbritannien, Londoncdn.sayt.in199.247.18.19914.9
Kanada Torontocdn.sayt.in149.28.121.12316.2
USA, San Franciscocdn.sayt.in149.28.121.12352.7
USA, Dallascdn.sayt.in149.28.121.12323.1
USA, Chicagocdn.sayt.in149.28.121.1232.6
USA, New Yorkcdn.sayt.in149.28.121.12319.8
Singapurcdn.sayt.in157.230.240.2161.7
Japan Tokiocdn.sayt.in157.230.240.21674.8
Australien, Sydneycdn.sayt.in157.230.240.21695,9
Die Ergebnisse sind gut. Jetzt platzieren wir das Testbild test.jpg im Stammverzeichnis der Hauptseite und überprüfen die Geschwindigkeit des Downloads über CDN. Kaum gesagt als getan . Inhalte werden schnell geliefert.

Wir werden ein kleines Skript schreiben, falls wir den Cache auf dem CDN-Punkt leeren möchten.
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


Um den gesamten Cache zu löschen, führen Sie ihn einfach aus. Eine separate Datei kann folgendermaßen bereinigt werden:

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


Anstelle von Schlussfolgerungen


Abschließend möchte ich einige nützliche Tipps geben, um sofort über den Rechen zu treten, was mir einmal den Kopf wund gemacht hat:

  • Um die CDN-Fehlertoleranz zu erhöhen, wird empfohlen, DNS-Failover zu konfigurieren, um den A-Eintrag bei einem Serverausfall schnell zu ändern. Dies erfolgt in der Systemsteuerung der DNS-Einträge der Domäne
  • CDN, . CDN, 6-7 : , (), (), , ,
  • CDN. , , -
  • , ,
  • Versuchen Sie, Pings von verschiedenen Orten auf Ihren Servern zu überprüfen . So können Sie die Regionen sehen, die den CDN-Punkten am nächsten liegen, und GeoDNS korrekt konfigurieren
  • Abhängig von den Aufgaben ist es nicht unangebracht, Nginx für bestimmte Caching-Anforderungen zu konfigurieren und die Belastung des Servers zu berücksichtigen. Die Artikel über den Nginx-Cache - hier und die Beschleunigung der Arbeit unter hoher Last: hier und hier haben mir sehr geholfen.

All Articles