nginx کا استعمال کرتے ہوئے Google Drive سے فائلیں تقسیم کرنا

پس منظر

ایسا ہی ہوا کہ مجھے 1.5 TB سے زیادہ ڈیٹا کو کہیں ذخیرہ کرنے کی ضرورت تھی، اور عام صارفین کے لیے اسے براہ راست لنک کے ذریعے ڈاؤن لوڈ کرنے کی اہلیت بھی فراہم کرنا تھی۔ چونکہ روایتی طور پر میموری کی اتنی مقدار VDS میں جاتی ہے، اس لیے کرائے پر لینے کی لاگت جو "کچھ کرنے کے لیے کچھ نہیں" کے زمرے سے پروجیکٹ بجٹ میں بہت زیادہ شامل نہیں ہے، اور ماخذ ڈیٹا سے میرے پاس VPS 400GB SSD تھا، جہاں، چاہے میں میں چاہتا تھا کہ میں 1.5TB تصاویر بغیر کسی نقصان کے کمپریشن کے نہیں ڈال سکتا تھا یہ کامیاب ہو جائے گا۔

اور پھر مجھے یاد آیا کہ اگر میں گوگل ڈرائیو سے ردی کو ڈیلیٹ کرتا ہوں، جیسے کہ وہ پروگرام جو صرف ونڈوز ایکس پی پر چلیں گے، اور دوسری چیزیں جو ان دنوں سے ایک ڈیوائس سے دوسرے ڈیوائس میں منتقل ہو رہی ہیں جب انٹرنیٹ اتنا تیز نہیں تھا بالکل بھی لامحدود نہیں ( مثال کے طور پر، ورچوئل باکس کے ان 10-20 ورژنوں میں پرانی یادوں کے علاوہ کوئی قیمت ہونے کا امکان نہیں تھا)، پھر سب کچھ بہت اچھی طرح فٹ ہونا چاہیے۔ جلد از جلد کہا نہیں کیا. اور اس طرح، اے پی آئی کو درخواستوں کی تعداد کی حد کو توڑتے ہوئے (ویسے، تکنیکی مدد نے بغیر کسی پریشانی کے فی صارف درخواستوں کا کوٹہ 100 سیکنڈ میں بڑھا کر 10 کر دیا)، ڈیٹا تیزی سے اپنی مزید تعیناتی کی جگہ پر چلا گیا۔ .

سب کچھ اچھا لگتا ہے، لیکن اب اسے آخری صارف تک پہنچانے کی ضرورت ہے۔ مزید یہ کہ، بغیر کسی ری ڈائریکٹ کے دوسرے وسائل کی طرف، لیکن اس لیے کہ کوئی شخص صرف "ڈاؤن لوڈ" بٹن دباتا ہے اور قیمتی فائل کا خوش مالک بن جاتا ہے۔

یہاں، خدا کی قسم، میں ہر قسم کی مصیبتوں میں چلا گیا. پہلے تو یہ AmPHP میں ایک اسکرپٹ تھا، لیکن میں اس کے پیدا کردہ بوجھ سے مطمئن نہیں تھا (شروع میں 100% بنیادی کھپت پر تیز چھلانگ)۔ پھر ری ایکٹ پی ایچ پی کے لیے کرل ریپر کام میں آیا، جو کہ استعمال ہونے والے 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;
}

تبصرے کے بغیر ایک مختصر ورژن بگاڑنے والے کے نیچے دیکھا جا سکتا ہے۔

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

# Токен для 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 سے بھی، (بشرطیکہ فائل کا سائز اس اسٹوریج کے قابل اجازت سائز سے زیادہ نہ ہو)۔ میرے پاس بھی ایسا ہی خیال تھا۔ اس، لیکن بدقسمتی سے مجھے 2 جی بی تک کی فائلیں آتی ہیں، اور مجھے ابھی تک اپ اسٹریم سے جوابات کو چپکنے کے لیے کوئی طریقہ یا ماڈیول نہیں ملا ہے، اور اس پروجیکٹ کے لیے کسی قسم کے ریپر لکھنا غیر معقول حد تک محنت طلب ہے۔

آپکی توجہ کا شکریہ. مجھے امید ہے کہ میری کہانی کم از کم آپ کے لیے تھوڑی دلچسپ یا مفید تھی۔

ماخذ: www.habr.com

نیا تبصرہ شامل کریں