Hintergrund
Es ist einfach so passiert, dass ich irgendwo mehr als 1,5 TB Daten speichern und sogar die Möglichkeit bieten musste, sie von normalen Benutzern über einen direkten Link herunterzuladen. Da solche Speichermengen traditionell bereits an VDS gehen, dessen Mietkosten nicht zu sehr in das Projektbudget aus der Kategorie "Nichts zu tun" investiert werden, und aus den Quelldaten hatte ich eine VPS 400 GB SSD, auf der ich ohne verlustfreie Komprimierung keine 1,5 TB Bilder speichern konnte wird gelingen.
Und dann erinnerte ich mich daran, dass wenn Sie Junk von der Google-Festplatte löschen, wie Programme, die nur unter Windows XP ausgeführt werden, und andere Dinge, die von meinen Medien zu Medien wandern, da das Internet nicht so schnell und vollständig war nicht unbegrenzt (zum Beispiel hatten diese 10-20 Versionen der virtuellen Box wahrscheinlich keinen anderen Wert als nostalgisch), dann sollte alles sehr gut passen. Kaum gesagt als getan. Auf dem Weg durch die Begrenzung der Anzahl der Anfragen an die API (übrigens hat der technische Support ohne Probleme die Anzahl der Anfragen pro Benutzer in 100 Sekunden auf 10.000 erhöht) flossen die Daten schnell an den Ort ihrer weiteren Bereitstellung.
Alles scheint gut zu sein, aber jetzt muss es dem Endbenutzer übermittelt werden. Darüber hinaus ohne Weiterleitungen zu anderen Ressourcen, und so dass eine Person einfach auf die Schaltfläche "Herunterladen" klickt und der glückliche Besitzer der geschätzten Datei wird.
Dann machte ich mich auf den Weg. Anfangs war es ein Skript auf AmPHP, aber ich war nicht zufrieden mit der Last, die es erzeugt hat (ein scharfer Sprung zu Beginn bis zu 100% des Kernelverbrauchs). Dann ging der Curl-Wrapper für ReactPHP in Aktion, der vollständig zu meinen Wünschen nach der verbrauchten Anzahl von CPU-Taktzyklen passte, aber nicht die gewünschte Geschwindigkeit ergab (es stellte sich heraus, dass Sie das Aufrufintervall curl_multi_select einfach reduzieren können, aber dann haben wir die gleiche Völlerei für die erste Option ) Ich habe sogar versucht, einen kleinen Dienst in Rust zu schreiben, und er funktionierte recht zügig (sogar überraschend, er funktionierte mit meinem Wissen), aber ich wollte mehr, und es war irgendwie nicht einfach, ihn anzupassen. Außerdem haben all diese Lösungen die Antwort seltsamerweise gepuffert, und ich wollte den Moment verfolgen, in dem der Dateidownload mit größter Genauigkeit endete.
Im Allgemeinen war es eine Weile schief, aber es funktionierte. Bis ich eines Tages auf die Idee einer wunderbaren Wahnidee kam: Nginx kann theoretisch tun, was ich will, es funktioniert zügig und erlaubt sogar alle Arten von Perversionen mit Konfiguration. Wir müssen versuchen - was ist, wenn es klappt? Und nach einem halben Tag ständiger Suche funktionierte eine Lösung mehrere Monate lang stabil und erfüllte alle meine Anforderungen.
Passen Sie NGINX an
Eine kurze Version ohne Kommentare ist unter dem Spoiler zu sehen location ~* ^/google_drive/(.+)$ { internal; limit_rate 1m; resolver 8.8.8.8; set $download_url https://www.googleapis.com/drive/v3/files/$upstream_http_file_id?alt=media; set $content_disposition 'attachment; filename="$upstream_http_filename"'; proxy_max_temp_file_size 0; proxy_set_header Authorization 'Bearer $1'; proxy_pass $download_url; add_header Content-Disposition $content_disposition; proxy_hide_header Content-Disposition; proxy_hide_header Alt-Svc; proxy_hide_header Expires; proxy_hide_header Cache-Control; proxy_hide_header Vary; proxy_hide_header X-Goog-Hash; proxy_hide_header X-GUploader-UploadID; }
Schreiben Sie ein Skript, um all dieses Glück zu verwalten
Das Beispiel wird in PHP sein und absichtlich mit einem Minimum Body Kit geschrieben. Ich denke, jeder, der Erfahrung mit einer anderen Sprache hat, kann diesen Artikel anhand meines Beispiels integrieren.
<?php
Zusammenfassung
Im Allgemeinen ist es mit dieser Methode ziemlich einfach, die Verteilung von Dateien an Benutzer aus einem beliebigen Cloud-Speicher zu organisieren. Ja, auch per Telegramm oder VK (vorausgesetzt, die Dateigröße überschreitet nicht die zulässige Größe für dieses Repository). Ich hatte eine ähnliche Idee wie diese , aber leider stoße ich auf Dateien mit bis zu 2 GB, und ich habe noch keinen Weg oder kein Modul gefunden, um die Antworten aus dem Upstream zu kleben. Das Schreiben einiger Wrapper für dieses Projekt ist unangemessen mühsam.
Vielen Dank für Ihre Aufmerksamkeit. Ich hoffe, meine Geschichte war zumindest ein wenig interessant oder nützlich für Sie.