Distribye fichye soti nan Google Drive lè l sèvi avèk nginx

pre-istwa

Li te jis rive ke mwen te bezwen estoke plis pase 1.5 TB nan done yon kote, epi tou li bay kapasite nan itilizatè òdinè telechaje li atravè yon lyen dirèk. Depi tradisyonèlman kantite memwa sa yo ale nan VDS, pri lwe ki pa anpil enkli nan bidjè pwojè a nan kategori "pa gen anyen pou fè", ak nan done sous yo mwen te gen yon VPS 400GB SSD, kote, menm si mwen te vle, mwen pa t 'kapab mete 1.5TB nan imaj san yo pa konpresyon san pèt li pral reyisi.

Lè sa a, mwen sonje ke si mwen efase tenten nan Google Drive, tankou pwogram ki pral sèlman kouri sou Windows XP, ak lòt bagay ki te deplase soti nan yon aparèy nan yon lòt depi jou yo lè entènèt la pa t 'tan vit ditou pa san limit ( pou egzanp, vèsyon sa yo 10-20 nan bwat la vityèl te fasil yo gen okenn valè lòt pase nostaljik), Lè sa a, tout bagay ta dwe anfòm trè byen. Pa pi bonè di pase fè. Se konsa, kraze nan limit la sou kantite demann nan api a (nan chemen an, sipò teknik san okenn pwoblèm ogmante kota nan demann pou chak itilizatè a 100 nan 10 segonn), done yo byen vit koule nan plas la nan deplwaman plis li yo. .

Tout bagay sanble ap bon, men kounye a li bezwen yo dwe transmèt itilizatè a fen. Anplis, san okenn redireksyon nan lòt resous, men se konsa ke yon moun tou senpleman peze bouton an "Download" epi li vin pwopriyetè a kontan nan dosye a trezò.

Isit la, pa Bondye, mwen te antre nan tout kalite pwoblèm. Okòmansman, li te yon script nan AmPHP, men mwen pa t 'satisfè ak chaj la li te kreye (yon so byen file nan kòmansman an nan 100% konsomasyon debaz). Lè sa a, wrapper boukl la pou ReactPHP te antre nan jwèt, ki byen anfòm nan volonte mwen an tèm de kantite sik CPU konsome, men li pa t 'bay vitès la nan tout sa mwen te vle (li te tounen soti ke ou ka tou senpleman diminye entèval la pou rele. curl_multi_select, men answit nou gen menm safrete ak premye opsyon an). Mwen menm te eseye ekri yon ti sèvis nan Rust, epi li te travay byen vit (li se etone ke li te travay, bay konesans mwen), men mwen te vle plis, epi li te yon jan kanmenm difisil yo Customize li. Anplis de sa, tout solisyon sa yo yon jan kanmenm etranj tanpon repons lan, epi mwen te vle swiv moman sa a lè download dosye a te fini ak presizyon nan pi gwo.

An jeneral, li te kwochi pou yon ti tan, men li te travay. Jiskaske yon jou mwen te vini ak yon lide ki te remakab nan foli li yo: nginx, nan teyori, ka fè sa mwen vle, travay byen vit, e menm pèmèt tout kalite perversion ak konfigirasyon. Nou dwe eseye - e si li travay? Apre yon demi jou nan rechèch ki pèsistan, yon solisyon te fèt ki te travay estab pandan plizyè mwa e ki te satisfè tout kondisyon mwen yo.

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

Yon vèsyon kout san kòmantè ka wè anba spoiler la

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

Nou ap ekri yon script pou jere tout kontantman sa a

Egzanp lan pral nan PHP ak fè espre ekri ak yon minimòm de twous. Mwen panse ke nenpòt moun ki gen eksperyans ak nenpòt lòt lang yo pral kapab entegre seksyon sa a lè l sèvi avèk egzanp mwen an.

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

Rezilta

An jeneral, metòd sa a fè li byen fasil yo òganize distribisyon an nan fichye itilizatè yo soti nan nenpòt depo nwaj. Wi, menm soti nan telegram oswa VK, (bay ke gwosè a fichye pa depase gwosè a akseptab nan depo sa a). Mwen te gen yon lide ki sanble ak sa a, men malerezman mwen jwenn dosye jiska 2GB, epi mwen poko jwenn yon metòd oswa modil pou kole repons ki soti nan en, epi ekri kèk kalite anbalaj pou pwojè sa a se travay san rezon.

Mèsi pou atansyon ou. Mwen espere istwa mwen an te omwen yon ti kras enteresan oswa itil pou ou.

Sous: www.habr.com

Add nouvo kòmantè