A’ cuairteachadh fhaidhlichean bho Google Drive a’ cleachdadh nginx

ro-eachdraidheil

Tha e dìreach mar sin a thachair gum feumadh mi barrachd air 1.5 TB de dhàta a stòradh an àiteigin, agus cuideachd comas a thoirt do luchd-cleachdaidh àbhaisteach a luchdachadh sìos tro cheangal dìreach. Leis gu bheil an leithid de chuimhne gu traidiseanta a’ dol gu VDS, tha cosgais màil nach eil gu mòr air a ghabhail a-steach ann am buidseat a’ phròiseict bhon roinn “chan eil dad ri dhèanamh”, agus bhon dàta tùsail bha VPS 400GB SSD agam, far, eadhon ged a bhiodh mi ag iarraidh, cha b’ urrainn dhomh 1.5TB de dhealbhan a chuir às aonais teannachadh gun chall bidh e soirbheachail.

Agus an uairsin chuimhnich mi ma sguabas mi às sgudal bho Google Drive, leithid prògraman nach ruith ach air Windows XP, agus rudan eile a tha air a bhith a’ gluasad bho aon inneal gu inneal eile bho na làithean nuair nach robh an eadar-lìn cho luath idir gun chrìoch ( mar eisimpleir, cha robh e coltach gum biodh luach sam bith aig na dreachan 10-20 sin den bhogsa bhrìgheil ach cianalas), bu chòir a h-uile càil a bhith a’ freagairt gu math. Cha bu luaithe thuirt na chaidh a dhèanamh. Agus mar sin, a’ briseadh tron ​​​​chrìoch air an àireamh de dh’ iarrtasan don api (co-dhiù, mheudaich taic theicnigeach gun duilgheadas sam bith an cuota de dh ’iarrtasan gach neach-cleachdaidh gu 100 ann an 10 diogan), chaidh an dàta gu sgiobalta chun àite far an deach a chleachdadh a-rithist. .

Tha e coltach gu bheil a h-uile dad math, ach a-nis feumar a chuir chun neach-cleachdaidh deireannach. A bharrachd air an sin, às aonais ath-sheòlaidhean gu goireasan eile, ach gus am bi neach dìreach a ’putadh air a’ phutan “Luchdaich sìos” agus gu bhith na neach-seilbh toilichte air an fhaidhle luachmhor.

An seo, le Dia, chaidh mi a-steach do gach seòrsa trioblaid. An toiseach bha e na sgriobt ann an AmPHP, ach cha robh mi riaraichte leis an luchd a chruthaich e (leum geur aig an toiseach gu caitheamh bunaiteach 100%). An uairsin thàinig am pasgan curl airson ReactPHP a-steach, a tha gu tur a ’freagairt air na miannan agam a thaobh an àireamh de chearcaill CPU a chaidh ithe, ach cha tug e seachad an astar idir na bha mi ag iarraidh ( thionndaidh e a-mach gun urrainn dhut dìreach an ùine gairm a lughdachadh curl_multi_select, ach an uairsin tha gliocas againn coltach ris a’ chiad roghainn). Dh'fheuch mi eadhon ri seirbheis bheag a sgrìobhadh ann an Rust, agus dh'obraich e gu math luath (tha e iongantach gun do dh'obraich e, leis an eòlas agam), ach bha mi ag iarraidh barrachd, agus bha e doirbh a ghnàthachadh ann an dòigh air choreigin. A bharrachd air an sin, bha na fuasglaidhean sin uile ann an dòigh air choreigin a’ buannachadh am freagairt, agus bha mi airson sùil a chumail air a’ mhionaid nuair a thàinig an luchdachadh sìos faidhle gu crìch leis an fhìor mhearachd.

San fharsaingeachd, bha e cam airson greis, ach dh'obraich e. Gu aon latha thàinig mi suas le beachd a bha iongantach na chuthach: is urrainn dha nginx, ann an teòiridh, na tha mi ag iarraidh a dhèanamh, obrachadh gu sgiobalta, agus eadhon leigeil le gach seòrsa perversion le rèiteachadh. Feumaidh sinn feuchainn - dè ma dh'obraicheas e? Agus às deidh leth latha de sgrùdadh leantainneach, rugadh fuasgladh a bha air a bhith ag obair gu seasmhach airson grunn mhìosan agus a choinnich ris na riatanasan agam.

A 'stèidheachadh 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;
}

Chithear dreach goirid gun bheachdan fon 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;
}

Tha sinn a’ sgrìobhadh sgriobt gus an toileachas seo gu lèir a riaghladh

Bidh an eisimpleir ann am PHP agus air a sgrìobhadh a dh’aona ghnothach le co-dhiù pasgan. Tha mi a’ smaoineachadh gum bi e comasach do dhuine sam bith aig a bheil eòlas air cànan sam bith eile an roinn seo fhilleadh a-steach leis an eisimpleir agam.

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

Builean

San fharsaingeachd, tha an dòigh seo ga dhèanamh gu math furasta cuairteachadh fhaidhlichean a chuir air dòigh gu luchd-cleachdaidh bho stòradh neòil sam bith. Tha, eadhon bho telegram no VK, (cho fad 's nach eil meud an fhaidhle nas àirde na meud ceadaichte an stòraidh seo). Bha beachd agam coltach ris seo, ach gu mì-fhortanach tha mi a’ tighinn tarsainn air faidhlichean suas gu 2GB, agus chan eil mi fhathast air dòigh no modal a lorg airson freagairtean a ghleusadh bho shuas an abhainn, agus tha sgrìobhadh pasgain de sheòrsa air choreigin airson a’ phròiseict seo gu mì-reusanta saothair-dian.

Tapadh leibh airson an aire agad. Tha mi an dòchas gun robh mo sgeulachd co-dhiù beagan inntinneach no feumail dhut.

Source: www.habr.com

Cuir beachd ann