Belavkirina pelan ji Google Drive bi karanîna nginx

pêşdîrok

Wusa çêbû ku min hewce kir ku ji 1.5 TB zêdetir daneyan li cîhek hilgirim, û di heman demê de ji bikarhênerên asayî re şiyana dakêşandina wê bi girêdanek rasterast peyda bikim. Ji ber ku bi kevneşopî mîqdarên weha yên bîranînê diçin VDS-ê, lêçûna kirê ya ku ji kategoriya "tiştekî ku ez bikim" di budceya projeyê de pir zêde tê de nîne, û ji daneyên çavkaniyê min VPS 400 GB SSD hebû, li ku derê, her çend ez dixwest, min nikarîbû 1.5TB wêneyan bêyî komkirina bê wendahiyê deynim ew ê biserkeve.

Û dûv re hat bîra min ku ger ez nebatên ji Google Drive-ê jêbikim, mîna bernameyên ku dê tenê li ser Windows XP-ê bixebitin, û tiştên din ên ku ji wan rojên ku înternet ne ew qas bilez bû û ne bêsînor ( ji bo nimûne, ew 10-20 guhertoyên qutiya virtual ne mimkûn e ku ji xeynî nostaljîk nirxek din hebe), wê hingê divê her tişt pir baş li hev bike. Ne ji zû de got. Û bi vî awayî, şikandina sînorê hejmara daxwazên API-yê (bi awayê, piştgiriya teknîkî bêyî pirsgirêk kotaya daxwazên her bikarhêner di 100 çirkeyan de 10 zêde kir), dane zû diherikin cihê şandina wê ya din. .

Her tişt baş xuya dike, lê naha pêdivî ye ku ew ji bikarhênerê dawî re were ragihandin. Digel vê yekê, bêyî beralîkirina çavkaniyên din, lê bi vî rengî ku kesek bi tenê bişkoja "Daxistin" pêdixe û dibe xwediyê bextewar ê pelê xezîne.

Li vir, bi Xwedê, ez ketim her cûre tengasiyan. Di destpêkê de ew di AmPHP-ê de skrîptek bû, lê ez ji barkirina ku afirand razî nebûm (di destpêkê de bazdanek tûj berbi 100% vexwarina bingehîn). Dûv re pêça qulikê ya ji bo ReactPHP ket lîstikê, ku ji hêla hejmara çerxên CPU-yê ve hatî vexwarin de bi daxwazên min ve girêdayî ye, lê bi tevahî leza ku min dixwest neda (derket ku hûn tenê dikarin navberê bangê kêm bikin curl_multi_select, lê dûv re me gêjbûnek mîna vebijarka yekem heye). Tewra min hewl da ku ez karûbarek piçûk li Rust binivîsim, û ew pir zû xebitî (sayî ye ku ew xebitî, ji ber zanîna min), lê min bêtir dixwest, û bi rengekî dijwar bû ku meriv wê xweş bike. Wekî din, van hemî çareseriyan bi rengek ecêb bersivê tampon kirin, û min xwest ku dema ku dakêşana pelê bi rastbûna herî mezin qediya bişopînim.

Bi gelemperî, ew demek xelet bû, lê ew xebitî. Heya ku rojekê min ramanek ku di dînbûna xwe de balkêş bû hat: nginx, di teorîyê de, dikare tiştê ku ez dixwazim bike, zû bixebite, û tewra destûrê bide her cûre guheztinên bi veavakirinê. Pêdivî ye ku em biceribînin - heke ew bixebite? Û piştî nîv roj lêgerîna domdar, çareseriyek çêbû ku çend meh bi îstîqrar dixebitî û hemî hewcedariyên min bicîh anî.

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

Guhertoyek kurt a bê şîrove di binê spoiler de tê dîtin

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

Em senaryoyekê dinivîsin da ku vê dilşadiyê birêve bibin

Nimûne dê di PHP-ê de be û bi qestî bi hindiktirîn kîtê were nivîsandin. Ez difikirim ku her kesê ku ezmûna wî bi zimanek din re heye dê bikaribe vê beşê bi mînaka min entegre bike.

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

Encam

Bi gelemperî, ev rêbaz organîzekirina belavkirina pelan ji bikarhêneran re ji her hilanîna ewr re pir hêsan dike. Erê, tewra ji telegram an VK jî, (bi şertê ku mezinahiya pelê ji mezinahiya destûr a vê hilanînê derbas nebe). Min fikirek mîna wê hebû ev, lê mixabin ez rastî pelên heya 2 GB tê, û min hîn rêgezek an modulek ji bo girêdana bersivên ji jor ve nedîtiye, û nivîsandina cûreyek pêçanan ji bo vê projeyê bi rengek bêaqil kedkar e.

Spas ji bo baldariya we. Ez hêvî dikim ku çîroka min bi kêmanî ji we re hinekî balkêş an kêrhatî bû.

Source: www.habr.com

Add a comment