Ho tsamaisa lifaele ho tsoa ho Google Drive ho sebelisa nginx

prehistory

Ho ile ha etsahala hore ke boloke ho feta 1.5 TB ea data kae-kae, hape ke fane ka bokhoni ba basebelisi ba tloaelehileng ho e jarolla ka sehokelo se tobileng. Kaha ka tloaelo palo e joalo ea memori e ea VDS, litšenyehelo tsa ho hira tse sa kenyelelitsoeng haholo ho tekanyetso ea morero ho tloha sehlopheng sa "ha ho letho le lokelang ho etsoa", 'me ho tloha mohloling oa mohloli ke ne ke e-na le VPS 400GB SSD, moo, le haeba ke batla, Ke ne ke sitoa ho beha 1.5TB ea litšoantšo ntle le tahlehelo ea compression e tla atleha.

Eaba ke hopola hore haeba ke hlakola litšila ho Google Drive, joalo ka mananeo a tla sebetsa feela ho Windows XP, le lintho tse ling tse ntseng li tloha ho sesebelisoa se seng ho ea ho se seng ho tloha matsatsing ao Marang-rang a neng a sa potlake ho hang a se na moeli ( mohlala, liphetolelo tseo tsa 10-20 tsa lebokose la sebele li ne li sa khone ho ba le boleng leha e le bofe ntle le nostalgic), joale ntho e 'ngoe le e' ngoe e lokela ho lumellana hantle haholo. Ka pele ka potlako. Kahoo, ho tlola moeli oa palo ea likopo ho api (ka tsela, tšehetso ea tekheniki ntle le mathata e ile ea eketsa palo ea likopo ka mosebelisi ho isa ho 100 ka metsotsoana e 10), data e ile ea phalla ka potlako ho ea sebakeng sa eona. .

Ntho e ngoe le e ngoe e bonahala e le ntle, empa joale e hloka ho fetisetsoa ho mosebelisi oa ho qetela. Ho feta moo, ntle le ho khutlisetsa mehloli e meng, empa e le hore motho a tobetse feela konopo ea "Download" 'me e be mong'a ea thabileng oa faele ea bohlokoa.

Mona, ka Molimo, ke ile ka kena mathateng a mefuta eohle. Qalong e ne e le script ho AmPHP, empa ha kea ka ka khotsofatsoa ke mojaro oo o o entseng (ho qhoma ka bohale qalong ho 100% ea tšebeliso ea mantlha). Joale sekoaelo sa curl bakeng sa ReactPHP se ile sa qala ho bapala, se lumellanang hantle le litakatso tsa ka ho latela palo ea lipotoloho tsa CPU tse jeoang, empa ha ea ka ea fana ka lebelo ho hang seo ke neng ke se batla (ho ile ha fumaneha hore o ka fokotsa nako ea ho letsa. curl_multi_select, empa joale re na le bonyollo bo tšoanang le khetho ea pele ). Ke bile ke leka ho ngola tšebeletso e nyenyane ho Rust, 'me e ile ea sebetsa ka potlako (hoa makatsa hore ebe e sebelitse, ka lebaka la tsebo ea ka), empa ke ne ke batla ho feta,' me ka tsela e itseng ho ne ho le thata ho e etsa. Ntle le moo, litharollo tsena kaofela li ile tsa sitisa karabo ka mokhoa o makatsang, 'me ke ne ke batla ho tseba nako eo download ea faele e felileng ka nepo e kholo.

Ka kakaretso, e ne e khopame ka nakoana, empa e ile ea sebetsa. Ho fihlela ka letsatsi le leng ke ile ka fumana khopolo e tsotehang ka bohlanya ba eona: nginx, ka khopolo, e khona ho etsa seo ke se batlang, ho sebetsa ka potlako, esita le ho lumella mefuta eohle ea ho kheloha ka tlhophiso. Re tlameha ho leka - ho thoe'ng haeba e sebetsa? 'Me ka mor'a halofo ea letsatsi ke ntse ke batla, ho ile ha hlaha tharollo e' nileng ea sebetsa ka mokhoa o tsitsitseng ka likhoeli tse 'maloa' me ea finyella litlhoko tsohle tsa ka.

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

Phetolelo e khutšoanyane ntle le litlhaloso e ka bonoa tlas'a mofenyi

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

Re ngola lengolo ho laola thabo ena kaofela

Mohlala o tla ba ho PHP mme o ngotsoe ka boomo ka bonyane ba kit. Ke nahana hore mang kapa mang ea nang le phihlelo ea puo leha e le efe e 'ngoe o tla khona ho kopanya karolo ena a sebelisa mohlala oa ka.

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

Liphello

Ka kakaretso, mokhoa ona o etsa hore ho be bonolo haholo ho hlophisa kabo ea lifaele ho basebelisi ho tsoa polokelong efe kapa efe ea leru. E, esita le ho tloha thelekramo kapa VK, (hafeela boholo ba faele bo sa fete boholo bo lumelletsoeng ba polokelo ena). Ke ne ke e-na le mohopolo o tšoanang le sena, empa ka bomalimabe ke kopana le lifaele tse fihlang ho 2GB, 'me ha ke e-s'o fumane mokhoa kapa mojule oa likarabo tsa gluing ho tloha holimo,' me ho ngola mofuta o itseng oa li-wrappers bakeng sa morero ona ke mosebetsi o boima ka mokhoa o sa utloahaleng.

Kea leboha ha u mametse. Ke tšepa hore pale ea ka bonyane e ne e le monate kapa e le molemo ho uena.

Source: www.habr.com

Eketsa ka tlhaloso