Ka hāʻawi ʻana i nā faila mai Google Drive me ka hoʻohana ʻana i ka nginx

prehistory

ʻO ia wale nō ka mea pono iaʻu e mālama i nā ʻikepili ʻoi aku ma mua o 1.5 TB ma kahi, a hāʻawi pū i ka hiki i nā mea hoʻohana maʻamau ke hoʻoiho iā ia ma o kahi loulou pololei. No ka mea maʻamau ka nui o ka hoʻomanaʻo e hele i VDS, ʻo ke kumukūʻai o ka hoʻolimalima ʻana ʻaʻole i hoʻokomo nui ʻia i ka waihona kālā o ka papahana mai ka ʻāpana "ʻaʻohe mea e hana", a mai ka ʻikepili kumu i loaʻa iaʻu kahi VPS 400GB SSD, kahi, ʻoiai inā wau. makemake, ʻaʻole hiki iaʻu ke kau i ka 1.5TB o nā kiʻi me ka ʻole o ka hoʻoemi ʻole ʻia e kūleʻa.

A laila, hoʻomanaʻo wau inā e holoi wau i ka ʻōpala mai Google Drive, e like me nā polokalamu e holo wale ana ma Windows XP, a me nā mea ʻē aʻe e neʻe nei mai kahi ʻaoʻao a i kekahi mai nā lā i wikiwiki ʻole ai ka Internet ʻaʻole palena ʻole ( no ka laʻana, ʻaʻole i loaʻa i kēlā mau ʻano 10-20 o ka pahu virtual kahi waiwai ʻē aʻe ma mua o ka nostalgic), a laila pono nā mea āpau. ʻAʻole i ʻōlelo koke ʻia. A no laila, ka uhaki ʻana i ka palena o ka helu o nā noi i ka api (ma ke ala, kākoʻo ʻenehana me ka ʻole o nā pilikia i hoʻonui i ka quota o nā noi i kēlā me kēia mea hoʻohana i 100 i 10 kekona), ua kahe koke ka ʻikepili i kahi o kāna hoʻolaha hou. .

Ua maikaʻi nā mea a pau, akā i kēia manawa pono e lawe ʻia i ka mea hoʻohana hope. Eia kekahi, me ka ʻole o ka hoʻihoʻi ʻana i nā kumuwaiwai ʻē aʻe, akā no laila e kaomi wale ke kanaka i ke pihi "Download" a lilo i mea hauʻoli o ka faila waiwai.

Maanei, na ke Akua, ua komo au i na pilikia a pau. I ka wā mua he palapala ia ma AmPHP, akā ʻaʻole au i ʻoluʻolu i ka ukana i hana ʻia (kahi lele ʻoi i ka hoʻomaka ʻana i ka 100% ʻai kumu). A laila ua pāʻani ka curl wrapper no ReactPHP, i kūpono i kaʻu mau makemake e pili ana i ka nui o nā pōʻai CPU i pau, akā ʻaʻole i hāʻawi i ka wikiwiki i ka mea aʻu i makemake ai (ua ʻike ʻia hiki iā ʻoe ke hōʻemi i ka wā o ke kāhea ʻana. curl_multi_select, akā, loaʻa iā mākou ka palaualelo e like me ka koho mua). Ua ho'āʻo wau e kākau i kahi lawelawe liʻiliʻi ma Rust, a ua hana wikiwiki ia (he mea kupanaha no ka hana ʻana, hāʻawi ʻia i koʻu ʻike), akā makemake wau i nā mea hou aʻe, a he mea paʻakikī ke hoʻopilikino. Eia kekahi, ʻo kēia mau hoʻonā āpau i hoʻokaʻawale i ka pane, a makemake wau e hahai i ka manawa i pau ai ka hoʻoiho ʻana i ka faila me ka pololei loa.

Ma keʻano laulā, ua kekee no kekahi manawa, akā ua hana. A hiki i kekahi lā ua loaʻa iaʻu kahi manaʻo kupaianaha i kona pupule: ʻo nginx, ma ke kumumanaʻo, hiki ke hana i kaʻu makemake, hana wikiwiki, a ʻae i nā ʻano perversions āpau me ka hoʻonohonoho. Pono mākou e hoʻāʻo - pehea inā hana? A ma hope o ka hapalua lā o ka ʻimi hoʻomau, ua hānau ʻia kahi hopena e hana mau ana no kekahi mau mahina a ua hoʻokō i kaʻu mau koi āpau.

Hoʻonohonoho i ka 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;
}

Hiki ke ʻike ʻia kahi ʻano pōkole me ka ʻole o nā manaʻo ma lalo o ka mea hao

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

Ke kākau nei mākou i palapala e hoʻokele i kēia hauʻoli

Aia ka laʻana ma PHP a kākau ʻia me ka liʻiliʻi o ka pahu. Manaʻo wau e hiki i ka poʻe i ʻike i kekahi ʻōlelo ʻē aʻe ke hoʻohui i kēia ʻāpana me ka hoʻohana ʻana i kaʻu laʻana.

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

Nā hopena

Ma keʻano laulā, ua maʻalahi kēia ʻano hana i ka hoʻonohonoho ʻana i ka hāʻawi ʻana i nā faila i nā mea hoʻohana mai kahi waihona kapuaʻi. ʻAe, mai ke telegram a i ʻole VK, (inā ʻaʻole i ʻoi aku ka nui o ka faila ma mua o ka nui i ʻae ʻia o kēia waihona). Ua like koʻu manaʻo kēia, akā naʻe, ʻike wau i nā faila a hiki i ka 2GB, a ʻaʻole i loaʻa iaʻu kahi ʻano a i ʻole module no ka hoʻopili ʻana i nā pane mai ka upstream, a ʻo ke kākau ʻana i kekahi ʻano o nā mea wīwī no kēia pāhana, he hana koʻikoʻi ia.

Mahalo no kou noonoo. Manaʻo wau he mea hoihoi paha kaʻu moʻolelo iā ʻoe.

Source: www.habr.com

Pākuʻi i ka manaʻo hoʻopuka