Rarraba fayiloli daga Google Drive ta amfani da nginx

prehistory

Haka ya faru cewa ina buƙatar adana fiye da TB 1.5 na bayanai a wani wuri, kuma na samar da damar masu amfani da talakawa don saukewa ta hanyar haɗin kai tsaye. Tun da a al'ada irin wannan adadin ƙwaƙwalwar ajiya yana zuwa VDS, farashin haya wanda ba a haɗa shi sosai a cikin kasafin aikin ba daga nau'in "babu abin da za a yi", kuma daga bayanan tushen Ina da VPS 400GB SSD, inda, ko da na kasance. Ina so, Ba zan iya sanya 1.5TB na hotuna ba tare da matsi mara asara ba zai yi nasara.

Sai na tuna cewa idan na goge goge-goge daga Google Drive, kamar shirye-shiryen da za su yi amfani da su kawai akan Windows XP, da sauran abubuwan da suke tafiya daga wannan na'ura zuwa wata tun zamanin da Intanet ba ta da sauri ko kaɗan ba iyaka ba ( alal misali, waɗannan nau'ikan 10-20 na akwatin kama-da-wane ba su da yuwuwar samun wata ƙima banda nostalgic), to komai ya dace sosai. Da zaran an fada sai aka yi. Don haka, keta iyaka kan adadin buƙatun zuwa api (a hanya, tallafin fasaha ba tare da wata matsala ba ya ƙara adadin buƙatun kowane mai amfani zuwa 100 a cikin daƙiƙa 10), bayanan da sauri ya kwarara zuwa wurin da aka ƙara tura shi. .

Komai yana da kyau, amma yanzu yana buƙatar isar da shi ga mai amfani na ƙarshe. Haka kuma, ba tare da wani tura zuwa wasu albarkatu ba, amma don kawai mutum ya danna maɓallin "Download" kuma ya zama mai farin ciki na babban fayil ɗin.

Anan wallahi na shiga cikin masifu iri-iri. Da farko rubutun ne a cikin AmPHP, amma ban gamsu da nauyin da ya haifar ba (tsalle mai kaifi a farkon zuwa 100% core amfani). Sannan curl wrapper na ReactPHP ya shigo cikin wasa, wanda ya dace da buri na dangane da adadin zagayowar CPU da aka cinye, amma bai ba da saurin komai ba (ya nuna cewa zaku iya rage tazarar kira kawai). curl_multi_select, amma muna da ƙoshi mai kama da zaɓi na farko). Har ma na yi ƙoƙari na rubuta ƙaramin sabis a cikin Rust, kuma ya yi aiki da sauri (abin mamaki ne cewa ya yi aiki, an ba da ilimina), amma ina son ƙarin, kuma yana da wuya a tsara shi. Bugu da ƙari, duk waɗannan mafita ta wata hanya ta ban mamaki sun ba da amsa, kuma ina so in bibiyar lokacin da zazzage fayil ɗin ya ƙare da mafi girman daidaito.

Gabaɗaya, an karkatar da shi na ɗan lokaci, amma ya yi aiki. Har sai wata rana na zo da wani ra'ayi wanda ke da ban mamaki a cikin hauka: nginx, a ka'idar, na iya yin abin da nake so, aiki da sauri, har ma da ƙyale kowane nau'i na ɓarna tare da daidaitawa. Dole ne mu gwada - idan yana aiki fa? Kuma bayan rabin yini na ci gaba da bincike, an sami mafita wacce ta yi aiki tuƙuru na tsawon watanni kuma ta cika dukkan buƙatu na.

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

Ana iya ganin ɗan gajeren sigar ba tare da sharhi ba a ƙarƙashin mai ɓarna

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

Muna rubuta rubutun don sarrafa duk wannan farin ciki

Misalin zai kasance a cikin PHP kuma da gangan aka rubuta tare da mafi ƙarancin kit. Ina tsammanin duk wanda ke da gogewa da kowane harshe zai iya haɗa wannan sashe ta amfani da misalina.

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

Sakamakon

Gabaɗaya, wannan hanyar ta sa ya zama sauƙi don tsara rarraba fayiloli ga masu amfani daga kowane ajiyar girgije. Ee, ko da daga telegram ko VK, (idan har girman fayil ɗin bai wuce girman halattaccen wannan ajiyar ba). Ina da ra'ayi makamancin haka wannan, amma abin takaici na ci karo da fayiloli har zuwa 2GB, kuma har yanzu ban sami wata hanya ko tsari don gluing martani daga sama ba, kuma rubuta wasu nau'ikan nannade don wannan aikin yana da matukar wahala.

Na gode da kulawar ku. Ina fatan labarina ya kasance aƙalla ɗan ban sha'awa ko amfani a gare ku.

source: www.habr.com

Add a comment