Mizara rakitra avy amin'ny Google Drive mampiasa nginx

prehistory

Nitranga izany fa nila nitahiry angon-drakitra mihoatra ny 1.5 TB aho any ho any, ary manome fahafahan'ny mpampiasa tsotra misintona azy amin'ny alΓ lan'ny rohy mivantana. Satria amin'ny fomba mahazatra ny fahatsiarovana toy izany dia mandeha amin'ny VDS, ny vidin'ny fanofana izay tsy dia tafiditra loatra amin'ny teti-bolan'ny tetikasa avy amin'ny sokajy "tsy misy tokony hatao", ary avy amin'ny angon-drakitra loharano dia nanana VPS 400GB SSD aho, izay, na dia izaho aza. tiako, tsy afaka mametraka sary 1.5TB aho raha tsy misy famatrarana tsy misy fangarony dia hahomby izany.

Ary avy eo dia tsaroako fa raha mamafa ny junk ao amin'ny Google Drive aho, toy ny programa izay tsy mandeha afa-tsy amin'ny Windows XP, sy ny zavatra hafa izay nifindra avy amin'ny fitaovana iray mankany amin'ny iray hafa hatramin'ny andro izay tsy dia haingana loatra ny Internet tsy misy fetra ( Ohatra, ireo dikan-teny 10-20 amin'ny boaty virtoaly dia tsy misy dikany afa-tsy ny nostalgic), dia tokony hifanaraka tsara ny zava-drehetra. Efa vita. Ary noho izany, ny fanitsakitsahana ny fetran'ny isan'ny fangatahana amin'ny api (amin'ny fomba, ny fanohanana ara-teknika tsy misy olana dia nampitombo ny fetran'ny fangatahana isaky ny mpampiasa ho 100 ao anatin'ny 10 segondra), ny angon-drakitra dia nikoriana haingana tany amin'ny toerana fametrahana azy bebe kokoa. .

Toa tsara daholo ny zava-drehetra, saingy mila ampitaina amin'ny mpampiasa farany izany. Ankoatra izany, tsy misy redirect amin'ny loharano hafa, fa mba hanindry ny bokotra "Download" fotsiny ny olona iray ary lasa tompon'ny rakitra sarobidy.

Eto, Andriamanitra, dia niditra tao amin'ny karazana fahasahiranana rehetra aho. Tamin'ny voalohany dia script tao amin'ny AmPHP izy io, saingy tsy afa-po tamin'ny enta-mavesatra noforoniny aho (mitsambikina mafy amin'ny fanombohana mankany amin'ny fanjifana fototra 100%). Avy eo dia niditra ny curl wrapper ho an'ny ReactPHP, izay mifanentana amin'ny faniriako amin'ny resaka isan'ny tsingerin'ny CPU laniny, fa tsy nanome ny hafainganam-pandeha izay tiako (dia hita fa azonao atao ny mampihena ny elanelan'ny fiantsoana. curl_multi_select, fa avy eo dia manana tendan-kanina mitovy amin'ny safidy voalohany isika). Nanandrana nanoratra serivisy kely tao amin'ny Rust mihitsy aza aho, ary nandeha haingana be izany (tena mahagaga fa niasa izy io, raha ny fahalalako azy), saingy naniry bebe kokoa aho, ary sarotra ny manamboatra azy io. Ho fanampin'izay, ireo vahaolana rehetra ireo dia somary hafahafa ihany ny valinteny, ary tiako ny hanara-maso ny fotoana nifaranan'ny fampidinana rakitra tamin'ny marina indrindra.

Amin'ny ankapobeny, nivadika nandritra ny fotoana kelikely izy io, saingy nahomby. Mandra-pahatongan'ny andro iray dia nahazo hevitra iray izay niavaka tamin'ny hadalany aho: ny nginx, amin'ny teoria, dia afaka manao izay tiako, miasa haingana, ary mamela ny karazana fikorontanana rehetra miaraka amin'ny fanamafisana. Mila manandrana isika - ahoana raha mandaitra izany? Ary taorian'ny antsasaky ny andro nikarohana tsy tapaka dia teraka ny vahaolana iray izay niasa tsara nandritra ny volana maromaro ary nahafeno ny fepetra rehetra takiko.

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

Ny dikan-teny fohy tsy misy fanehoan-kevitra dia azo jerena eo ambanin'ny 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;
}

Manoratra script izahay hitantana izany fahasambarana rehetra izany

Ny ohatra dia ho amin'ny PHP ary iniana nosoratana miaraka amin'ny kitapo kely indrindra. Heveriko fa na iza na iza manana traikefa amin'ny fiteny hafa dia afaka mampiditra ity fizarana ity amin'ny fampiasana ny ohatra nasehoko.

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

vokatra

Amin'ny ankapobeny, ity fomba ity dia manamora ny fandaminana ny fizarana rakitra amin'ny mpampiasa avy amin'ny fitahirizana rahona. Eny, na dia avy amin'ny telegrama na VK, (raha toa ka tsy mihoatra ny haben'ny fitehirizana ity ny haben'ny rakitra). Nanana hevitra mitovy amin'izany aho izany, saingy indrisy fa sendra rakitra hatramin'ny 2GB aho, ary mbola tsy nahita fomba na maody ho an'ny fametahana valiny avy any ambony aho, ary ny fanoratana karazana fonosana ho an'ity tetikasa ity dia tsy dia misy dikany loatra.

Misaotra anao noho ny fifantohanao. Manantena aho fa ny tantarako dia farafaharatsiny mahaliana na mahasoa anao.

Source: www.habr.com

Add a comment