Na-ekesa faịlụ site na Google Drive site na iji nginx

prehistory

Ọ mere na achọrọ m ịchekwa data karịrị 1.5 TB ebe, ma nyekwa ikike maka ndị ọrụ nkịtị ibudata ya site na njikọ ozugbo. Ebe ọ bụ na ọdịnala dị otú ahụ nke ebe nchekwa na-aga na VDS, ọnụ ahịa ịgbazinye ego nke na-adịghị etinye aka na mmefu ego nke ọrụ site na ụdị "ọ dịghị ihe a ga-eme", na site na isi iyi data m nwere VPS 400GB SSD, ebe, ọ bụrụgodị na m. Achọrọ m, enweghị m ike itinye 1.5TB onyonyo na-enweghị mkpakọ na-enweghị atụ ọ ga-aga nke ọma.

Ma mgbe ahụ, m chetara na ọ bụrụ na m ihichapụ junk na Google mbanye, dị ka mmemme nke ga-na-agba ọsọ na Windows XP, na ihe ndị ọzọ na-akpụ akpụ site na otu ngwaọrụ ọzọ kemgbe ụbọchị mgbe Internet na-adịghị ngwa ngwa ma ọlị na-akparaghị ókè ( dịka ọmụmaatụ, ụdị 10-20 ndị ahụ nke igbe mebere enweghị ike inwe uru ọ bụla karịa enweghị mmasị), yabụ ihe niile kwesịrị dabara nke ọma. Ekwughi ekwu bụ emeghị eme. Ya mere, na-agbaji site na njedebe na ọnụ ọgụgụ nke arịrịọ API (n'agbanyeghị, nkwado teknụzụ na-enweghị nsogbu ọ bụla mụbara oke nke arịrịọ maka onye ọrụ na 100 na 10 sekọnd), data ahụ gbagara ngwa ngwa n'ebe a na-ebuga ya n'ihu. .

Ihe niile yiri ka ọ dị mma, ma ugbu a ọ dị mkpa ka ebufe ya na onye ọrụ njedebe. Ọzọkwa, na-enweghị ihe ọ bụla redirects na ihe ndị ọzọ, ma ka mmadụ wee pịa bọtịnụ "Download" wee bụrụ onye nwe obi ụtọ nke faịlụ ahụ dị oké ọnụ ahịa.

Ebe a, site na Chineke, agara m n'ụdị nsogbu niile. Na mbụ ọ bụ edemede na AmPHP, mana enweghị m afọ ojuju na ibu o kere (mwụ elu dị nkọ na mbido 100% isi oriri). Mgbe ahụ, ihe mkpuchi curl maka ReactPHP batara, nke dabara n'ọchịchọ m n'ihe gbasara ọnụọgụ nke usoro CPU riri, mana enyeghị ọsọ ọsọ na ihe m chọrọ (ọ tụgharịrị na ị nwere ike belata oge ịkpọ oku. curl_multi_select, mana mgbe ahụ anyị nwere iri nri yiri nke mbụ). Ọbụna m gbalịrị ide obere ọrụ na Rust, ọ na-arụkwa ọrụ ngwa ngwa (ọ bụ ihe ijuanya na ọ na-arụ ọrụ, nyere m ihe ọmụma), ma achọrọ m karịa, ọ na-esikwa ike ịhazi ya. Na mgbakwunye, azịza ndị a niile n'ụzọ dị ịtụnanya wepụrụ nzaghachi ahụ, achọrọ m ịgbaso oge mgbe nbudata faịlụ ahụ kwụsịrị n'ụzọ ziri ezi.

N'ozuzu, ọ gbagọrọ agbagọ ruo oge ụfọdụ, ma ọ na-arụ ọrụ. Ruo otu ụbọchị, enwere m echiche dị ịrịba ama na ara ya: nginx, na tiori, nwere ike ime ihe m chọrọ, na-arụ ọrụ ngwa ngwa, na ọbụna kwe ka ụdị ọ bụla nke mgbagwoju anya na nhazi. Anyị ga-agbalị - gịnị ma ọ bụrụ na ọ na-arụ ọrụ? Ma mgbe ọkara ụbọchị nke nyocha na-adịgide adịgide gasịrị, a mụrụ ngwọta nke na-arụ ọrụ nke ọma ruo ọtụtụ ọnwa ma zute ihe niile m chọrọ.

Ịtọlite ​​​​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;
}

Enwere ike ịhụ ụdị dị mkpirikpi na-enweghị nkọwa n'okpuru onye na-emebi ihe

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

Anyị na-ede edemede iji jikwaa obi ụtọ a niile

Ọmụmaatụ ga-adị na PHP ma kpachaara anya were obere ngwa dee ya. Echere m na onye ọ bụla nwere ahụmahụ n'asụsụ ọ bụla ọzọ ga-enwe ike iji ihe atụ m tinye akụkụ a.

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

Nsonaazụ

N'ozuzu, usoro a na-eme ka ọ dị mfe ịhazi nkesa faịlụ na ndị ọrụ site na nchekwa igwe ojii ọ bụla. Ee, ọbụlagodi site na telegram ma ọ bụ VK, (ọ bụrụhaala na nha faịlụ agaghị agafe oke ikike nke nchekwa a). Enwere m echiche yiri ya nke a, ma ọ dị mwute ikwu na m na-ahụ faịlụ ruo 2GB, na achọtabeghị m usoro ma ọ bụ modul maka gluing nzaghachi si n'elu, na ide ụfọdụ ụdị wrappers maka oru ngo a na-enweghị ezi uche na-arụsi ọrụ ike.

Daalụ maka itinye uche gị. Enwere m olileanya na akụkọ m ma ọ dịkarịa ala na-adọrọ mmasị ma ọ bụ bara uru nye gị.

isi: www.habr.com

Tinye a comment