Pinpin awọn faili lati Google Drive nipa lilo nginx

prehistory

O kan ṣẹlẹ pe Mo nilo lati fipamọ diẹ sii ju TB 1.5 ti data ibikan, ati tun pese agbara fun awọn olumulo lasan lati ṣe igbasilẹ nipasẹ ọna asopọ taara. Niwọn igba ti aṣa iru awọn oye iranti lọ si VDS, idiyele ti yiyalo eyiti kii ṣe pupọ ninu isuna iṣẹ akanṣe lati ẹka “ko si nkankan lati ṣe”, ati lati data orisun Mo ni VPS 400GB SSD kan, nibiti, paapaa ti MO ba fe lati, Emi ko le fi 1.5TB ti awọn aworan lai pipadanu pipadanu yoo se aseyori.

Ati lẹhinna Mo ranti pe ti MO ba paarẹ ijekuje Google Drive, bii awọn eto ti yoo ṣiṣẹ lori Windows XP nikan, ati awọn ohun miiran ti o ti n gbe lati ẹrọ kan si omiiran lati awọn ọjọ nigbati Intanẹẹti ko yara rara rara kii ṣe ailopin ( fun apẹẹrẹ, awọn ẹya 10-20 ti apoti foju ko ṣeeṣe lati ni iye eyikeyi miiran ju nostalgic), lẹhinna ohun gbogbo yẹ ki o baamu daradara. Ki a to Wi ki a to so. Ati nitorinaa, fifọ nipasẹ opin lori nọmba awọn ibeere si api (nipasẹ ọna, atilẹyin imọ-ẹrọ laisi eyikeyi awọn iṣoro pọ si ipin awọn ibeere fun olumulo si 100 ni awọn aaya 10), data naa yarayara lọ si aaye ti imuṣiṣẹ rẹ siwaju .

Ohun gbogbo dabi pe o dara, ṣugbọn nisisiyi o nilo lati gbe lọ si olumulo ipari. Pẹlupẹlu, laisi awọn atunto eyikeyi si awọn orisun miiran, ṣugbọn ki eniyan tẹ bọtini “Download” nirọrun ki o di oniwun idunnu ti faili ti o niyelori.

Nibi, nipasẹ Ọlọrun, Mo lọ sinu gbogbo iru awọn wahala. Ni akọkọ o jẹ iwe afọwọkọ ni AmPHP, ṣugbọn Emi ko ni itẹlọrun pẹlu ẹru ti o ṣẹda (fifo didasilẹ ni ibẹrẹ si lilo 100% mojuto). Lẹhinna murasilẹ curl fun ReactPHP wa sinu ere, eyiti o baamu deede si awọn ifẹ mi ni awọn ofin ti nọmba awọn iyipo Sipiyu ti o jẹ, ṣugbọn ko fun iyara ni gbogbo ohun ti Mo fẹ (o wa ni pe o le jiroro ni dinku aarin ti pipe. curl_multi_select, ṣugbọn lẹhinna a ni ọjẹun ti o jọra si aṣayan akọkọ). Mo tun gbiyanju lati kọ iṣẹ kekere kan ni Rust, ati pe o ṣiṣẹ ni kiakia (o jẹ iyalẹnu pe o ṣiṣẹ, ti a fun ni imọ mi), ṣugbọn Mo fẹ diẹ sii, ati pe o nira bakan lati ṣe akanṣe rẹ. Ni afikun, gbogbo awọn solusan wọnyi bakan ni iyalẹnu ṣe idahun esi, ati pe Mo fẹ lati tọpinpin akoko naa nigbati igbasilẹ faili pari pẹlu iṣedede nla julọ.

Ni gbogbogbo, o jẹ wiwọ fun igba diẹ, ṣugbọn o ṣiṣẹ. Titi di ọjọ kan Mo wa pẹlu imọran ti o lapẹẹrẹ ninu aṣiwere rẹ: nginx, ni imọran, le ṣe ohun ti Mo fẹ, ṣiṣẹ ni iyara, ati paapaa gba gbogbo iru awọn aṣiwere pẹlu iṣeto ni. A ni lati gbiyanju - kini ti o ba ṣiṣẹ? Ati lẹhin idaji ọjọ kan ti wiwa itẹramọṣẹ, a bi ojutu kan ti o ti n ṣiṣẹ ni iduroṣinṣin fun ọpọlọpọ awọn oṣu ati pe o pade gbogbo awọn ibeere mi.

Ṣiṣeto 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;
}

Ẹya kukuru laisi awọn asọye ni a le rii labẹ apanirun

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

A n kọ iwe afọwọkọ kan lati ṣakoso gbogbo idunnu yii

Apeere naa yoo wa ni PHP ati ki o mọọmọ kọ pẹlu ohun elo to kere julọ. Mo ro pe ẹnikẹni ti o ni iriri pẹlu eyikeyi ede miiran yoo ni anfani lati ṣepọ apakan yii nipa lilo apẹẹrẹ mi.

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

Awọn esi

Ni gbogbogbo, ọna yii jẹ ki o rọrun pupọ lati ṣeto pinpin awọn faili si awọn olumulo lati ibi ipamọ awọsanma eyikeyi. Bẹẹni, paapaa lati telegram tabi VK, (ti a pese pe iwọn faili ko kọja iwọn iyọọda ti ibi ipamọ yii). Mo ní ohun agutan iru si eyi, sugbon laanu Mo ti wa kọja awọn faili soke si 2GB, ati ki o Mo ti ko sibẹsibẹ ri a ọna tabi module fun gluing idahun lati oke, ati kikọ diẹ ninu awọn Iru wrappers fun ise agbese yi ni unreasonably laala-lekoko.

Mo dupe fun ifetisile re. Mo nireti pe itan mi jẹ o kere ju igbadun diẹ tabi wulo fun ọ.

orisun: www.habr.com

Fi ọrọìwòye kun