Proxy von DigitalOcean-Spaces mit Nginx unter Ubuntu 16.04

Einführung

DigitalOcean Spaces ist ein mit der S3-API kompatibler object storage -Dienst. In diesem Tutorial zeigen wir Ihnen, wie Sie mit Nginx Anfragen für Objekte in Ihrem Space vertreten. Nginx empfängt HTTP (S) -Anfragen von Ihren Benutzern und leitet sie an den Spaces-Dienst weiter, der die Ergebnisse über Nginx zurücksendet.

Einige Gründe, warum Sie einen Nginx-Proxy vor Spaces setzen möchten, sind:

  • Fügen Sie eine benutzerdefinierte Domain hinzu

  • Fügen Sie Ihr eigenes Caching hinzu

  • Verwenden Sie Ihr eigenes SSL-Zertifikat

  • Verwenden Sie unterschiedliche Zugriffskontrollmechanismen

  • Cache-Assets in einem Datencenter, das näher an Ihren Benutzern liegt

In diesem Tutorial richten wir Nginx so ein, dass Anfragen in unserer eigenen Domain beantwortet werden (mit optionalen Let’s Encrypt SSL-Zertifikaten) und diese Anfragen an einen Space mit public Assets weitergeleitet werden. Anschließend wird die Zwischenspeicherung hinzugefügt, um nachfolgende Antworten für Objekte mit häufigem Zugriff zu beschleunigen.

Voraussetzungen

Um dieses Tutorial abzuschließen, sollten Sie Folgendes haben:

  • Ein Ubuntu 16.04-Server mit installiertem Nginx, wie in unserem Tutorial Installation von Nginx unter Ubuntu 16.04 erläutert

  • Ein Domain-Name, der auf Ihren Server verweist (siehe How to Set Up a Host Name with) DigitalOcean. In diesem Lernprogramm wird * assets.example.com * verwendet

  • Ein digitaler Ozeanraum. Sie erfahren, wie Sie einen neuen Space erstellen, indem Sie Eine Einführung in DigitalOcean Spaces lesen. + Sie müssen die URL Ihres individuellen Space kennen. Sie finden dies, indem Sie in der DigitalOcean-Systemsteuerung zu Ihrem Space navigieren. Die URL befindet sich direkt unter dem Space-Namen in der Benutzeroberfläche. Dies ist im folgenden Screenshot hervorgehoben: + Bild: https://assets.digitalocean.com/articles/proxy-spaces/space-shot.png [DigitalOcean Spaces-Benutzeroberfläche mit hervorgehobener URL des Space. Die URL befindet sich direkt unter dem Namen des Space im UI-Header. Der oben erwähnte Spaces-Artikel zeigt, wie Sie Dateien über die Spaces-Web-GUI hochladen können. Für dieses Tutorial verwenden wir "+ example.png +".

Proxy einrichten

Bei einer Standardinstallation von Nginx unter Ubuntu wird für alle Anforderungen eine Platzhalterseite * Welcome to Nginx * (Willkommen bei Nginx) zurückgegeben. Wir müssen eine neue Konfiguration hinzufügen, um Nginx anzuweisen, bei Anfragen an unsere Domain etwas anderes zu tun.

Öffnen Sie dazu eine neue Konfigurationsdatei in + / etc / nginx / sites-available:

sudo nano /etc/nginx/sites-available/

Dies öffnet eine leere Datei im + nano + Texteditor. Fügen Sie die folgende Konfiguration ein und achten Sie darauf, die hervorgehobenen Teile durch Ihren eigenen Domainnamen und die Spaces-URL zu ersetzen:

/etc/nginx/sites-available/assets.example.com

server {
   listen 80;
   listen [::]:80;
   server_name ;

   location / {
       proxy_pass ;
       proxy_hide_header      Strict-Transport-Security;
   }
}

Speichern Sie die Datei und beenden Sie den Editor, wenn Sie fertig sind. Dies ist ein Standard Nginx + Server Block. Zuerst teilen wir ihm mit, dass er sowohl auf IPv4 als auch auf IPv6 den Port "+ 80 " abhören soll, und geben den " Servernamen +" an, auf den Nginx antworten soll.

Als nächstes erstellen wir einen + location + Block. Alle Konfigurationsanweisungen in diesem Block (zwischen den Klammern + {+ und +} +) gelten nur für bestimmte URLs. In diesem Fall geben wir "+ / +", die Root-URL, an, damit alle Positionen von diesem Block abgeglichen werden.

Die Anweisung + proxy_pass + weist Nginx an, Anforderungen an den angegebenen Server weiterzuleiten. Die Zeile "+ proxy_hide_header" entfernt den Header "+ Strict-Transport-Security", bevor die Antwort an den Client zurückgegeben wird. Spaces verwendet diesen Header, um alle Verbindungen zu HTTPS zu erzwingen. Das Weiterleiten dieses Headers an Ihre Benutzer kann unbeabsichtigte Folgen haben, wenn auf Ihre Site über HTTP- und HTTPS-Verbindungen zugegriffen werden kann.

Nachdem unsere Konfiguration festgelegt wurde, müssen wir sie aktivieren. Dazu erstellen Sie einen Link zur Konfigurationsdatei im Verzeichnis + / etc / nginx / sites-enabled / +:

sudo ln -s /etc/nginx/sites-available/ /etc/nginx/sites-enabled/

Um unsere Konfigurationssyntax zu überprüfen, führen Sie "+ nginx -t +" als root aus:

sudo nginx -t
Outputnginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

Laden Sie abschließend Nginx neu, um die neue Konfiguration zu übernehmen:

sudo systemctl reload nginx

Testen Sie den Proxy, nachdem Sie unsere Konfigurationsdatei eingerichtet haben.

Proxy testen

Wir können die Proxy-Verbindung mit "+ curl " in der Befehlszeile testen. ` curl -I +` gibt nur die HTTP-Header einer Antwort zurück. Dies ist genug, um festzustellen, dass die Dinge gut funktionieren.

Holen Sie sich zuerst ein Objekt mit der URL * digitaloceanspaces.com * direkt aus Ihrem Space. Wir verwenden unsere Datei "+ example.png +":

curl -I
OutputHTTP/1.1 200 OK
Content-Length: 81173
Accept-Ranges: bytes
Last-Modified: Tue, 28 Nov 2017 21:19:37 GMT
ETag: "7b2d05a5bd1bfeebcac62990daeafd14"
x-amz-request-id: tx000000000000000002398-005a1edfcd-afba2-nyc3a
Content-Type: image/png
Date: Wed, 29 Nov 2017 16:26:53 GMT
Strict-Transport-Security: max-age=15552000; includeSubDomains; preload

Wir können durch "200 OK +" in der ersten Zeile der Ausgabe sehen, dass dies eine erfolgreiche Anfrage war. Der Server hat die Größe der Datei (` Content-Length `), den Dateityp (` Content-Type +`) und einige andere datums- und cachebezogene Informationen zurückgegeben.

Holen Sie sich jetzt die gleiche Datei über den Proxy:

curl -I
OutputHTTP/1.1 200 OK

Date: Wed, 29 Nov 2017 16:27:24 GMT
Content-Type: image/png
Content-Length: 81173
Connection: keep-alive
Accept-Ranges: bytes
Last-Modified: Tue, 28 Nov 2017 21:19:37 GMT
ETag: "7b2d05a5bd1bfeebcac62990daeafd14"
x-amz-request-id: tx00000000000000000a045-005a1edfec-a89a3-nyc3a

Die Reaktion ist größtenteils dieselbe. Die wichtigste Änderung ist ein "+ Server +" - Header, der Nginx identifiziert. Wenn Ihre Ausgabe ähnlich ist, funktioniert Ihr Proxy ordnungsgemäß!

Im nächsten Schritt richten wir die Zwischenspeicherung ein, um die Bandbreitennutzung zwischen Proxy und Spaces zu verringern und die Antwortzeiten zu beschleunigen.

Caching einrichten

Zum Zwischenspeichern von Antworten benötigt Nginx einen Speicherort für Schlüssel, Metadaten und den tatsächlichen Inhalt der Antworten. Wir richten ein Cache-Verzeichnis im Verzeichnis "+ / tmp " des Systems ein. Dazu fügen wir einer neuen Datei in " / etc / nginx / conf.d / +" einen Konfigurationsausschnitt hinzu. Öffne diese Datei jetzt:

sudo nano /etc/nginx/conf.d/example-cache.conf

Fügen Sie die folgende Zeile ein und speichern und schließen Sie die Datei:

/etc/nginx/conf.d/example-cache.conf

proxy_cache_path /tmp/example-cache/ levels=1:2 keys_zone=example-cache:16m max_size=10g inactive=60m use_temp_path=off;

Diese Zeile definiert einige Merkmale des Caches. Sehen wir uns die Optionen an:

  • + / tmp / example-cache / + ist der Pfad zum Cache.

  • + levels = 1: 2 + erstellt eine zweistufige Hierarchie von Verzeichnissen zum Speichern von zwischengespeicherten Inhalten. Wenn zu viele Dateien in ein einzelnes Verzeichnis gestellt werden, kann dies zu Geschwindigkeits- und Zuverlässigkeitsproblemen führen. Daher teilt Nginx die Dateien basierend auf dieser Option auf mehrere Verzeichnisse auf.

  • + keys_zone = example-cache: 16m + benennt unseren Cache und richtet 16 Megabyte Speicher ein, in dem Schlüssel gespeichert werden. Dies sollte genügend Speicher sein, um Daten für über 100.000 Schlüssel zu speichern.

  • + max_size = 10g + begrenzt die Größe des Caches auf 10 Gigabyte. Sie können dies an Ihre Speicher- und Nutzungsbedürfnisse anpassen.

  • + inaktiv = 60m + bedeutet, dass Nginx zwischengespeicherte Dateien nach 60 Minuten löscht, wenn in dieser Zeit nicht auf sie zugegriffen wurde (auch wenn die Datei noch gültig und nicht abgelaufen ist). Wenn Sie viele Objekte haben, auf die selten zugegriffen wird, können Sie versuchen, diese zu erhöhen.

  • + use_temp_path = off + weist Nginx an, temporäre Dateien in das Cache-Verzeichnis zu schreiben, wodurch möglicherweise vermieden wird, dass Dateien zwischen Dateisystemen kopiert werden müssen, was die Leistung beeinträchtigen könnte.

Nachdem wir einen Cache definiert haben, müssen wir ihn in unserem Serverblock aktivieren und einige zusätzliche Optionen festlegen. Öffnen Sie die Konfigurationsdatei Ihrer Site erneut:

sudo nano /etc/nginx/sites-available/

Fügen Sie am Ende Ihres "+ location / " -Blocks Folgendes hinzu (nach der Direktive " proxy_hide_header ", aber vor der schließenden Klammer "} +"):

/etc/nginx/sites-available/assets.example.com

. . .
       proxy_cache            example-cache;
       proxy_cache_valid      200 60m;
       proxy_cache_use_stale  error timeout updating http_500 http_502 http_503 http_504;
       proxy_cache_revalidate on;
       proxy_cache_lock       on;

       proxy_ignore_headers   Set-Cookie;
       add_header             X-Cache-Status $upstream_cache_status;
. . .

Speichern und schließen Sie die Datei. Gehen wir die folgenden Konfigurationsoptionen nacheinander durch:

  • + proxy_cache + teilt Nginx mit, welcher Cache verwendet werden soll. In diesem Fall geben wir "+ example-cache " an, das wir gerade in der Datei " example-cache.conf +" eingerichtet haben.

  • + proxy_cache_valid + weist Nginx an, jede + 200 + Antwort für 60 Minuten als gültig zu betrachten. Dies bedeutet, dass Nginx nach dem erfolgreichen Abrufen einer Datei von Spaces für die nächsten 60 Minuten die zwischengespeicherte Kopie verwendet, ohne Spaces jemals nach einem Update zu fragen. Beachten Sie, dass, wenn für Ihre Objekte ein "+ Cache-Control" -Header festgelegt ist, der Header-Wert diese Konfiguration überschreibt.

  • + proxy_cache_use_stale + ermöglicht es Nginx, eine veraltete (abgelaufene) Antwort zurückzugeben, wenn der Spaces-Server eine Zeitüberschreitung aufweist, einen Fehler zurückgibt oder die zwischengespeicherte Antwort gerade aktualisiert wird.

  • + proxy_cache_revalidate + ermöglicht es dem Proxy, zwischengespeicherte Dateien mit bedingten GET-Anforderungen erneut zu validieren. Wenn eine zwischengespeicherte Datei abläuft und Nginx Spaces auf Änderungen überprüfen muss, verwendet Nginx die Header + If-Modified-Since + oder + If-None-Match +, um das Objekt nur abzurufen, wenn es sich tatsächlich geändert hat . Wenn es nicht aktualisiert wurde, gibt Spaces eine "+304 Not Modified +" - Antwort zurück und Nginx markiert die vorhandene zwischengespeicherte Antwort einfach wieder als gültig.

  • + proxy_cache_lock + hält nachfolgende Anfragen an ein Objekt zurück, wenn der Proxy sie bereits vom Backend-Server abruft. Wenn die erste Anforderung abgeschlossen ist, werden die anderen Anforderungen aus dem Cache bedient.

  • + proxy_ignore_headers Set-Cookie + ignoriert Cookies, die das Caching stören können.

  • + add_header X-Cache-Status …​ + fügt einen Header mit Informationen darüber hinzu, ob die Anfrage aus dem Cache bedient wurde (+ HIT +) oder nicht (+ MISS +). Wenn sich die Anfrage im Cache befand, aber abgelaufen ist, wird stattdessen ("+ REVALIDATED +") angezeigt.

Jetzt können wir überprüfen, ob unsere Konfiguration fehlerfrei ist. Wenn dies erfolgreich ist, laden Sie Nginx neu:

sudo nginx -t
sudo systemctl reload nginx

Wenn das Caching eingerichtet ist, können wir erneut testen, um sicherzustellen, dass der Cache wie erwartet funktioniert.

Cache testen

Um sicherzustellen, dass der Cache funktioniert, können wir + curl + erneut verwenden und nach dem Header + X-Cache-Status + suchen:

curl -I
OutputHTTP/1.1 200 OK
Server: nginx/1.10.3 (Ubuntu)
Date: Wed, 29 Nov 2017 18:40:28 GMT
Content-Type: image/png
Content-Length: 81173
Connection: keep-alive
Last-Modified: Tue, 28 Nov 2017 21:19:37 GMT
ETag: "7b2d05a5bd1bfeebcac62990daeafd14"
x-amz-request-id: tx000000000000000013841-005a1eff1b-a89e4-nyc3a

Accept-Ranges: bytes

Die erste Anfrage sollte ein "+ MISS +" sein. Versuchen Sie es ein zweites Mal:

curl -I
OutputHTTP/1.1 200 OK
Server: nginx/1.10.3 (Ubuntu)
Date: Wed, 29 Nov 2017 18:40:53 GMT
Content-Type: image/png
Content-Length: 81173
Connection: keep-alive
Last-Modified: Tue, 28 Nov 2017 21:19:37 GMT
ETag: "7b2d05a5bd1bfeebcac62990daeafd14"
x-amz-request-id: tx000000000000000013841-005a1eff1b-a89e4-nyc3a

Accept-Ranges: bytes

Ein "+ HIT +"! Wir sind jetzt dabei, Objekte aus Spaces zu proximen und zwischenzuspeichern. Im nächsten Schritt richten wir SSL-Zertifikate ein, um die Kommunikation mit unserem Proxy zu sichern.

TLS / SSL einrichten

Obwohl dieser Schritt optional ist, wird dringend empfohlen, dass Ihre Website und Ihre Inhalte über eine sichere HTTPS-Verbindung verfügbar gemacht werden. In unserem Tutorial https://www.digitalocean.com/community/tutorials/how-to-set-up-let-s-encrypt-with- erfahren Sie, wie Sie kostenlose Zertifikate von der Zertifizierungsstelle Let’s Encrypt herunterladen und installieren. nginx-server-blocks-on-ubuntu-16-04 [So richten Sie es ein Verschlüsseln Sie mit Nginx Server Blocks unter Ubuntu 16.04].

Fazit

In diesem Lernprogramm haben wir eine Nginx-Konfiguration erstellt, um Anforderungen für Objekte an den Spaces-Dienst zu übergeben. Anschließend haben wir zur Verbesserung der Leistung Caching und zur Verbesserung der Privatsphäre und Sicherheit ein TLS / SSL-Zertifikat hinzugefügt.

Die hier gezeigten Einstellungen sind ein guter Ausgangspunkt, aber Sie können einige der Cache-Parameter basierend auf Ihren eigenen spezifischen Verkehrsmustern und Anforderungen optimieren. Die Nginx documentation, insbesondere die ngxhttpproxy_module, kann detailliertere Informationen zu den verfügbaren Konfigurationsoptionen enthalten .

Related