Comhaid a dháileadh ó Google Drive ag baint úsáide as nginx

réamhstair

Tharla sé go raibh gá dom níos mó ná 1.5 TB sonraí a stóráil áit éigin, agus an cumas a sholáthar do ghnáthúsáideoirí é a íoslódáil trí nasc díreach. Ós rud é go traidisiúnta go dtéann méideanna cuimhne den sórt sin chuig VDS, an costas cíosa nach bhfuil san áireamh go mór i mbuiséad an tionscadail ón gcatagóir “rud ar bith le déanamh”, agus ó na sonraí foinse a bhí agam VPS 400GB SSD, áit, fiú amháin más rud é. ag iarraidh, ní raibh mé in ann 1.5TB na n-íomhánna a chur gan comhbhrú lossless éireoidh sé.

Agus ansin chuimhnigh mé, má scriosaim junk ó Google Drive, cosúil le cláir nach mbeidh ar siúl ach ar Windows XP, agus rudaí eile atá ag bogadh ó ghléas amháin go gléas eile ó na laethanta nuair nach raibh an tIdirlíon chomh tapa sin ar chor ar bith gan teorainn ( mar shampla, ní dócha go raibh luach ar bith ag na 10-20 leagan sin den bhosca fíorúil seachas cumhach), ansin ba chóir go n-oirfeadh gach rud go han-mhaith. Ní túisce a dúirt ná a rinneadh. Agus mar sin, ag sárú na teorann ar líon na n-iarratas ar an api (dála an scéil, mhéadaigh tacaíocht theicniúil gan aon fhadhbanna cuóta na n-iarratas in aghaidh an úsáideora go 100 i 10 soicind), shreabh na sonraí go tapa chuig an áit a imlonnaíodh tuilleadh. .

Dealraíonn sé go bhfuil gach rud go maith, ach anois ní mór é a chur in iúl don úsáideoir deiridh. Ina theannta sin, gan aon atreoruithe chuig acmhainní eile, ach ionas go mbeidh duine ag brú ar an gcnaipe “Íoslódáil” agus go dtiocfaidh sé chun bheith ina úinéir sásta ar an gcomhad luachmhar.

Anseo, a Dhia, chuaigh mé isteach i ngach cineál trioblóidí. Ar dtús bhí sé ina script in AmPHP, ach ní raibh mé sásta leis an ualach a chruthaigh sé (léim ghéar ag an tús go dtí tomhaltas croí 100%). Ansin tháinig an clúdach curl le haghaidh ReactPHP i bhfeidhm, rud a d'oir go maith le mo mhianta i dtéarmaí líon na dtimthriallta LAP a chaitear, ach níor thug sé an luas ar chor ar bith a theastaigh uaim (d'éirigh sé amach gur féidir leat an t-eatramh glaonna a laghdú go simplí. curl_multi_select, ach ansin tá gluttony cosúil leis an gcéad rogha againn ). Rinne mé iarracht fiú seirbhís bheag a scríobh i Rust, agus d'oibrigh sé go tapa go leor (is ionadh é gur oibrigh sé, i bhfianaise m'eolais), ach theastaigh uaim níos mó, agus bhí sé deacair ar bhealach éigin é a shaincheapadh. Ina theannta sin, rinne na réitigh seo go léir maolán ar bhealach aisteach ar an bhfreagra, agus bhí mé ag iarraidh an nóiméad a rianú nuair a chríochnaigh an íoslódáil comhad le cruinneas is mó.

Go ginearálta, bhí sé crooked ar feadh tamaill, ach d'oibrigh sé. Go dtí lá amháin tháinig mé suas le smaoineamh a bhí iontach ina crazyness: nginx, go teoiriciúil, is féidir a dhéanamh cad ba mhaith liom, ag obair go tapa, agus fiú a cheadú gach cineál perversions le cumraíocht. Ní mór dúinn iarracht a dhéanamh - cad má oibríonn sé? Agus tar éis leath lae de chuardach leanúnach, rugadh réiteach a bhí ag obair go cobhsaí ar feadh roinnt míonna agus a chomhlíon mo chuid riachtanas go léir.

NGINX a shocrú

# Первым делом создадим в конфигах нашего сайта отдельную локацию.
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;
}

Is féidir leagan gearr gan tuairimí a fheiceáil faoin 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;
}

Táimid ag scríobh script chun an sonas seo ar fad a bhainistiú

Beidh an sampla i PHP agus scríofa d’aon ghnó le híosmhéid trealamh. Sílim go mbeidh aon duine a bhfuil taithí aige ar aon teanga eile in ann an chuid seo a chomhtháthú ag baint úsáide as mo shampla.

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

Torthaí

Go ginearálta, déanann an modh seo go leor éasca é dáileadh comhad a eagrú d'úsáideoirí ó aon stóráil scamall. Sea, fiú ó teileagram nó VK, (ar choinníoll nach sáraíonn méid an chomhaid méid ceadaithe na stórála seo). Bhí smaoineamh cosúil le agam seo, ach ar an drochuair tagann mé trasna ar chomhaid suas le 2GB, agus níor aimsigh mé modh nó modúl fós chun freagraí a ghlúáil ó in aghaidh an tsrutha, agus tá scríobh cumhdaigh de chineál éigin don tionscadal seo míréasúnta dian ar shaothar.

Go raibh maith agat as do aird. Tá súil agam go raibh mo scéal beagán suimiúil nó úsáideach duit ar a laghad.

Foinse: will.com

Add a comment