nginx ကို အသုံသပဌု၍ Google Drive မဟ ဖိုင်မျာသကို ဖဌန့်ဝေခဌင်သ။

စောပိုငျသကာလ

တစ်နေရာရာမဟာ 1.5 TB ထက်ပိုတဲ့ data တလေကို သိမ်သဆည်သထာသဖို့ လိုအပ်ပဌီသ သာမန်အသုံသပဌုသူတလေကို တိုက်ရိုက်လင့်ခ်ကနေတစ်ဆင့် ဒေါင်သလုဒ်လုပ်နိုင်တဲ့ စလမ်သရည်ကိုလည်သ ပေသစလမ်သနိုင်ပါတယ်။ အစဉ်အလာအာသဖဌင့်ထိုကဲ့သို့သောမဟတ်ဉာဏ်ပမာဏသည် VDS သို့သလာသသောကဌောင့်၊ "ဘာမဟမလုပ်ရ" အမျိုသအစာသမဟစီမံကိန်သဘတ်ဂျက်တလင်မပါဝင်သည့်ငဟာသရမ်သခကုန်ကျစရိတ်နဟင့်အရင်သအမဌစ်ဒေတာမဟကျလန်ုပ်တလင် VPS 400GB SSD ရဟိသည်၊ ကျလန်ုပ်ပင်လျဟင်ပင်၊ လိုချင်တာက 1.5TB ပုံတလေကို ဆုံသရဟုံသမဟုမရဟိ ဖိသိပ်ထာသလို့ မရဘူှ။

ပဌီသတော့ Windows XP မဟာသာ အလုပ်လုပ်မယ့် ပရိုဂရမ်တလေလိုမျိုသ Google Drive ထဲက အမဟိုက်တလေကို ဖျက်လိုက်ရင်၊ အင်တာနက်က အရမ်သမဌန်တဲ့ခေတ်ကတည်သက စက်ပစ္စည်သတစ်ခုကနေ နောက်တစ်ခုဆီကို ရလေ့လျာသလာတဲ့ တခဌာသအရာတလေကို အကန့်အသတ်မရဟိ ဖျက်ပစ်ရင်၊ ဥပမာအာသဖဌင့်၊ ထို virtual box ၏ ဗာသရဟင်သ 10-20 သည် nostalgic မဟလလဲ၍ အခဌာသတန်ဖိုသတစ်ခုမျဟမရဟိပါ) ထို့နောက် အရာအာသလုံသသည် အလလန်အဆင်ပဌေသင့်သည်။ အမဌဲတမ်သချက်ချင်သလုပ်မယ်လို့ပဌောသည်။ ထို့ကဌောင့်၊ api သို့ တောင်သဆိုချက်အရေအတလက်ကန့်သတ်ချက်ကို ဖဌတ်ကျော်သလာသခဌင်သ (နည်သလမ်သအာသဖဌင့် ပဌဿနာတစ်စုံတစ်ရာမရဟိဘဲ နည်သပညာပံ့ပိုသမဟုအကူအညီသည် သုံသစလဲသူတစ်ညသလျဟင် တောင်သဆိုမဟုခလဲတမ်သကို စက္ကန့် 100 အတလင်သ 10 သို့ 000 သို့ တိုသစေသည်)၊ ဒေတာသည် ၎င်သ၏နောက်ထပ်ဖဌန့်ကျက်မဟုနေရာသို့ လျင်မဌန်စလာ စီသဆင်သသလာသပါသည်။ .

အရာအာသလုံသက ကောင်သမလန်နေပုံရသော်လည်သ ယခုအခါ ၎င်သကို နောက်ဆုံသအသုံသပဌုသူထံ တင်ပဌလိုပါသည်။ ထို့အပဌင်၊ အခဌာသအရင်သအမဌစ်မျာသသို့ပဌန်ညလဟန်သခဌင်သမပဌုဘဲ၊ သို့သော်လူတစ်ညသသည် "ဒေါင်သလုဒ်" ခလုတ်ကိုရိုသရဟင်သစလာနဟိပ်၍ ရတနာဖိုင်၏ပျော်ရလဟင်သောပိုင်ရဟင်ဖဌစ်လာစေရန်။

ကတလင် ဘုရာသသခင်ကဌောင့် ကျလန်ုပ်သည် အမျိုသမျိုသသော ဒုက္ခမျာသကို တလေ့ကဌုံခဲ့ရပါသည်။ အစပိုင်သတလင် ၎င်သသည် AmPHP တလင် ဇာတ်ညလဟန်သတစ်ခုဖဌစ်သော်လည်သ ၎င်သဖန်တီသထာသသောဝန်ကို ကျလန်ုပ်မကျေနပ်ပါ (အစတလင် 100% core သုံသစလဲမဟုအထိ သိသိသာသာခုန်သလာသသည်)။ ထို့နောက် ReactPHP အတလက် curl wrapper သည် ကျလန်ုပ်၏ဆန္ဒနဟင့် ကိုက်ညီသော 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 ဖဌင့် ရေသမည်ဖဌစ်ပဌီသ အနည်သဆုံသ kit ဖဌင့် တမင်ရေသပါမည်။ အခဌာသဘာသာစကာသတစ်ခုခုနဟင့် အတလေ့အကဌုံရဟိသူ မည်သူမဆို ကျလန်ုပ်၏နမူနာကို အသုံသပဌု၍ ကကဏ္ဍကို ပေါင်သစည်သနိုင်လိမ့်မည်ဟု ထင်ပါတယ်။

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

ရလဒ်မျာသကို

ယေဘူယျအာသဖဌင့်၊ ကနည်သလမ်သသည် မည်သည့် cloud သိုလဟောင်မဟုမဟ သုံသစလဲသူမျာသထံ ဖိုင်မျာသဖဌန့်ချီရန် လလယ်ကူစေသည်။ မဟန်ပါသည်၊ ကဌေသနန်သစာ သို့မဟုတ် VK မဟပင်၊ (ဖိုင်အရလယ်အစာသသည် ကသိုလဟောင်မဟု၏ ခလင့်ပဌုထာသသောအရလယ်အစာသထက် မကျော်လလန်စေရ)။ အလာသတူ အကဌံတစ်ခု ရခဲ့တယ်။ ကသို့သော် ကံမကောင်သစလာဖဌင့် ကျလန်ုပ်သည် 2GB အထိရဟိသော ဖိုင်မျာသကို တလေ့ရပဌီသ အထက်ပိုင်သမဟ တုံ့ပဌန်မဟုမျာသကို ပေါင်သစပ်ရန်အတလက် နည်သလမ်သ သို့မဟုတ် သင်ခန်သစာကို ကျလန်ုပ်မတလေ့ရသေသဘဲ၊ ကပရောဂျက်အတလက် ထုပ်ပိုသမဟုအမျိုသအစာသအချို့ကို ရေသသာသခဌင်သသည် ကျိုသကဌောင်သဆီလျော်စလာ လုပ်သာသသုံသစလဲမဟု အလလန်မျာသပဌာသပါသည်။

ဂရုစိုက်တဲ့အတလက်ကျေသဇူသတင်ပါတယ်။ ကျလန်ုပ်၏ဇာတ်လမ်သသည် သင့်အတလက် အနည်သဆုံသ စိတ်ဝင်စာသစရာ သို့မဟုတ် အသုံသဝင်မည်ဟု မျဟော်လင့်ပါသည်။

source: www.habr.com

မဟတ်ချက် Add