nginx استعمال ڪندي گوگل ڊرائيو مان فائلون ورهائڻ

prehistory

بس ائين ئي ٿيو آهي ته مون کي 1.5 TB کان وڌيڪ ڊيٽا کي ڪنهن جاءِ تي ذخيرو ڪرڻ جي ضرورت هئي، ۽ عام استعمال ڪندڙن لاءِ اها صلاحيت پڻ مهيا ڪئي وئي آهي ته اها سڌي لنڪ ذريعي ڊائون لوڊ ڪري سگهي. جيئن ته روايتي طور تي ميموري جي اهڙي مقدار VDS ڏانهن وڃي ٿي، کرايه جي قيمت جيڪا "ڪجهه به نه ڪرڻ" جي درجي کان پروجيڪٽ جي بجيٽ ۾ شامل نه آهي، ۽ ذريعن جي ڊيٽا مان مون وٽ VPS 400GB SSD هو، جتي، جيتوڻيڪ آئون. چاهيان ٿو، مان 1.5TB تصويرون نه وجهي سگهيس بغير نقصان جي ڪمپريشن اهو ڪامياب ٿيندو.

۽ پوءِ مون کي ياد آيو ته جيڪڏهن مان گوگل ڊرائيو مان فضول ختم ڪري ڇڏيان، جهڙوڪ پروگرام جيڪي صرف ونڊوز XP تي هلندا، ۽ ٻيون شيون جيڪي هڪ ڊوائيس کان ٻئي ڊوائيس تي منتقل ٿي رهيون آهن انهن ڏينهن کان جڏهن انٽرنيٽ ايتري تيز نه هئي ۽ نه ئي لامحدود ( مثال طور، ورچوئل باڪس جا اهي 10-20 ورجن ممڪن نه هوندا هئا ته ان کان سواءِ ڪنهن به قدر جي نوسٽلجڪ هجي)، پوءِ هر شيءِ چڱيءَ طرح ٺهڻ گهرجي. نه چيو جلد کان وڌيڪ. ۽ ان ڪري، ايپ جي درخواستن جي تعداد جي حد کي ٽوڙڻ (رستي طور، ٽيڪنيڪل سپورٽ بغير ڪنهن پريشاني جي في صارف جي درخواستن جي ڪوٽا کي 100 سيڪنڊن ۾ 10 سيڪنڊن ۾ وڌايو)، ڊيٽا جلدي ان جي وڌيڪ تعیناتي جي جاء تي وهندي. .

هر شي سٺي لڳي ٿي، پر هاڻي ان کي آخري صارف تائين پهچائڻ جي ضرورت آهي. ان کان سواء، بغير ڪنهن به ريڊائريڪٽ جي ٻين وسيلن ڏانهن، پر انهي ڪري ته هڪ شخص صرف "ڊائون لوڊ" بٽڻ کي دٻايو ۽ خزاني واري فائل جو خوش مالڪ بڻجي وڃي.

هتي، خدا جو قسم، مان هر قسم جي مصيبتن ۾ ويو. پهرين ته اها ايم پي ايڇ پي ۾ هڪ اسڪرپٽ هئي، پر مان مطمئن نه هو انهي لوڊ سان جيڪو اهو ٺاهيو ويو (شروع ۾ هڪ تيز جمپ 100٪ بنيادي واپرائڻ). پوءِ ReactPHP لاءِ ڪرل ريپر راند ۾ آيو ، جيڪو استعمال ٿيل CPU سائيڪلن جي تعداد جي لحاظ کان منهنجي خواهشن ۾ ڪافي مناسب هو ، پر رفتار نه ڏني جيڪا مون چاهيو (اهو ظاهر ٿيو ته توهان صرف ڪالنگ جي وقفي کي گهٽائي سگهو ٿا. curl_multi_select، پر پوءِ اسان وٽ پهرين آپشن وانگر گلوٽيني آهي). مون به ڪوشش ڪئي ته هڪ ننڍڙي خدمت Rust ۾ لکڻ جي، ۽ اهو تمام جلدي ڪم ڪيو (اها حيرت جي ڳالهه آهي ته اهو ڪم ڪيو، منهنجي ڄاڻ ڏني)، پر مون وڌيڪ چاهيو، ۽ اهو ڪنهن به طرح سان ترتيب ڏيڻ ڏکيو هو. ان کان علاوه، انهن سڀني حلن کي ڪنهن به طريقي سان جواب کي بفر ڪيو، ۽ مان ان لمحي کي ٽريڪ ڪرڻ چاهيان ٿو جڏهن فائل ڊائون لوڊ تمام وڏي درستگي سان ختم ٿي وئي.

عام طور تي، ان کي ٿوري دير لاء ڪڙي هئي، پر اهو ڪم ڪيو. ايتري تائين جو هڪ ڏينهن مون وٽ هڪ خيال آيو جيڪو ان جي چريو ۾ قابل ذڪر هو: nginx، نظريي ۾، اهو ڪري سگهان ٿو جيڪو مان چاهيان ٿو، جلدي ڪم ڪري، ۽ حتي ترتيب سان هر قسم جي خرابين کي اجازت ڏيو. اسان کي ڪوشش ڪرڻ گهرجي - ڇا جيڪڏهن اهو ڪم ڪري ٿو؟ ۽ اڌ ڏينهن جي مسلسل ڳولا کان پوء، هڪ حل پيدا ٿيو جيڪو ڪيترن ئي مهينن تائين مستحڪم ڪم ڪري رهيو هو ۽ منهنجي سڀني گهرجن کي پورو ڪيو.

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

تبصرو کان سواء هڪ مختصر نسخو 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;
}

اسان هن سڀني خوشين کي منظم ڪرڻ لاء هڪ اسڪرپٽ لکي رهيا آهيون

مثال 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

تبصرو شامل ڪريو