prehistory
Nagkataon lang na kailangan kong mag-imbak ng higit sa 1.5 TB ng data sa isang lugar, at magbigay din ng kakayahan para sa mga ordinaryong user na i-download ito sa pamamagitan ng direktang link. Dahil ayon sa kaugalian ang mga naturang halaga ng memorya ay napupunta sa VDS, ang halaga ng pag-upa nito ay hindi masyadong kasama sa badyet ng isang proyekto mula sa kategoryang "walang gagawin", at mula sa pinagmulan ng data ay mayroon akong VPS 400GB SSD, kung saan, kahit na kung gusto ko, hindi ako makakapaglagay ng 1.5TB ng mga larawan nang walang lossless compression ito ay magtatagumpay.
At pagkatapos ay naalala ko na kung tatanggalin ko ang junk mula sa Google Drive, tulad ng mga program na tatakbo lamang sa Windows XP, at iba pang mga bagay na lumilipat mula sa media patungo sa media mula noong mga araw na ang Internet ay hindi masyadong mabilis at hindi walang limitasyon (para sa halimbawa, ang mga 10-20 na bersyon ng virtual na kahon ay malamang na walang anumang halaga maliban sa nostalhik), kung gayon ang lahat ay dapat magkasya nang maayos. Wala pang sinabi at tapos na. At kaya, ang paglagpas sa limitasyon sa bilang ng mga kahilingan sa API (nga pala, ang teknikal na suporta nang walang anumang problema ay tumaas ang quota ng mga kahilingan sa bawat user sa 100 sa loob ng 10 segundo), ang data ay mabilis na dumaloy sa lugar ng karagdagang pag-deploy nito .
Mukhang maganda ang lahat, ngunit ngayon ay kailangan itong iparating sa end user. Bukod dito, nang walang anumang pag-redirect sa iba pang mga mapagkukunan, ngunit upang ang isang tao ay pinindot lamang ang pindutang "I-download" at maging masayang may-ari ng treasured file.
Dito, sa pamamagitan ng Diyos, napunta ako sa lahat ng uri ng problema. Sa una ito ay isang script sa AmPHP, ngunit hindi ako nasiyahan sa pagkarga na nilikha nito (isang matalim na pagtalon sa simula hanggang sa 100% pangunahing pagkonsumo). Pagkatapos ay ang curl wrapper para sa ReactPHP ay naglaro, na medyo akma sa aking mga kagustuhan sa mga tuntunin ng bilang ng mga cycle ng CPU na natupok, ngunit hindi nagbigay ng bilis sa lahat ng gusto ko (napalabas na maaari mo lamang bawasan ang agwat para sa pagtawag curl_multi_select, ngunit pagkatapos ay mayroon kaming parehong katakawan bilang ang unang pagpipilian ). Sinubukan ko pang magsulat ng isang maliit na serbisyo sa Rust, at ito ay gumana nang mabilis (nakakagulat na ito ay gumana, dahil sa aking kaalaman), ngunit gusto ko ng higit pa, at kahit papaano ay mahirap i-customize ito. Bilang karagdagan, ang lahat ng mga solusyong ito sa paanuman ay kakaibang nag-buffer sa tugon, at gusto kong subaybayan ang sandali kung kailan natapos ang pag-download ng file nang may pinakamataas na katumpakan.
Sa pangkalahatan, ito ay baluktot nang ilang sandali, ngunit ito ay gumana. Hanggang sa isang araw ay nakaisip ako ng isang ideya na kapansin-pansin sa kabaliwan nito: ang nginx, sa teorya, ay maaaring gawin ang gusto ko, gumana nang mabilis, at kahit na pinapayagan ang lahat ng uri ng mga perversion na may pagsasaayos. Kailangan nating subukan - paano kung ito ay gumana? At pagkatapos ng kalahating araw ng patuloy na paghahanap, isang solusyon ang isinilang na gumagana nang matatag sa loob ng ilang buwan at natugunan ang lahat ng aking mga kinakailangan.
Pagse-set up ng NGINX
# ΠΠ΅ΡΠ²ΡΠΌ Π΄Π΅Π»ΠΎΠΌ ΡΠΎΠ·Π΄Π°Π΄ΠΈΠΌ Π² ΠΊΠΎΠ½ΡΠΈΠ³Π°Ρ
Π½Π°ΡΠ΅Π³ΠΎ ΡΠ°ΠΉΡΠ° ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΡ Π»ΠΎΠΊΠ°ΡΠΈΡ.
location ~* ^/google_drive/(.+)$ {
# Π Π·Π°ΠΊΡΠΎΠ΅ΠΌ Π΅Ρ ΠΎΡ ΠΏΠΎΡΡΠΎΡΠΎΠ½Π½ΠΈΡ
Π³Π»Π°Π· (ΡΡΠΊ, Π½ΠΎΠ³ ΠΈ ΠΏΡΠΎΡΠΈΡ
ΡΠ°ΡΡΠ΅ΠΉ ΡΠ΅Π»Π°).
internal;
# ΠΠ³ΡΠ°Π½ΠΈΡΠΈΠΌ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΠΌ ΡΠΊΠΎΡΠΎΡΡΡ Π΄ΠΎ ΡΠ°Π·ΡΠΌΠ½ΡΡ
ΠΏΡΠ΅Π΄Π΅Π»ΠΎΠ² (Ρ Π·Π° ΡΠ°Π²Π½ΠΎΠΏΡΠ°Π²ΠΈΠ΅).
limit_rate 1m;
# Π ΡΡΠΎΠ± nginx ΠΌΠΎΠ³ Π½Π°ΠΉΡΠΈ ΡΠ΅ΡΠ²Π΅ΡΠ° google drive ΡΠΊΠ°ΠΆΠ΅ΠΌ Π΅ΠΌΡ Π°Π΄ΡΠ΅Ρ ΡΠ΅Π·ΠΎΠ»Π²Π΅ΡΠ°.
resolver 8.8.8.8;
# CΠΎΠ±Π΅ΡΠ΅ΠΌ ΠΏΡΡΡ ΠΊ Π½Π°ΡΠ΅ΠΌΡ ΡΠ°ΠΉΠ»Ρ (ΠΌΡ ΠΏΠΎΡΠΎΠΌ ΠΏΠ΅ΡΠ΅Π΄Π°Π΄ΠΈΠΌ Π΅Π³ΠΎ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ°ΠΌΠΈ).
set $download_url https://www.googleapis.com/drive/v3/files/$upstream_http_file_id?alt=media;
# Π ΡΠ°ΠΊ ΠΆΠ΅ Content-Disposition Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ, ΠΈΠΌΡ ΡΠ°ΠΉΠ»Π° ΠΌΡ ΠΏΠ΅ΡΠ΅Π΄Π°Π΄ΠΈΠΌ ΠΎΠΏΡΡΡ ΠΆΠ΅ Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ°Ρ
.
set $content_disposition 'attachment; filename="$upstream_http_filename"';
# ΠΠ°ΠΏΡΠ΅ΡΠΈΠΌ Π±ΡΡΡΠ΅ΡΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ ΠΎΡΠ²Π΅Ρ Π½Π° Π΄ΠΈΡΠΊ.
proxy_max_temp_file_size 0;
# Π, ΡΡΠΎ Π½Π΅ΠΌΠ°Π»ΠΎΠ²Π°ΠΆΠ½ΠΎ, ΠΏΠ΅ΡΠ΅Π΄Π°Π΄ΠΈΠΌ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ Ρ ΡΠΎΠΊΠ΅Π½ΠΎΠΌ (Π½Π΅ Π·Π½Π°Ρ ΠΏΠΎΡΠ΅ΠΌΡ, Π½ΠΎ Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ°Ρ
ΠΈΠ· $http_upstream ΡΠΎΠΊΠ΅Π½ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡ Π½Π΅ ΠΏΠΎΠ»ΡΡΠΈΠ»ΠΎΡΡ. ΠΠ΅ΡΠ½Π΅Π΅ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡ ΠΏΠΎΠ»ΡΡΠΈΠ»ΠΎΡΡ, Π½ΠΎ ΡΠΊΠΎΡΠ΅ΠΉ Π²ΡΠ΅Π³ΠΎ Π΅Π³ΠΎ Π³Π΄Π΅-ΡΠΎ Π½ΡΠΆΠ½ΠΎ ΡΠΊΡΠ°Π½ΠΈΡΠΎΠ²Π°ΡΡ, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ Π³ΡΠ³Π» ΠΎΡΠ΄Π°Π΅Ρ ΠΎΡΠΈΠ±ΠΊΡ Π°Π²ΡΠΎΡΠΈΠ·Π°ΡΠΈΠΈ).
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;
}
Ang isang maikling bersyon na walang mga komento ay makikita sa ilalim ng spoiler
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;
}
Nagsusulat kami ng script para pamahalaan ang lahat ng kaligayahang ito
Ang halimbawa ay nasa PHP at sadyang nakasulat na may pinakamababang kit. Sa tingin ko ang sinumang may karanasan sa anumang iba pang wika ay magagawang isama ang seksyong ito gamit ang aking halimbawa.
<?php
# Π’ΠΎΠΊΠ΅Π½ Π΄Π»Ρ Google Drive Api.
define('TOKEN', '*****');
# ID ΡΠ°ΠΉΠ»Π° Π½Π° Π³ΡΠ³Π» Π΄ΠΈΡΠΊΠ΅
$fileId = 'abcdefghijklmnopqrstuvwxyz1234567890';
# ΠΠΏΡΠΈΠΎΠ½Π°Π»ΡΠ½ΠΎ, Π½ΠΎ ΡΠ°ΠΊ ΠΊΠ°ΠΊ ΠΌΡ Π½Π΅ ΠΏΠ΅ΡΠ΅Π΄Π°Π΅ΠΌ Π½ΠΈΠΊΠ°ΠΊΠΈΡ
Π΄Π°Π½Π½ΡΡ
- ΠΏΠΎΡΠ΅ΠΌΡ Π±Ρ ΠΈ Π½Π΅Ρ?
http_response_code(204);
# ΠΠ°Π΄Π°Π΄ΠΈΠΌ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ c ID ΡΠ°ΠΉΠ»Π° (Π² ΠΊΠΎΠ½ΡΠΈΠ³Π°Ρ
nginx ΠΌΡ ΠΏΠΎΡΠΎΠΌ ΠΏΠΎΠ»ΡΡΠΈΠΌ Π΅Π³ΠΎ ΠΊΠ°ΠΊ $upstream_http_file_id).
header('File-Id: ' . $fileId);
# Π Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ Ρ ΠΈΠΌΠ΅Π½Π΅ΠΌ ΡΠ°ΠΉΠ»Π° (ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²Π΅Π½Π½ΠΎ $upstream_http_filename).
header('Filename: ' . 'test.zip');
# ΠΠ½ΡΡΡΠ΅Π½Π½ΠΈΠΉ ΡΠ΅Π΄ΠΈΡΠ΅ΠΊΡ. Π Π΅ΡΠ΅ Π² Π°Π΄ΡΠ΅ΡΠ΅ ΠΌΡ ΠΏΠ΅ΡΠ΅Π΄Π°Π΄ΠΈΠΌ ΡΠΎΠΊΠ΅Π½, ΡΠΎΡ ΡΠ°ΠΌΡΠΉ, ΡΡΠΎ ΠΌΡ ΠΏΠΎΠ»ΡΡΠ°Π΅ΠΌ ΠΈΠ· $1 Π² nginx.
header('X-Accel-Redirect: ' . rawurlencode('/google_drive/' . TOKEN));
Mga resulta ng
Sa pangkalahatan, pinadali ng pamamaraang ito ang pag-aayos ng pamamahagi ng mga file sa mga user mula sa anumang cloud storage. Oo, kahit na mula sa telegrama o VK, (sa kondisyon na ang laki ng file ay hindi lalampas sa pinahihintulutang laki ng imbakan na ito). Nagkaroon ako ng ideya na katulad ng
Salamat sa iyong atensyon. Umaasa ako na ang aking kwento ay naging kawili-wili o kapaki-pakinabang sa iyo.
Pinagmulan: www.habr.com