Tqassam fajls minn Google Drive billi tuża nginx

preistorja

Ġara li kelli bżonn naħżen aktar minn 1.5 TB ta 'dejta x'imkien, u wkoll tipprovdi l-abbiltà għall-utenti ordinarji biex iniżżluha permezz ta' rabta diretta. Peress li tradizzjonalment tali ammonti ta 'memorja jmorru għal VDS, l-ispiża tal-kiri li ma tantx hija inkluża fil-baġit tal-proġett mill-kategorija "xejn x'tagħmel", u mid-dejta tas-sors kelli SSD VPS 400GB, fejn, anke jekk jien ridt, ma stajtx tpoġġi 1.5TB ta 'immaġini mingħajr kompressjoni mingħajr telf se tirnexxi.

U mbagħad ftakart li jekk inħassar junk minn Google Drive, bħal programmi li se jaħdmu biss fuq Windows XP, u affarijiet oħra li ilhom jiċċaqilqu minn apparat għall-ieħor minn żmien meta l-Internet ma kienx daqshekk mgħaġġel xejn mhux illimitat ( pereżempju, dawk il-verżjonijiet 10-20 tal-kaxxa virtwali x'aktarx ma kellhomx xi valur għajr nostalġiku), allura kollox għandu joqgħod tajjeb ħafna. Mhux kmieni qal milli jsir. U għalhekk, billi tkisser il-limitu fuq in-numru ta 'talbiet lill-api (mill-mod, l-appoġġ tekniku mingħajr problemi żied il-kwota ta' talbiet għal kull utent għal 100 f'10 sekonda), id-dejta malajr nixxiet lejn il-post tal-iskjerament ulterjuri tagħha .

Jidher li kollox huwa tajjeb, iżda issa jeħtieġ li jiġi mwassal lill-utent aħħari. Barra minn hekk, mingħajr ebda ridirezzjonijiet għal riżorsi oħra, iżda sabiex persuna sempliċement tagħfas il-buttuna "Niżżel" u ssir is-sid kuntenti tal-fajl għażiż.

Hawn, minn Alla, mort f’kull xorta ta’ inkwiet. Għall-ewwel kien skript f'AmPHP, imma ma kontx sodisfatt bit-tagħbija li ħoloq (qabża qawwija fil-bidu għal konsum ewlieni ta '100%). Imbagħad daħal fis-seħħ il-curl wrapper għal ReactPHP, li pjuttost jaqbel fix-xewqat tiegħi f'termini tan-numru ta 'ċikli CPU kkunsmati, iżda ma tax il-veloċità xejn dak li ridt (irriżulta li tista' sempliċement tnaqqas l-intervall ta 'sejħa curl_multi_select, iżda mbagħad għandna gluttony simili għall-ewwel għażla). Saħansitra ppruvajt nikteb servizz żgħir f'Rut, u ħadmet pjuttost malajr (huwa sorprendenti li ħadmet, minħabba l-għarfien tiegħi), imma ridt aktar, u b'xi mod kien diffiċli biex tippersonalizzaha. Barra minn hekk, dawn is-soluzzjonijiet kollha b'xi mod stramba buffered ir-rispons, u ridt insegwi l-mument meta t-tniżżil tal-fajl spiċċat bl-akbar preċiżjoni.

B'mod ġenerali, kien mgħawweġ għal xi żmien, iżda ħadem. Sakemm ġurnata waħda ħriġt b'idea li kienet notevoli fil-ġenn tagħha: nginx, fit-teorija, jista 'jagħmel dak li rrid, jaħdem malajr, u anke jippermetti kull xorta ta' perverżjoni b'konfigurazzjoni. Irridu nippruvaw - x'jiġri jekk taħdem? U wara nofs ġurnata ta 'tiftix persistenti, twieldet soluzzjoni li kienet ilha taħdem b'mod stabbli għal diversi xhur u laħqet ir-rekwiżiti kollha tiegħi.

Twaqqif ta' 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;
}

Verżjoni qasira mingħajr kummenti tista' tidher taħt l-ispoiler

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

Qed niktbu skript biex namministraw dan il-ferħ kollu

L-eżempju se jkun fil-PHP u deliberatament miktub b'minimu ta 'kit. Naħseb li kull min għandu esperjenza b'xi lingwa oħra jkun jista' jintegra din it-taqsima billi juża l-eżempju tiegħi.

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

Riżultati ta '

B'mod ġenerali, dan il-metodu jagħmilha pjuttost faċli li torganizza d-distribuzzjoni ta 'fajls lill-utenti minn kwalunkwe ħażna ta' sħaba. Iva, anke minn telegramma jew VK, (sakemm id-daqs tal-fajl ma jaqbiżx id-daqs permissibbli ta 'din il-ħażna). Kelli idea simili għal dan, iżda sfortunatament niltaqa 'ma' fajls sa 2GB, u għadni ma sibtx metodu jew modulu għall-inkullar tar-risponsi minn upstream, u l-kitba ta 'xi tip ta' tgeżwir għal dan il-proġett hija intensiva b'mod mhux raġonevoli tax-xogħol.

Grazzi tal-attenzjoni tiegħek. Nispera li l-istorja tiegħi kienet tal-inqas xi ftit interessanti jew utli għalik.

Sors: www.habr.com

Żid kumment