Ukuhambisa iifayile kwiGoogle Drive usebenzisa nginx

ukubuzwa

Kwenzekile ukuba ndifune ukugcina ngaphezulu kwe-1.5 TB yedatha kwindawo ethile, kwaye ndibonelele ngesakhono kubasebenzisi abaqhelekileyo ukuyikhuphela ngekhonkco elithe ngqo. Ekubeni ngokwesiko amanani anjalo ememori aya kwi-VDS, iindleko zokurenta ezingabandakanywanga kakhulu kuhlahlo lwabiwo-mali lweprojekthi ukusuka kwinqanaba elithi "akukho nto yokwenza", kwaye ukusuka kwidatha yomthombo ndibe ne-VPS 400GB SSD, apho, nokuba mna. bendifuna, andikwazanga ukubeka i-1.5TB yemifanekiso ngaphandle koxinzelelo olungalahlekiyo iya kuphumelela.

Kwaye ke ndakhumbula ukuba ukuba ndicima inkunkuma kwi-Google Drive, njengeenkqubo eziya kusebenza kuphela kwiWindows XP, kunye nezinye izinto ebezihamba ukusuka kwesinye isixhobo ukuya kwesinye ukusukela ngeentsuku apho i-Intanethi ibingakhawulezi kangako konke konke. umzekelo, ezo nguqulelo ze-10-20 zebhokisi yenyani kwakungenakwenzeka ukuba zibe nalo naliphi na ixabiso ngaphandle kwe-nostalgic), yonke into kufuneka ilingane kakuhle kakhulu. Hayi ngokukhawuleza ukuthetha kunokwenza. Kwaye ke, ukwaphula umda kwinani lezicelo kwi-api (ngendlela, inkxaso yezobuchwepheshe ngaphandle kweengxaki zonyusa inani lezicelo zomsebenzisi ngamnye ukuya kwi-100 kwimizuzwana eyi-10), idatha yahamba ngokukhawuleza ukuya kwindawo yokuthunyelwa kwayo ngakumbi. .

Yonke into ibonakala ilungile, kodwa ngoku kufuneka idluliselwe kumsebenzisi wokugqibela. Ngaphezu koko, ngaphandle kokubuyisela kwakhona kwezinye izixhobo, kodwa ukuze umntu acinezele iqhosha elithi "Khuphela" kwaye abe ngumnini onoyolo wefayile exabisekileyo.

Apha, nguThixo, ndangena kuzo zonke iintlobo zeengxaki. Ekuqaleni kwakuyiskripthi kwi-AmPHP, kodwa andizange ndineliseke ngumthwalo owenziweyo (ukuxuma okubukhali ekuqaleni kwi-100% yokusetyenziswa okungundoqo). Emva koko i-curl wrapper ye-ReactPHP yadlala, ehambelana neminqweno yam ngokwenani lemijikelezo ye-CPU esetyenzisiweyo, kodwa ayizange inike isantya kuyo yonke into endiyifunayo (kwaye kwavela ukuba unokunciphisa ixesha lokufowuna. curl_multi_select, kodwa ke sinobudla-kudla obufana nolokuqala ukhetho ). Ndade ndazama ukubhala inkonzo encinci kwi-Rust, kwaye yasebenza ngokukhawuleza (kuyamangalisa ukuba isebenze, ngenxa yolwazi lwam), kodwa ndandifuna ngakumbi, kwaye ngandlela-thile kwakunzima ukuyenza ngokwezifiso. Ukongeza, zonke ezi zisombululo ngandlel 'ithile zithintele impendulo, kwaye bendifuna ukulandelela ixesha apho ukhuphelo lwefayile luphele ngokuchaneka okukhulu.

Ngokubanzi, yayigoso ixeshana, kodwa yasebenza. Kuze kube ngenye imini ndeza nombono ophawulekayo ekuphambaneni kwayo: i-nginx, kwithiyori, inokwenza into endiyifunayo, isebenze ngokukhawuleza, kwaye ivumele zonke iintlobo zokugqwesa kunye noqwalaselo. Kufuneka sizame - kuthekani ukuba iyasebenza? Kwaye emva kwesiqingatha somhla wokukhangela okuqhubekayo, kwazalwa isisombululo esasisebenza ngokuzinzileyo kwiinyanga ezininzi kwaye sahlangabezana nazo zonke iimfuno zam.

Ukumisela i-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;
}

Uguqulelo olufutshane ngaphandle kwamagqabaza lunokubonwa phantsi kombhuqi

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;
}

Sibhala iskripthi sokulawula lonke olu lonwabo

Umzekelo uya kuba kwi-PHP kwaye ubhalwe ngamabomu kunye nobuncinci bekiti. Ndicinga ukuba nabani na onamava ngalo naluphi na olunye ulwimi uya kukwazi ukuhlanganisa eli candelo esebenzisa umzekelo wam.

<?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));

Iziphumo

Ngokubanzi, le ndlela yenza kube lula ukucwangcisa ukuhanjiswa kweefayile kubasebenzisi kulo nakuphi na ukugcinwa kwelifu. Ewe, nakwi-telegram okanye i-VK, (ngaphandle kokuba ubungakanani befayile abudluli ubungakanani obuvumelekileyo bolu gcino). Ndandinombono ofanayo oku, kodwa ngelishwa ndidibana neefayile ukuya kuthi ga kwi-2GB, kwaye andikafumani indlela okanye imodyuli yeempendulo zegluing ukusuka phezulu, kwaye ukubhala uhlobo oluthile lwee-wrappers zale projekthi kunzima ngokungekho ngqiqweni.

Enkosi ngosinaka kwakho. Ndiyathemba ukuba ibali lam ubuncinci belinomdla okanye liluncedo kuwe.

umthombo: www.habr.com

Yongeza izimvo