Tufatufaina faila mai le Google Drive e faʻaaoga ai le nginx

prehistory

E naʻo le mea na tupu na ou manaʻomia e teu ai le sili atu i le 1.5 TB o faʻamaumauga i se mea, ma tuʻuina atu foi le gafatia mo tagata masani e faʻapipiʻi ai e ala i se fesoʻotaʻiga tuusaʻo. Talu ai e masani lava o ia aofaiga o manatua e alu i le VDS, o le tau o le mautotogi lea e le o aofia tele i le paketi o le poloketi mai le vaega "leai se mea e fai", ma mai le faʻamatalaga faʻamatalaga na ou maua ai se VPS 400GB SSD, lea, e tusa lava pe ou te mana'o i ai, e le mafai ona ou tuʻuina le 1.5TB o ata e aunoa ma le faʻamalosi faʻamalosi o le a manuia.

Ona ou manatua lea afai ou te tapeina mea leaga mai le Google Drive, e pei o polokalama e na o le Windows XP, ma isi mea ua siitia mai le tasi masini i le isi talu mai aso na le televave ai le Initaneti e le gata ( mo se faʻataʻitaʻiga, o na 10-20 versions of the virtual box e foliga mai e leai se aoga e ese mai i le nostalgic), ona tatau lea ona fetaui lelei mea uma. E le'i leva ona fai. Ma o lea, o le solia o le tapulaʻa i luga o le numera o talosaga i le api (i le ala, lagolago faʻapitoa e aunoa ma ni faʻafitauli na faʻateleina ai le aofaʻi o talosaga mo le tagata faʻaoga i le 100 i le 10 sekone), o faʻamatalaga vave na tafe atu i le nofoaga o lona faʻaogaina atili. .

E foliga mai e lelei mea uma, ae o lea e manaʻomia le tuʻuina atu i le tagata faʻaaoga mulimuli. E le gata i lea, e aunoa ma se toe faʻafeiloaʻi i isi punaoa, ae ia na o le oomi e se tagata le ki "Download" ma avea ma tagata fiafia o le faila taua.

O iinei, i le Atua, na ou oo ai i ituaiga uma o faafitauli. I le taimi muamua o se tusitusiga i le AmPHP, ae ou te leʻi faamalieina i le uta na ia faia (o se oso malosi i le amataga i le 100% taumafa autu). Ona sau ai lea o le curl wrapper mo ReactPHP, lea e fetaui lelei ma oʻu manaʻoga i tulaga o le aofaʻi o taamilosaga CPU na faʻaaogaina, ae na te leʻi tuʻuina atu le saoasaoa i mea uma ou te manaʻo ai (na foliga mai e mafai ona e faʻaitiitia le va o le valaʻau. curl_multi_select, ae o loʻo i ai le tatou 'ai'ai tutusa ma le filifiliga muamua). Na ou taumafai foi e tusi se tamai auaunaga i Rust, ma sa vave ona galue (e ofo ai na aoga, ona o loʻu iloa), ae na ou manaʻo atili, ma e faigata tele ona faʻavasegaina. E le gata i lea, o nei fofo uma na faʻafefeteina le tali, ma na ou manaʻo e siaki le taimi na maeʻa ai le faila download ma le saʻo sili.

I se tulaga lautele, sa piopio mo sina taimi, ae sa aoga. Seia oʻo i se tasi aso na ou sau ai ma se manatu e ofoofogia i lona valea: nginx, i le teori, e mafai ona faia le mea ou te manaʻo ai, galue vave, ma faʻatagaina ituaiga uma o faʻalavelave faʻatasi ma le faʻatulagaina. E tatau ona tatou taumafai - ae faapefea pe a aoga? Ma ina ua mavae le afa aso o sailiga faifaipea, na fanau mai ai se fofo sa galue mausali mo ni nai masina ma ausia uma oʻu manaʻoga.

Faʻatulagaina 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;
}

O se faʻamatalaga puupuu e aunoa ma ni faʻamatalaga e mafai ona vaʻaia i lalo o le 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;
}

O loʻo matou tusia se tala e faʻatautaia ai nei fiafiaga uma

O le faʻataʻitaʻiga o le a iai ile PHP ma tusia ma le loto i ai ma se pusa laʻititi. Ou te manatu o soʻo se tasi e iai le poto masani i soʻo se isi gagana o le a mafai ona tuʻufaʻatasia lenei vaega e faʻaaoga ai laʻu faʻataʻitaʻiga.

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

O taunuʻuga

I se tulaga lautele, o lenei metotia e faigofie tele ai le faʻatulagaina o le tufatufaina o faila i tagata faʻaoga mai soʻo se ao teuina. Ioe, e oʻo lava mai le telegram poʻo le VK, (pe a faʻapea o le faila faila e le sili atu i le tele faʻatagaina o lenei teuina). Sa ou maua se manatu faapena lenei, ae paga lea, ou te sau i faila e oo atu i le 2GB, ma ou te leʻi mauaina lava se metotia poʻo se module mo le faʻapipiʻiina o tali mai luga, ma le tusiaina o se ituaiga o afifi mo lenei poloketi e le talafeagai le galue malosi.

Faafetai mo lou gauai mai. Ou te faʻamoemoe o laʻu tala sa sili ona manaia pe aoga ia te oe.

puna: www.habr.com

Faaopoopo i ai se faamatalaga