د nginx په کارولو سره د ګوګل ډرایو څخه فایلونه توزیع کول

له تاریخ څخه دمخه

دا یوازې داسې پیښ شوي چې ما اړتیا درلوده چې له 1.5 TB څخه ډیر ډیټا چیرته ذخیره کړم، او د عادي کاروونکو لپاره دا وړتیا هم چمتو کړم چې دا د مستقیم لینک له لارې ډاونلوډ کړي. څنګه چې په دودیز ډول د حافظې دومره مقدار VDS ته ځي ، د کرایې لګښت چې د پروژې بودیجه کې د "هیڅ کولو لپاره" کټګورۍ کې خورا ډیر ندي شامل شوي ، او د سرچینې ډیټا څخه ما د VPS 400GB SSD درلود ، چیرې چې حتی که زه غوښتل یې، زه نشم کولی د 1.5TB عکسونه پرته له ضایع کمپریشن څخه واچوم چې دا به بریالی شي.

او بیا مې په یاد ولرم چې که زه له ګوګل ډرایو څخه جنک حذف کړم، لکه هغه پروګرامونه چې یوازې په وینډوز ایکس پی کې به چلیږي، او نور شیان چې له هغه ورځو راهیسې له یوې وسیلې څخه بل ته حرکت کوي کله چې انټرنیټ دومره ګړندی نه و په لامحدود (. د مثال په توګه، د مجازی بکس هغه 10-20 نسخې امکان نلري چې د نوسټالیژیک پرته بل ارزښت ولري)، نو هرڅه باید خورا ښه وي. د هغه نه زر نه کیږی. او له همدې امله ، api ته د غوښتنو شمیر محدودیت ماتول (په لاره کې ، تخنیکي ملاتړ پرته له کومې ستونزې د هر کارونکي غوښتنې کوټه په 100 ثانیو کې 10 ته لوړه کړه) ، ډاټا په چټکۍ سره د هغې د ځای پرځای کولو ځای ته لاړ. .

هرڅه ښه ښکاري، مګر اوس اړتیا لري چې پای کارونکي ته واستول شي. سربیره پردې ، پرته له دې چې نورو سرچینو ته لارښود شي ، مګر دا چې یو څوک په ساده ډول د "ډاونلوډ" تڼۍ فشاروي او د خزانې فایل خوشحاله مالک کیږي.

دلته، د خدای په واسطه، زه د هر ډول مصیبتونو سره مخ شوم. په لومړي سر کې دا په AmPHP کې سکریپټ و، مګر زه د هغه بار څخه راضي نه وم چې دا یې رامینځته کړی (په پیل کې 100٪ اصلي مصرف ته تیز کود). بیا د ReactPHP لپاره د curl ریپر پلی شو ، کوم چې زما د هیلو سره سم د مصرف شوي CPU سایکلونو شمیر سره سم مناسب دی ، مګر هغه څه چې ما غوښتل سرعت یې نه دی ورکړی (دا معلومه شوه چې تاسو کولی شئ په ساده ډول د زنګ وهلو وقفه کم کړئ. curl_multi_select، مګر بیا موږ د لومړي اختیار سره ورته یو خوند لرو). ما حتی هڅه وکړه چې په Rust کې یو کوچنی خدمت ولیکم، او دا په چټکۍ سره کار وکړ (دا د حیرانتیا خبره ده چې دا کار وکړ، زما د پوهې په پام کې نیولو سره)، مګر ما نور غوښتل، او دا یو څه ستونزمن و چې دا دودیز کړي. سربیره پردې ، دا ټول حلونه یو څه په عجیب ډول ځواب بفر کړی ، او ما غوښتل هغه شیبه تعقیب کړم کله چې د فایل ډاونلوډ خورا دقت سره پای ته ورسید.

په عموم کې، دا د یو څه وخت لپاره خرابه وه، مګر دا کار وکړ. تر هغه چې یوه ورځ زه د یوې مفکورې سره راغلم چې په لیوالتیا کې د پام وړ و: نګینکس، په تیوري کې، کولی شي هغه څه وکړي چې زه یې غواړم، په چټکۍ سره کار وکړم، او حتی د ترتیب سره هر ډول تخریب ته اجازه ورکړئ. موږ باید هڅه وکړو - څه شی که دا کار وکړي؟ او د یوې نیمې ورځې دوامداره لټون وروسته، یو حل پیدا شو چې د څو میاشتو راهیسې په ثابت ډول کار کوي او زما ټولې اړتیاوې یې پوره کړې.

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

د تبصرو پرته لنډه نسخه د سپیلر لاندې لیدل کیدی شي

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

موږ د دې ټولو خوښیو اداره کولو لپاره سکریپټ لیکو

مثال به په PHP کې وي او په قصدي توګه د لږترلږه کټ سره لیکل کیږي. زما په اند هر هغه څوک چې د کومې بلې ژبې سره تجربه لري زما د مثال په کارولو سره به دا برخه یوځای کړي.

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

پایلې

په عموم کې ، دا میتود د هر بادل ذخیره څخه کاروونکو ته د فایلونو توزیع تنظیم کول خورا اسانه کوي. هو، حتی د ټیلیګرام یا VK څخه، (په دې شرط چې د فایل اندازه د دې ذخیره کولو د جواز وړ اندازې څخه زیاته نه وي). ما ورته یو نظر درلود دا، مګر له بده مرغه زه تر 2GB پورې فایلونو ته ګورم ، او ما تر اوسه پورې د پورته څخه د ځوابونو د ګلو کولو لپاره میتود یا ماډل ندی موندلی ، او د دې پروژې لپاره د یو ډول ریپرونو لیکل غیر معقول کار دی.

له پاملرنې څخه مو مننه. زه امید لرم چې زما کیسه لږترلږه یو څه په زړه پوري یا ستاسو لپاره ګټوره وه.

سرچینه: www.habr.com

Add a comment