Sisabalalisa amafayela ukusuka ku-Google Drayivu kusetshenziswa i-nginx

prehistory

Kwenzeka lokhu nje ngidinga ukugcina idatha engaphezu kuka-1.5 TB endaweni ethile, futhi nginikeze nekhono kubasebenzisi abajwayelekile ukuyilanda ngesixhumanisi esiqondile. Njengoba ngokwesiko amanani anjalo enkumbulo aya ku-VDS, izindleko zokuqasha ezingafakwanga kakhulu kusabelomali sephrojekthi kusukela esigabeni esithi “akukho okumele ukwenze”, futhi kusukela kudatha yomthombo ngine-VPS 400GB SSD, lapho, noma bengifuna, angikwazanga ukubeka i-1.5TB yezithombe ngaphandle kokucindezelwa okungalahleki kuzophumelela.

Ngase ngikhumbula ukuthi uma ngisusa udoti ku-Google Drayivu, njengezinhlelo ezizosebenza kuphela ku-Windows XP, nezinye izinto ebezilokhu zisuka kwenye idivayisi ziye kwenye kusukela ezinsukwini lapho i-inthanethi yayingasheshi kangako nhlobo. isibonelo, lezo zinguqulo ezingu-10-20 zebhokisi elibonakalayo kwakungenakwenzeka ukuba zibe nenani elingaphandle kwe-nostalgic), ngakho konke kufanele kulingane kahle kakhulu. Kulula ukusho kunokwenza. Ngakho-ke, ukweqa umkhawulo wenani lezicelo ku-api (ngendlela, ukwesekwa kwezobuchwepheshe ngaphandle kwezinkinga kwandise inani lezicelo ngomsebenzisi ngamunye laya ku-100 ngemizuzwana eyi-10), idatha yagelezela ngokushesha endaweni yokuthunyelwa kwayo okwengeziwe. .

Konke kubonakala kukuhle, kodwa manje kudinga ukudluliselwa kumsebenzisi wokugcina. Ngaphezu kwalokho, ngaphandle kokuqondisa kabusha kwezinye izinsiza, kodwa ukuze umuntu avele acindezele inkinobho ethi "Landa" futhi abe umnikazi ojabulisayo wefayela eliyigugu.

Lapha, ngoNkulunkulu, ngangena kuzo zonke izinhlobo zezinkinga. Ekuqaleni kwakuyiskripthi ku-AmPHP, kodwa angizange ngigculiseke ngomthwalo owadala (ukugxuma okubukhali ekuqaleni kokusetshenziswa okuyisisekelo kwe-100%. Kwabe sekuqala ukusebenza i-curl wrapper ye-ReactPHP, evumelana nezifiso zami ngokwenani lemijikelezo ye-CPU esetshenzisiwe, kodwa ayizange inikeze isivinini nakancane engangikufuna (kuvele ukuthi ungamane wehlise isikhawu sokushaya ucingo. curl_multi_select, kodwa-ke sinokuminza okufana nenketho yokuqala ). Ngize ngazama ukubhala insizakalo encane ku-Rust, futhi yasebenza ngokushesha (kuyamangaza ukuthi yasebenza, ngenxa yolwazi lwami), kodwa ngangifuna okwengeziwe, futhi kwakunzima ngandlela-thile ukuzenza ngokwezifiso. Ngaphezu kwalokho, zonke lezi zixazululo zaphazamisa impendulo ngendlela exakile, futhi bengifuna ukulandelela isikhathi lapho ukulandwa kwefayela kwaphela khona ngokunemba okukhulu.

Ngokuvamile, yayigwegwile isikhashana, kodwa yasebenza. Kuze kube ngolunye usuku ngathola umbono owawuphawuleka ekuhlanyeni kwayo: i-nginx, ngokombono, ingenza engikufunayo, isebenze ngokushesha, futhi ivumele zonke izinhlobo zokuhlanekezela ngokucushwa. Kufanele sizame - kuthiwani uma kusebenza? Futhi ngemva kwesigamu sosuku lokufuna okuqhubekayo, kwazalwa isixazululo esasisebenze ngokuzinza izinyanga ezimbalwa futhi sahlangabezana nazo zonke izidingo zami.

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

Inguqulo emfushane ngaphandle kokuphawula ingabonwa ngaphansi kwe-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;
}

Sibhala umbhalo wokuphatha yonke le njabulo

Isibonelo sizoba ku-PHP futhi sibhalwe ngamabomu ngekhithi encane. Ngicabanga ukuthi noma ubani onolwazi nganoma yiluphi olunye ulimi uzokwazi ukuhlanganisa lesi sigaba esebenzisa isibonelo sami.

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

Imiphumela

Ngokuvamile, le ndlela yenza kube lula kakhulu ukuhlela ukusatshalaliswa kwamafayela kubasebenzisi kunoma yisiphi isitoreji samafu. Yebo, ngisho nakuthelegramu noma ku-VK, (inqobo nje uma usayizi wefayela aweqi usayizi ovunyelwe walesi sitoreji). Nganginombono ofana nawo lokhu, kodwa ngeshwa ngihlangana namafayela afika ku-2GB, futhi angikakayitholi indlela noma imojula yezimpendulo ze-gluing kusuka phezulu nomfula, futhi ukubhala uhlobo oluthile lwama-wrappers wale phrojekthi kuwumsebenzi onzima ngokungafanele.

Ngiyabonga ukulalela kwenu. Ngethemba ukuthi indaba yami okungenani ibithakazelisa kancane noma iwusizo kuwe.

Source: www.habr.com

Engeza amazwana