דיסטריביוטינג טעקעס פֿון Google דרייוו ניצן nginx

פּרעהיסטאָרי

עס פּונקט אַזוי געטראפן אַז איך דארף צו קראָם מער ווי 1.5 טב פון דאַטן ערגעץ, און אויך צושטעלן די פיייקייט פֿאַר פּראָסט ניצערס צו אָפּלאָדירן עס דורך אַ דירעקט לינק. זינט טראַדישאַנאַלי אַזאַ אַמאַונץ פון זכּרון גיין צו VDS, די פּרייַז פון רענטינג וואָס איז נישט זייער פיל אַרייַנגערעכנט אין די פּרויעקט בודזשעט פון די "גאָרנישט צו טאָן" קאַטעגאָריע, און פֿון די מקור דאַטן איך געהאט אַ VPS 400GB SSD, ווו אפילו אויב איך. געוואלט, איך קען נישט שטעלן 1.5 טב פון בילדער אָן לאָססלעסס קאַמפּרעשאַן עס וועט זיין געראָטן.

און דעמאָלט איך געדענקט אַז אויב איך ויסמעקן אָפּפאַל פון Google דרייוו, ווי מגילה וואָס וועט לויפן בלויז אויף Windows XP, און אנדערע זאכן וואָס זענען אריבערגעפארן פון איין מיטל צו אנדערן זינט די טעג ווען די אינטערנעט איז נישט אַזוי שנעל אין אַלע ניט אַנלימאַטאַד ( פֿאַר בייַשפּיל, די 10-20 ווערסיעס פון די ווירטואַל קעסטל זענען אַנלייקלי צו האָבן קיין ווערט אנדערע ווי בענקשאַפט), און אַלץ זאָל פּאַסיק זייער גוט. ניט גיכער געזאגט ווי געשען. און אַזוי, ברייקינג די לימיט פון די נומער פון ריקוועס צו די אַפּי (אגב, טעכניש שטיצן אָן קיין פראבלעמען געוואקסן די קוואָטע פון ​​ריקוועס פּער באַניצער צו 100 אין 10 סעקונדעס), די דאַטן געשווינד פלאָוד צו דער אָרט פון זיין ווייַטער דיפּלוימאַנט .

אַלץ מיינט צו זיין גוט, אָבער איצט עס דאַרף זיין קאַנווייד צו די סוף באַניצער. דערצו, אָן קיין רידערעקץ צו אנדערע רעסורסן, אָבער אַזוי אַז אַ מענטש פשוט דריקן די "Download" קנעפּל און ווערן דער צופרידן באַזיצער פון די טרעזשערד טעקע.

דא בין איך, ברוך־השם, אַרײַן אין אַלע סאָרץ צרות. אין ערשטער עס איז געווען אַ שריפט אין AmPHP, אָבער איך איז נישט צופֿרידן מיט די מאַסע עס באשאפן (אַ שאַרף שפּרינגען אין די אָנהייב צו 100% האַרץ קאַנסאַמשאַן). דערנאָך די קערל ראַפּער פֿאַר ReactPHP געקומען אין שפּיל, וואָס גאַנץ פּאַסיק אין מיין וויל אין טערמינען פון די נומער פון קפּו סייקאַלז קאַנסומד, אָבער האט נישט געבן די גיכקייַט אין אַלע וואָס איך געוואלט (עס פארקערט אויס אַז איר קענען פשוט רעדוצירן די מעהאַלעך פון רופן curl_multi_select, אָבער דעמאָלט מיר האָבן אַ גלאַטאַני ענלעך צו דער ערשטער אָפּציע). איך אפילו געפרוווט צו שרייַבן אַ קליין דינסט אין רוסט, און עס געארבעט גאַנץ געשווינד (עס איז חידוש אַז עס געארבעט, געגעבן מיין וויסן), אָבער איך געוואלט מער, און עס איז עפעס שווער צו קאַסטאַמייז עס. אין אַדישאַן, אַלע די סאַלושאַנז עפעס סטריינדזשלי באַפערד די ענטפער, און איך געוואלט צו שפּור דעם מאָמענט ווען די טעקע אראפקאפיע איז געענדיקט מיט די גרעסטע אַקיעראַסי.

אין אַלגעמיין, עס איז געווען קרום פֿאַר אַ בשעת, אָבער עס געארבעט. ביז איך בין איין טאג אויפגעקומען מיט א געדאנק וואס איז געווען מערקווירדיק אין זיין משוגעת: 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 און דיליבראַטלי געשריבן מיט אַ מינימום פון קיט. איך טראַכטן ווער עס יז וואס האט דערפאַרונג מיט קיין אנדערע שפּראַך וועט קענען צו ויסשטימען דעם אָפּטיילונג מיט מיין בייַשפּיל.

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

לייגן אַ באַמערקונג