Nyebarkeun file tina Google Drive nganggo nginx

prasajarah

Ieu ngan jadi kajadian nu kuring diperlukeun pikeun nyimpen leuwih ti 1.5 TB data wae, sarta ogé nyadiakeun kamampuhan pikeun pamaké biasa pikeun ngundeur éta via link langsung. Kusabab sacara tradisional jumlah mémori sapertos kitu ka VDS, biaya nyéwa anu henteu kalebet pisan dina anggaran proyék tina kategori "teu aya anu kedah dilakukeun", sareng tina sumber data kuring ngagaduhan VPS 400GB SSD, dimana, sanaos kuring. hayang, Abdi teu bisa nempatkeun 1.5TB gambar tanpa komprési lossless bakal sukses.

Teras kuring émut yén upami kuring ngahapus sampah tina Google Drive, sapertos program anu ngan ukur bakal dijalankeun dina Windows XP, sareng hal-hal sanés anu parantos ngalih ti hiji alat ka alat anu sanés ti saprak jaman Internét henteu gancang pisan henteu aya watesna ( contona, eta 10-20 versi tina kotak virtual éta saperti teu mirip boga nilai nu mana wae nu lian ti nostalgia), lajeng sagalana kedah cocog kacida alusna. Geuwat dikerjakeun saatos dicarioskeun. Ku kituna, megatkeun ngaliwatan wates dina jumlah requests ka api (ku jalan kitu, rojongan teknis tanpa masalah ngaronjat kuota requests per pamaké pikeun 100 dina 10 detik), data gancang ngalir ka tempat deployment salajengna. .

Sagalana sigana alus, tapi ayeuna perlu nepikeun ka pamaké tungtung. Sumawona, tanpa alihan ka sumber anu sanés, tapi ku kituna hiji jalma ngan saukur mencét tombol "Unduh" sareng janten pamilik anu bagja tina file anu berharga.

Di dieu, ku Gusti, abdi nuju kana sagala sorts troubles. Mimitina éta naskah dina AmPHP, tapi kuring teu wareg jeung beban eta dijieun (luncat seukeut dina mimiti 100% konsumsi inti). Lajeng wrapper curl pikeun ReactPHP sumping kana antrian, nu rada pas kana kahayang kuring dina watesan jumlah siklus CPU dikonsumsi, tapi teu masihan speed pisan naon kuring hayang (tétéla yén anjeun ngan saukur bisa ngurangan interval nelepon. curl_multi_select, tapi lajeng urang boga gluttony sarupa pilihan kahiji). Kuring malah diusahakeun nulis layanan leutik di Rust, sarta gawéna rada gancang (éta héran yén éta digawé, masihan pangaweruh kuring), tapi kuring hayang leuwih, tur éta kumaha bae age pikeun ngaropea eta. Sajaba ti éta, sagala solusi ieu kumaha bae aneh buffered respon, sarta kuring hayang lagu momen nalika file download réngsé kalawan akurasi greatest.

Sacara umum, éta bengkung bari, tapi digawé. Nepi ka hiji poé kuring datang nepi ka hiji gagasan anu luar biasa dina crazyness na: nginx, dina tiori, bisa ngalakukeun naon Abdi hoyong, dianggo gancang, komo ngidinan sagala sorts perversions kalawan konfigurasi. Urang kedah nyobian - kumaha upami éta tiasa dianggo? Sareng saatos satengah dinten milarian pengkuh, lahir solusi anu parantos damel stabil salami sababaraha bulan sareng nyumponan sadaya syarat kuring.

Nyetél 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;
}

Versi pondok tanpa komentar tiasa ditingali dina 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;
}

Urang nulis naskah pikeun ngatur sakabéh kabagjaan ieu

Contona bakal di PHP jeung ngahaja ditulis kalawan minimum kit. Jigana saha waé anu gaduh pangalaman sareng basa anu sanés bakal tiasa ngahijikeun bagian ieu nganggo conto kuring.

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

hasil

Sacara umum, metoda ieu ngagampangkeun pikeun ngatur distribusi file ka pangguna tina panyimpenan awan. Leres, bahkan tina telegram atanapi VK, (sayogi ukuran file henteu langkung ageung tina ukuran anu diidinan pikeun neundeun ieu). Kuring kungsi hiji gagasan sarupa ieu, Tapi hanjakalna kuring datang di sakuliah file nepi ka 2GB, sarta kuring teu acan kapanggih metoda atawa modul pikeun gluing réspon ti hulu, jeung nulis sababaraha jenis wrappers pikeun proyék ieu unreasonably kuli-intensif.

Nuhun kana perhatosanana. Kuring miharep carita kuring éta sahenteuna saeutik metot atawa mangpaat pikeun anjeun.

sumber: www.habr.com

Tambahkeun komentar