Ka qaybinta faylasha Google Drive iyadoo la isticmaalayo nginx

prehistory

Waxa dhacday in aan u baahday in aan meel ku kaydiyo in ka badan 1.5 TB oo xog ah, oo aan sidoo kale siiyo awoodda isticmaalayaasha caadiga ah in ay ku soo dejiyaan xiriir toos ah. Maaddaama sida caadiga ah qadarka xusuusta ahi ay aado VDS, kharashka kiraynta oo aan aad loogu darin miisaaniyada mashruuca "wax la sameeyo" qaybta, iyo xogta isha waxaan haystay VPS 400GB SSD, halkaas oo, xitaa haddii aan Waxaan rabay, ma dhigi karo 1.5TB oo sawiro ah iyada oo aan la helin cadaadis aan khasaare lahayn way guulaysan doontaa.

Dabadeed waxaan xasuustay in haddii aan qashinka ka tirtiro Google Drive, sida barnaamijyada ku shaqayn doona Windows XP oo keliya, iyo waxyaabo kale oo ka soo wareegayay aaladda ilaa maalmihii aanu internetku aad u degdegsanayn haba yaraatee aan xad lahayn ( tusaale ahaan, noocyada 10-20 ee sanduuqa casriga ah uma badna inay yeeshaan qiimo aan ahayn nostalgic), markaa wax walba waa inay si fiican ugu habboon yihiin. Wax degdeg ah looma sheego. Oo sidaas daraaddeed, jebinta iyada oo loo marayo xadka tirada codsiyada ee api ah (sida, habka, taageero farsamo iyada oo aan wax dhibaato ah la kordhiyo kootada codsiyada user per 100 in 10 seconds), xogta si degdeg ah u qulqulay meesha ay sii dayn dheeraad ah. .

Wax walba waxay u muuqdaan inay wanaagsan yihiin, laakiin hadda waxay u baahan tahay in loo gudbiyo isticmaalaha ugu dambeeya. Intaa waxaa dheer, iyada oo aan loo wareejin kheyraadka kale, laakiin si qofku si fudud u riixo badhanka "Download" oo uu noqdo milkiilaha faraxsan ee faylka qaaliga ah.

Halkan, Illahay baan ku dhaartaye, waxaan galay dhibaato kasta. Markii hore waxay ahayd qoraal ku jira AmPHP, laakiin kuma qanacsanayn culayska ay abuurtay (boodboodka fiiqan ee bilawga ilaa 100% isticmaalka asaasiga ah). Kadib duubista curlka ee ReactPHP ayaa ciyaartay, taas oo ku habboon rabitaankayga marka loo eego tirada wareegyada CPU ee la isticmaalo, laakiin ma siin xawaaraha dhammaan wixii aan rabay (waxaa soo baxday inaad si fudud u yareyn karto muddada wicitaanka). curl_multi_select, laakiin markaa waxaanu leenahay hunguri weyn oo la mid ah ikhtiyaarka koowaad). Waxaan xitaa isku dayay inaan qoro adeeg yar oo Rust ah, waxayna si dhakhso ah u shaqeysay (waa la yaab in ay shaqeysay, iyada oo la siiyay aqoontayda), laakiin waxaan doonayay wax badan, oo waxay ahayd si uun adag tahay in la habeeyo. Intaa waxaa dheer, dhammaan xalalkan ayaa si qarsoodi ah u daboolay jawaabta, oo waxaan rabay inaan la socdo xilliga uu soo dejinta faylka ku dhammaaday saxnaanta ugu weyn.

Guud ahaan, in muddo ah, way qalloocday, laakiin way shaqeysay. Ilaa hal maalin ayaan la yimid fikrad cajiib ah oo waalan: nginx, aragti ahaan, waxay sameyn kartaa waxa aan rabo, si dhakhso ah u shaqeeyo, xitaa u oggolow dhammaan noocyada qalloocyada leh qaabeynta. Waa inaan isku daynaa - maxaa dhacaya haddii ay shaqeyso? Kadib nus-maalin baaritaan joogto ah, waxaa dhashay xal si deggan u shaqeynayay dhowr bilood oo buuxiyey dhammaan shuruudahayga.

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

Nooc gaaban oo aan faallooyin lahayn ayaa laga arki karaa qaswada hoosteeda

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

Waxaan qoraynaa qoraal si aan u maareyno farxaddan oo dhan

Tusaalaha wuxuu ahaan doonaa PHP oo si ula kac ah loogu qori doonaa ugu yaraan qalafsanaan. Waxaan u maleynayaa in qof kasta oo khibrad u leh luqad kale uu awoodi doono inuu isku daro qaybtan isagoo isticmaalaya tusaalahayga.

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

Natiijooyinka

Guud ahaan, habkani wuxuu ka dhigayaa mid aad u fudud in la abaabulo qaybinta faylasha isticmaalayaasha kaydinta daruur kasta. Haa, xitaa telegram ama VK, (waa haddii cabbirka faylka uusan ka badnayn cabbirka la oggol yahay ee kaydintan). Waxaan lahaa fikrad la mid ah tan, laakiin nasiib daro waxaan la kulmay faylal gaaraya ilaa 2GB, walina ma helin hab ama moduleka lagu dhejiyo jawaabaha korka, iyo qorista nooc ka mid ah duubista mashruucan waa mid aan macquul ahayn oo xoog leh.

Waad ku mahadsan tahay dareenkaaga. Waxaan rajeynayaa in sheekadeyda ay ugu yaraan wax yar oo xiiso leh ama waxtar kuu lahayd.

Source: www.habr.com

Add a comment