Wofür sollen wir ein CDN bauen?

Hallo Habr! In diesem Artikel werden wir unser eigenes CDN erstellen. Warum nicht vorgefertigte Lösungen verwenden? Da die Website des Autors vollständig statisch ist und auf Jekyll erstellt wurde, mit großen Bildern, die so schnell wie möglich bereitgestellt werden müssen. Der Server sollte nicht zwischengespeichert werden, er sollte die gesamte Site speichern, HTTP / 2 und Brotli unterstützen und auf allen Servern sollte dasselbe Zertifikat installiert sein.

Wir werden alles auch auf IIS ausführen, das unter Windows Server 2019 Core ausgeführt wird.


Kurz zur Umsetzung


An den Endknoten werden wir die in das Betriebssystem eingebauten Mittel verwalten, die wir benötigen:

  1. Active Directory
  2. Dfs
  3. IIS
  4. Winacme
  5. RSAT

Optional, aber empfohlen:

  1. Windows Admin Center

Auf Sites mit Sites werden nur IIS und DFS benötigt, Active Directory ist erforderlich, es ist für DFS erforderlich, das den Inhalt der Site zwischen Servern synchronisiert. RSAT wird zum Verwalten von Komponenten benötigt, und Windows Admin Center wird zum Bearbeiten der Registrierung benötigt. Dies kann auch durch Powershell geschehen, auf das ich auch eingehen werde.

Die Domain des Autors heißt ***. ***. Wtf (bitte keine Angst), und die Server sind nach Rechenzentren benannt und haben Namen der Form cache-zur1, cahe-ru usw. AD wird bereitgestellt und Server sind damit verbunden. Jetzt in Ordnung.

Punktauswahl


RUVDS verfügt über 8 Rechenzentren - 3 in Europa und 5 in Russland. Meine Wahl fiel auf Rucloud in Moskau und LD8 (die in London). Rucloud, weil es sich fast nicht von der M9 unterscheidet, und durch London gibt es ein transkontinentales Kabel in die USA, also ist es in Europa ein Muss. Für eine engere Verteilung in Europa können Sie die Schweiz oder Deutschland wählen - dies können Sie im Allgemeinen stoppen.

Auswählen eines DNS-GeoIP


Wenn der Client an die Site klopft, wie kann man dann verstehen, welcher Server die Daten an ihn übertragen soll? Natürlich mit DNS. Das heißt, abhängig von der IP-Adresse desjenigen, der das DNS adressiert hat, wird eine relevante Antwort gegeben.

Wir können unser eigenes DNS (BIND mit einem Plugin für Maxmind) oder eine schlüsselfertige Lösung (Route53) verwenden. Ein Abonnement für Maxmind GeoIP-Datenbanken kostet 25 USD pro Monat und Route53 kostet 0,50 USD pro Domainzone plus einen Cent, wenn Sie eine Million Anfragen stellen. Darüber hinaus ist es das Letzte, einen weiteren Punkt zur Verstärkung von DDoS-Angriffen zu schaffen. Daher fiel meine Wahl auf Route53.

Dieser Artikel handelt von CDN für Europa; Wenn Sie ein CDN für Russland benötigen, liegt die Wahl für Ihr eigenes DNS auf der Hand, da Route53 das Routing nach Land und nicht nach Stadt ermöglicht.
Microsoft verfügt über ähnliche Dienste (Azure Traffic Manager).

1. Installieren Sie IIS


1.1. IIS-Installation

Wir installieren die Basiskomponenten von IIS, die Komponente für die Unterstützung zentraler Zertifikate, und auf dem Hauptserver zusätzliche Unterstützung für die Remoteverwaltung. Diese Komponente wird nur für einen Server benötigt. Sie können andere Server nicht verwalten, wenn Sie gemeinsam genutzte Konfigurationen aktivieren, selbst wenn die Remoteverwaltung konfiguriert wurde.



Über Powershell:

Install-WindowsFeature Web-Server, Web-CertProvider 

Auf dem Hauptserver müssen Sie zusätzlich installieren:

 Install-WindowsFeature Web-Mgmt-Service 

1.1.1 Fernbedienung einschalten

Damit wir den IIS-Server remote verwalten können, müssen wir den IIS-Remoteverwaltungsdienst erhöhen. Starten Sie auf dem Hauptserver den Dienst:

 start-service WMSVC set-service -Name WMSVC -StartupType Automatic 

Und jetzt bieten wir die Möglichkeit, als solche über die Registrierung zu verwalten.

 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WebManagement\Server 

Der einfachste Weg, die Registrierung zu verwalten, ist natürlich das Windows Admin Center.



Dies kann aber auch über Powershell erfolgen:

 Set-Itemproperty -path "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WebManagement\Server" -Name "EnableRemoteManagement" -value "1" 

In Windows Server 2012 und 2016 steigt die Firewall-Regel nicht von selbst an. Sie müssen die Firewall bearbeiten.



 Set-NetFirewallRule -Name IIS-WebServerRole-WMSVC-In-TCP -Enabled True 

Überprüfen Sie, ob es gestiegen ist:



 Test-NetConnection 8.8.8.8 -port 8172 

Drei Änderungen an drei verschiedenen Stellen, und jetzt können wir über den IIS-Manager eine Verbindung zu unserem Server herstellen, indem wir einen anderen Server mit einem Desktop verwenden. Dies diente nur der Bequemlichkeit der nachfolgenden Verwaltung.

1.2 Wir haben die Zentralisierung von Konfigurationen abgeschnitten

In IIS Manager gibt es keine Schaltflächen zum Installieren zentraler Konfigurationen und Zertifikate. Sie befinden sich nur im lokalen Server-Manager. Für Server Core müssen Sie also alles über Powershell erledigen.

Die Zentralisierung von Konfigurationen und Zertifikaten erfolgt über KMU. Aus diesem Grund habe ich zwei entrechtete Benutzer (getrennt für Konfigurationen und getrennt für Zertifikate) erstellt, die nur Lesezugriff auf ihren Ordner haben, und sie certadmin und configadmin genannt.

Es ist ratsam, dass Benutzer lokal auf dem Hauptserver sind. Wenn Ihr Domänencontroller stirbt, sterben Anwendungen, die im Namen des Domänenbenutzers über SMB an der Konfiguration und den Zertifikaten festhalten. Die Verwendung lokaler Benutzer beseitigt diese Situation.

1.2.1 Erstellen eines freigegebenen Ordners

Auf einem der Server sollten zwei öffentliche Ordner gespeichert werden, von denen wir die Konfiguration und die Zertifikate erhalten. Als Pfad zum freigegebenen Ordner verwenden wir den Standardpfad zu den IIS-Konfigurationen:

 New-SmbShare -ReadAccess configadmin@**.**wtf -Path C:\windows\System32\Inetsrv\Config -Name sharedconfigs 

Und für Zertifikate können wir jedes auswählen. Ich habe sie in einem Ordner mit IIS abgelegt.

 New-SmbShare -Path C:\inetpub\centralizedcerts -Name sharedconfigs -ReadAccess configadmin 

1.2.2 Wir verbinden Knoten mit Konfigurationen

Die Einstellungen müssen nur für die Server vorgenommen werden, die diese Konfiguration lesen. Mein Hauptserver unter dem Namen cache-ru wird der Kopf sein, also habe ich auf den anderen beiden konfiguriert.
Geben Sie das Passwort des Benutzers ein, der Zugriff auf den Ordner hat:

 $pass = Read-Host -AsSecureString Enable-IISSharedConfig -PhysicalPath \\cache-ru.**.**wtf\SharedConfig -UserName configadmin@**.**wtf -Password $pass -DontCopyRemoteKeys 

Unmittelbar nach dem Eintritt sollte eine neue Sitzung geöffnet werden. Um zu überprüfen, ob alles funktioniert hat, können Sie RSAT → Computerverwaltung → Freigegebene Ordner → Sitzungen öffnen. Wir sehen Benutzersitzungen und die IP-Adresse des Servers, der unter diesem Benutzer den freigegebenen Ordner liest. Auf der Client-Seite wird dies vom Cmdlet überprüft:

 Get-IISSharedConfig 

So sah es für mich aus:



1.2.2 Knoten mit Zertifikaten verbinden

Die nächste Zeile kann nur direkt eingegeben werden, da eine direkte Verbindung zum Desktop mit Server mit einer grafischen Benutzeroberfläche besteht. Sie funktioniert nicht auf Server Core.

 $pass = Read-Host -AsSecureString Enable-IISCentralCertProvider -CertStoreLocation \\cache-ru.**.**wtf\centralizedcerts -UserName certadmin@**.**wtf -Password $pass 

Wenn Sie versuchen, es über Winrm einzugeben, wird die folgende Ausgabe angezeigt:



Um dies remote zu tun, müssen Sie die Registrierung bearbeiten. Wie bequem! Wir fliegen ein:

 HKLM:\SOFTWARE\Microsoft\IIS\CentralCertProvider\ 

Erstellen Sie ein 32-Bit-DWORD "Aktiviert" mit dem Parameter "1":



 Set-ItemProperty -Path HKLM:\SOFTWARE\Microsoft\IIS\CentralCertProvider\ -Name Enabled -Value 1 

Dann erstellen wir den String-Wert CertStoreLocation mit dem Parameter \\ cache-ru. **. ** wtf \ centralizedcerts:

 Set-ItemProperty -Path HKLM:\SOFTWARE\Microsoft\IIS\CentralCertProvider\ -Name CertStoreLocation -Value <a href="about:blank">\\cache-ru.**.**wtf\centralizedcerts</a> 

Um zu überprüfen, ob alles in Ordnung ist, verwenden wir:

 Get-IISCentralCertProvider 

Die Ausgabe sollte folgendermaßen aussehen:



Und erst danach treten wir ein:

 $pass = Read-Host -AsSecureString Set-IISCentralCertProvider -UserName certadmin@**.**wtf -Password $pass 

Überprüfen Sie erneut:

 Get-IISCentralCertProvider 

Alles aus der Box heißt. Im Gegensatz zu herkömmlichen Konfigurationen erstellen zentralisierte Zertifikate keine aktive SMB-Sitzung.

1.2.3 Brotli

Laden Sie auf jedem Server die IIS-Komprimierungsdatei herunter und führen Sie sie aus

 Start-Process .\iiscompression_amd64.msi -ArgumentList /quiet 

Wir haben die Konfigurationen bereits freigegeben, daher müssen Sie etwas nur an einer Stelle konfigurieren. Mit IIS Manager rufen wir den Konfigurationseditor auf dem Hauptserver auf.



 system.webServer/httpCompression 

Und setzen Sie StaticCompressionLevel für Brotli auf 11 und für Gzip auf 9, dies ist das Maximum, das sie tun können.

1.2.4 MIME und Header

Standardmäßig überträgt IIS den Codierungsheader nicht, weshalb das kyrillische Alphabet zu Runen wird. Auch in MIME muss kein Eintrag im Webp-Format hinzugefügt werden.

1. Gehen Sie zum Dispatcher → MIME. Suchen Sie nach .HTML und ändern Sie den Typ in: text / html; Zeichensatz = utf-8



2. Vergessen Sie Webp nicht - Sie müssen dieses MIME manuell hinzufügen.



2. Wir stellen ein Zertifikat aus


Verwenden von Winacme . Zunächst müssen Sie die Domänen an die Site binden. Dies kann über den IIS-Manager erfolgen. Wählen Sie beim Erstellen eines CDN nicht die Hostüberprüfung als aus Probleme beginnen sofort mit der Bestätigung des Domainbesitzes. Unsere Wahl ist die Überprüfung durch TXT-Datensatz. Sie müssen den Pfad zum Ordner mit den Zertifikaten manuell steuern und den Datensatz manuell von der Herausforderung kopieren. Holen Sie sich jetzt Luft in Ihre Brust.

Um nicht alles manuell zu drucken, aktivieren Sie RDP auf Server Core mit dem folgenden Befehl:

 cscript C:\Windows\System32\Scregedit.wsf /ar 0 

So sieht RDP auf Server Core aus:



Nach der Herausforderung fallen die Zertifikate in den in Winacme angegebenen Ordner. Winacme stellt die Aufgabe in den Scheduler, um das Zertifikat zu erneuern. Installiert und vergessen.



Nun, als wir fertig sind, können wir RDP ausschalten - wir haben Server Core aus gutem Grund installiert und so viele Nuancen entdeckt.

 cscript C:\Windows\System32\Scregedit.wsf /ar 1 

3. Binden Sie das Zertifikat an die Knoten


Jetzt müssen Sie zwei weitere Knoten konfigurieren, damit HTTPS endlich funktioniert. Zu diesem Zeitpunkt wird HTTPS auf dem Server, auf dem die Zertifikate gespeichert sind, bereits ausgeführt. Damit der Rest anfängt, an HTTPS zu arbeiten, geschieht dies im Allgemeinen über netsh.

Wie gewohnt stellen wir über RDP eine Verbindung zu Windows Server Core her, um dieses Snap-In auszuführen. Schauen Sie sich die Website von Microsoft nicht an, insbesondere nicht in diesem Handbuch. Die darin enthaltenen Schritte sind falsch beschrieben.

Wenn Sie netsh http show sslcert verwenden, müssen Sie auf dem Masterknoten die Appid abrufen, die wir wie unten beschrieben eingeben:

 netsh http add sslcert ccs=443 appid= '{4dc3e181-e14b-4a21-b022-59fc669b0914}' 

Der Appid-Wert muss in Anführungszeichen gesetzt werden, sonst funktioniert er nicht.

4. Installieren Sie DFS


Synchronisieren Sie Zertifikate und Konfigurationen nicht über DFS. Spezielle Tools wurden aus einem bestimmten Grund erfunden. Ich habe es versucht und es stellte sich aus unklaren Gründen als schlecht heraus, dass die Konfigurationen auf den Servern, auf denen die Konfiguration ausgeführt wurde, die Änderungen nicht mehr lasen, obwohl zum ersten Mal alles funktionierte. Ich habe die Ursache des Fehlers nicht herausgefunden und beschlossen, es anders zu machen.

Die weitere Konfiguration erfolgt ausschließlich über RSAT. Die in der Dokumentation angegebenen Cmdlets funktionieren nur unter Windows Server mit einer grafischen Benutzeroberfläche. Die ausschließliche Bereitstellung der DFS-Replikation mit Server Core ist nicht möglich. Sie benötigen entweder einen anderen Server mit einer grafischen Benutzeroberfläche oder einen Computer unter Windows 10 Pro mit installiertem RSAT, der der Domäne beigetreten ist.

2.1. Installieren

Auf jedem Server müssen Sie die DFS-Replikation installieren:



 Install-WindowsFeature FS-DFS-Replication, FS-DFS-Namespace 

2.2. Erstellen einer neuen Replikationsgruppe



Zuerst müssen Sie unsere Replikationsgruppe anrufen.



Wählen Sie die Topologie nach Ihrem Geschmack. Persönlich ist es für mich bequemer, Inhalte an einem Ort hinzuzufügen, also wähle ich einen Stern.





Einer der Server sollte der Hauptserver sein. Von dort aus beginnt die Replikation. Wenn Sie Dateien zu Listenern hochladen, wird die hochgeladene Datei nicht repliziert.



Als Ordner für die Replikation habe ich den Standardordner mit Sites ausgewählt:

 C:\inetpub\wwwroot 

Dieser Ordner ist der Pfad zum Verzeichnis dieses bestimmten ersten Servers. Sie können den Inhalt dieses Ordners unabhängig vom Pfad überall replizieren.



Innerhalb einer Gruppe können wir mehrere Ordner replizieren und in Zukunft deren Liste bei Bedarf erweitern.



Fertig.

5. Leistung testen


Um zu verstehen, wie viele Besucher der Website wirklich gewonnen haben, müssen Sie Messungen vornehmen. Sie werden von zwei Punkten aus durchgeführt. Autoren-PC in Moskau und virtueller Server in Frankfurt. Alle drei Punkte werden separat geprüft. Hier ist eine Zusammenfassung.



Wir gehen in Devtools und beobachten den Wasserfall. In einem Krankenhaus reduziert ein CDN im Durchschnitt etwa 200 Millisekunden, bevor ein Standort vollständig ausgelastet ist. Das Bild, das größte Objekt auf der Seite, wird geladen, sobald es in das Ansichtsfenster gelangt. Achten Sie daher auf die blaue vertikale Linie. CDN beschleunigte reine HTML + -Stile und -Skripte um 10-15 Millisekunden, und das Bild wurde 220 Millisekunden schneller geladen. Dies ist ein sehr bedeutender Unterschied.

Moskau - Moskau:

London - Moskau:

Zürich - Moskau:

Ich habe auch die Geschwindigkeit von Jekyll auf einem lokalen Host gemessen:



Wir wenden uns dem Leuchtturm zu und sehen seltsame Ergebnisse:

Moskau - Moskau:

London - Moskau:

Zürich - Moskau:

Localhost - Jekyll:

In dieser Synthetik umgeht ein Server, der entfernte Länder hat, den lokalen Host. Aber warum?
Lassen Sie uns zum Spaß Google Fonts loswerden und auf unsere Server übertragen.

Moskau - Moskau:

London - Moskau:

Zürich - Moskau:

Localhost - Jekyll:

Ergebnisse zwischen Rechenzentren ausgerichtet. Aber es erklärt immer noch nichts. Ich habe die Tests mehrmals überarbeitet, die Ergebnisse sind absolut eisern und jederzeit reproduzierbar.

Jetzt verwenden wir einen VPS mit zwei Kernen und 4 Gigabyte RAM in Frankfurt und sehen, was darin steht. Wasserfälle:

Moskau - Frankfurt:

London - Frankfurt:

Zürich - Frankfurt:

Mit dem richtigen Punkt betrug die Zeitersparnis nur bei Stilen und HTML 200 Millisekunden. Das heißt, bei einem Kunden aus Frankfurt ist die Site einfach um 200 Millisekunden schneller. Dies spiegelt sich auch im Leuchtturm wider. In solchen Fällen beschleunigt CDN nicht nur den Online-Shop, sondern auch ein einfaches Blog.

Moskau - Frankfurt:

London - Frankfurt:

Zürich - Frankfurt:

Schalten Sie jetzt Google Fonts ein und sehen Sie sich den Leuchtturm erneut an.

Moskau - Frankfurt:

London - Frankfurt:

Zürich - Frankfurt:

Leider habe ich keine Punkte mehr, an denen ich Tests durchführen kann, also werde ich fertig sein.

Schlussfolgerungen


  • CDN für die Ausgabe aller statischen Daten ist erforderlich, insbesondere bei umfangreichen Bildern oder langen Skripten.
  • Die Verwendung von Google Fonts ist möglich und erforderlich. In schweren Szenarien wird die Website dadurch erheblich beschleunigt.
  • Wenn Sie sich für den Hauptserver unter Windows entscheiden, empfiehlt es sich, eine grafische Benutzeroberfläche zu haben.
  • Die Benutzer, die die Konfigurationen vom Hauptserver übernehmen, werden am besten lokalisiert. Bei einem Ausfall des Domänencontrollers verlieren die Knoten möglicherweise die Verbindung zu den Konfigurationen und Zertifikaten, und der Anwendungspool wird gestoppt, weil kann keine Konfiguration lesen.


Source: https://habr.com/ru/post/de466447/


All Articles