Паҳн кардани файлҳо аз Google Drive бо истифода аз nginx

prehistory

Ҳамин тавр шуд, ки ба ман лозим буд, ки зиёда аз 1.5 ТБ маълумотро дар ҷое нигоҳ дошта бошам ва инчунин ба корбарони оддӣ имкони зеркашӣ кардани онро тавассути истиноди мустақим таъмин кунам. Азбаски маъмулан чунин миқдори хотира ба VDS мегузарад, ки арзиши иҷораи он ба буҷаи лоиҳа аз категорияи "ҳеҷ коре кардан лозим нест" чандон зиёд нест ва аз рӯи маълумоти манбаъ ман VPS 400GB SSD доштам, ки ҳатто дар он ҷо ҳатто агар ман мехостам, ман 1.5 ТБ тасвирҳоро бе фишурдани бе талаф гузошта наметавонистам, он муваффақ мешавад.

Ва он гоҳ ман ба ёд овардам, ки агар ман партовҳоро аз Google Drive нест кунам, ба монанди барномаҳое, ки танҳо дар Windows XP кор мекунанд ва чизҳои дигаре, ки аз як дастгоҳ ба дастгоҳи дигар аз замоне, ки Интернет он қадар тез набуд, бемаҳдуд набуд ( масалан, он 10-20 версияи қуттии виртуалӣ гумон буд, ки ба ғайр аз ностальгӣ арзише дошта бошанд), пас ҳама чиз бояд хеле хуб мувофиқат кунад. Ҳанӯз ногуфта иҷро шуд. Ҳамин тариқ, шикастани маҳдудияти шумораи дархостҳо ба api (дар омади гап, дастгирии техникӣ бидуни мушкилот квотаи дархостҳо барои як корбарро дар 100 сония ба 10 афзоиш дод), маълумот зуд ба макони ҷойгиркунии минбаъдаи он ворид шуд. .

Ба назар чунин мерасад, ки ҳама чиз хуб аст, аммо ҳоло онро ба корбари ниҳоӣ расонидан лозим аст. Гузашта аз ин, бе ягон масир ба дигар захираҳо, аммо ба тавре ки шахс танҳо тугмаи "Зеркашӣ" -ро пахш мекунад ва соҳиби хушбахти файли хазинадор мегардад.

Дар ин ҷо, ба Худо қасам, ба ҳар гуна душворӣ дучор шудам. Дар аввал ин як скрипт дар AmPHP буд, аммо ман аз сарбории он қаноатманд набудам (ҷаҳидаи якбора дар оғоз ба 100% истеъмоли аслӣ). Пас аз он папкаи curl барои ReactPHP ба кор даромад, ки он аз рӯи шумораи давраҳои 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;
}

Варианти кӯтоҳи бидуни шарҳро дар зери спойлер дидан мумкин аст

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

Натиҷаҳо

Умуман, ин усул ташкили тақсимоти файлҳоро ба корбарон аз ҳама гуна анбори абрӣ хеле осон мекунад. Бале, ҳатто аз telegram ё VK, (ба шарте, ки андозаи файл аз андозаи иҷозатдодаи ин нигаҳдорӣ зиёд набошад). Ман як идеяи монанд доштам ин, аммо мутаассифона ман бо файлҳои то 2 ГБ рӯбарӯ мешавам ва ман то ҳол усул ё модули часпак кардани посухҳоро аз боло наёфтаам ва навиштани як навъ бастабандӣ барои ин лоиҳа беасос меҳнатталаб аст.

Ба диққататон ташаккур. Ман умедворам, ки ҳикояи ман ҳадди аққал барои шумо ҷолиб ё муфид буд.

Манбаъ: will.com

Илова Эзоҳ