Files distribuendi ex Google Coegi utendo nginx

erectus

Ita factum est ut plus quam 1.5 TB notitiarum alicubi condere debeam, et facultatem etiam pro communibus usoribus praebere ut per directum nexum id extrahat. Cum traditionaliter tantae memoriae copiae ad VDS veniant, sumptus conductionis non valde inclusus est in praevisione proiectionis ex categoria "nihil ad", et ex fonte data VPS 400GB SSD habui, ubi, etsi ego volui, non potui 1.5TB imaginum ponere sine compressione incorrupta quae succedet.

Et tunc recordatus sum si junk de Google Coegi delere, sicut programmata quae in Fenestra XP tantum currunt, et alia quae ab uno artificio in alium mota sunt ex diebus cum interreti tam celeriter omnino non illimitata fuit (. exempli gratia, illae versiones 10-20 de capsula virtualis abhorret aliquem valorem habere praeter nostalgicum), tunc omnia optime convenire debent. Dictum factum quam cito. Itaque perrumpens limitem numero petitionum ad api (per viam, subsidia technica sine ullis quaestionibus aucta numerum petitionum per user ad 100 in 10 secundis), notitia cito profluebat ad locum ulterioris instituti. .

Omnia bona esse videntur, nunc ad finem usum deferri oportet. Praeterea, sine ullis neclitatibus ad ceteras facultates, sed ita ut persona simpliciter premere puga "download" et felix fit possessor limae thesauri.

Hic, Deo, in omnes molestias ingressus sum. Scriptum in AmPHP primo fuit, sed onere quod creatum est contentus eram (acutus Salire in initio ad C% nucleum consumptionem). Tunc fascia Crispi ReactPHP in fabula venit, quae bene convenit in vota mea secundum numerum cyclorum CPU consumptorum, sed celeritatem omnino non dedit quod volebam (contigit quod simpliciter vocationis intervallum minuere potes. curl_multi_select, sed tunc habemus gulam similes optioni primae). Etiam parva opera in Rust scribere conatus sum, et satis cito laboravit (mirum est quod operatus est, et scientiam meam dedit), sed plura volui, et quodam modo difficile erat illud consuescere. Praeterea omnes hae solutiones responsum nescio quo modo mihi obiecerunt, et indagare volui momentum quo tabella download accuratissime finita est.

Fere prava ad tempus, sed elaboraret. Donec quadam die accessi cum notione, quae in eius amentia notabilis erat: nginx, in theoria, potest facere quod volo, celeriter operare, et etiam permittere varias perversiones cum configuratione. Experiri debemus - quid si operatur? Et post dimidium diem inquisitionis assiduae, solutio nata est quae per aliquot menses stabiliter laboraverat, et omnibus meis requisitis occurrit.

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

Brevis versio sine glossa videri potest sub vastatore

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

Scribimus scriptum ut omnem hanc felicitatem administrare

Exemplum erit in PHP et de industria minimum ornamentum scriptum. Puto aliquem, qui cum quavis alia lingua expertus est, exemplo meo hanc sectionem integrare poterit.

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

results

In genere, haec methodus satis facilem facit ut distributio lima utentium ab aliqua nube repono. Immo, vel ex telegrapho vel VK, (dummodo magnitudo tabellae magnitudinem licitam huius repono non excedat). Ideam similem haec, sed valde dolendum venio fasciculi ad 2GB, et nondum inveni rationem vel moduli ad conglutinanda responsa ex adverso flumine, et scribens quaedam involucra huius consilii sine ratione laboris intensiva.

Tibi gratias ago pro attente. Spero fabulam meam tibi saltem parum interesting vel utilis fuit.

Source: www.habr.com