nginx ಬಳಸಿಕೊಂಡು Google ಡ್ರೈವ್‌ನಿಂದ ಫೈಲ್‌ಗಳನ್ನು ವಿತರಿಸಲಾಗುತ್ತಿದೆ

ಪೂರ್ವೇತಿಹಾಸದ

ನಾನು ಎಲ್ಲೋ 1.5 TB ಗಿಂತ ಹೆಚ್ಚಿನ ಡೇಟಾವನ್ನು ಸಂಗ್ರಹಿಸಬೇಕಾಗಿದೆ ಮತ್ತು ಸಾಮಾನ್ಯ ಬಳಕೆದಾರರಿಗೆ ನೇರ ಲಿಂಕ್ ಮೂಲಕ ಅದನ್ನು ಡೌನ್‌ಲೋಡ್ ಮಾಡುವ ಸಾಮರ್ಥ್ಯವನ್ನು ಸಹ ಒದಗಿಸಿದೆ. ಸಾಂಪ್ರದಾಯಿಕವಾಗಿ ಅಂತಹ ಮೆಮೊರಿಯ ಪ್ರಮಾಣವು ವಿಡಿಎಸ್‌ಗೆ ಹೋಗುವುದರಿಂದ, "ಮಾಡಲು ಏನೂ ಇಲ್ಲ" ವರ್ಗದಿಂದ ಪ್ರಾಜೆಕ್ಟ್ ಬಜೆಟ್‌ನಲ್ಲಿ ಹೆಚ್ಚು ಸೇರಿಸದ ಬಾಡಿಗೆ ವೆಚ್ಚ, ಮತ್ತು ಮೂಲ ಡೇಟಾದಿಂದ ನಾನು VPS 400GB SSD ಅನ್ನು ಹೊಂದಿದ್ದೇನೆ, ಅಲ್ಲಿ, ನಾನು ಸಹ ಬಯಸಿದ್ದರು, ನಷ್ಟವಿಲ್ಲದ ಸಂಕೋಚನವಿಲ್ಲದೆ ನಾನು 1.5TB ಚಿತ್ರಗಳನ್ನು ಹಾಕಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ ಅದು ಯಶಸ್ವಿಯಾಗುತ್ತದೆ.

ತದನಂತರ ನಾನು Google ಡ್ರೈವ್‌ನಿಂದ ಜಂಕ್ ಅನ್ನು ಅಳಿಸಿದರೆ, ವಿಂಡೋಸ್ XP ಯಲ್ಲಿ ಮಾತ್ರ ಕಾರ್ಯನಿರ್ವಹಿಸುವ ಪ್ರೋಗ್ರಾಂಗಳು ಮತ್ತು ಇಂಟರ್ನೆಟ್ ಅನಿಯಮಿತವಾಗಿ ಅಷ್ಟು ವೇಗವಾಗಿಲ್ಲದ ದಿನಗಳಿಂದ ಒಂದು ಸಾಧನದಿಂದ ಇನ್ನೊಂದಕ್ಕೆ ಚಲಿಸುತ್ತಿರುವ ಇತರ ವಿಷಯಗಳು ( ಉದಾಹರಣೆಗೆ, ವರ್ಚುವಲ್ ಬಾಕ್ಸ್‌ನ ಆ 10-20 ಆವೃತ್ತಿಗಳು ನಾಸ್ಟಾಲ್ಜಿಕ್ ಅನ್ನು ಹೊರತುಪಡಿಸಿ ಯಾವುದೇ ಮೌಲ್ಯವನ್ನು ಹೊಂದಿರುವುದಿಲ್ಲ), ನಂತರ ಎಲ್ಲವೂ ಚೆನ್ನಾಗಿ ಹೊಂದಿಕೊಳ್ಳಬೇಕು. ಬೇಗ ಹೇಳೋದು. ಆದ್ದರಿಂದ, ಎಪಿಐಗೆ ವಿನಂತಿಗಳ ಸಂಖ್ಯೆಯ ಮಿತಿಯನ್ನು ಭೇದಿಸಿ (ಯಾವುದೇ ಸಮಸ್ಯೆಗಳಿಲ್ಲದೆ ತಾಂತ್ರಿಕ ಬೆಂಬಲವು ಪ್ರತಿ ಬಳಕೆದಾರರಿಗೆ ವಿನಂತಿಗಳ ಕೋಟಾವನ್ನು 100 ಸೆಕೆಂಡುಗಳಲ್ಲಿ 10 ಕ್ಕೆ ಹೆಚ್ಚಿಸಿತು), ಡೇಟಾವು ಅದರ ಮುಂದಿನ ನಿಯೋಜನೆಯ ಸ್ಥಳಕ್ಕೆ ತ್ವರಿತವಾಗಿ ಹರಿಯಿತು. .

ಎಲ್ಲವೂ ಉತ್ತಮವಾಗಿದೆ ಎಂದು ತೋರುತ್ತದೆ, ಆದರೆ ಈಗ ಅದನ್ನು ಅಂತಿಮ ಬಳಕೆದಾರರಿಗೆ ತಿಳಿಸಬೇಕಾಗಿದೆ. ಇದಲ್ಲದೆ, ಇತರ ಸಂಪನ್ಮೂಲಗಳಿಗೆ ಯಾವುದೇ ಮರುನಿರ್ದೇಶನಗಳಿಲ್ಲದೆ, ಆದರೆ ಒಬ್ಬ ವ್ಯಕ್ತಿಯು "ಡೌನ್‌ಲೋಡ್" ಗುಂಡಿಯನ್ನು ಒತ್ತಿ ಮತ್ತು ಅಮೂಲ್ಯವಾದ ಫೈಲ್‌ನ ಸಂತೋಷದ ಮಾಲೀಕರಾಗುತ್ತಾನೆ.

ಇಲ್ಲಿ, ದೇವರಿಂದ, ನಾನು ಎಲ್ಲಾ ರೀತಿಯ ತೊಂದರೆಗಳಿಗೆ ಹೋದೆ. ಮೊದಲಿಗೆ ಇದು AmPHP ಯಲ್ಲಿನ ಸ್ಕ್ರಿಪ್ಟ್ ಆಗಿತ್ತು, ಆದರೆ ಅದು ರಚಿಸಿದ ಲೋಡ್‌ನಿಂದ ನಾನು ತೃಪ್ತನಾಗಲಿಲ್ಲ (ಆರಂಭದಲ್ಲಿ 100% ಕೋರ್ ಬಳಕೆಗೆ ತೀಕ್ಷ್ಣವಾದ ಜಿಗಿತ). ನಂತರ ReactPHP ಗಾಗಿ ಕರ್ಲ್ ಹೊದಿಕೆಯು ಕಾರ್ಯರೂಪಕ್ಕೆ ಬಂದಿತು, ಇದು ಸೇವಿಸಿದ CPU ಚಕ್ರಗಳ ಸಂಖ್ಯೆಯ ವಿಷಯದಲ್ಲಿ ನನ್ನ ಇಚ್ಛೆಗೆ ಸರಿಹೊಂದುತ್ತದೆ, ಆದರೆ ನಾನು ಬಯಸಿದ ವೇಗವನ್ನು ನೀಡಲಿಲ್ಲ (ನೀವು ಕರೆ ಮಾಡುವ ಮಧ್ಯಂತರವನ್ನು ಕಡಿಮೆ ಮಾಡಬಹುದು ಎಂದು ಅದು ಬದಲಾಯಿತು. 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 ಯಿಂದಲೂ ಸಹ, (ಫೈಲ್ ಗಾತ್ರವು ಈ ಸಂಗ್ರಹಣೆಯ ಅನುಮತಿಸುವ ಗಾತ್ರವನ್ನು ಮೀರುವುದಿಲ್ಲ ಎಂದು ಒದಗಿಸಲಾಗಿದೆ). ನನಗೆ ಇದೇ ರೀತಿಯ ಕಲ್ಪನೆ ಇತ್ತು ಇದು, ಆದರೆ ದುರದೃಷ್ಟವಶಾತ್ ನಾನು 2GB ವರೆಗಿನ ಫೈಲ್‌ಗಳನ್ನು ನೋಡುತ್ತೇನೆ ಮತ್ತು ಅಪ್‌ಸ್ಟ್ರೀಮ್‌ನಿಂದ ಪ್ರತಿಕ್ರಿಯೆಗಳನ್ನು ಅಂಟಿಸುವ ವಿಧಾನ ಅಥವಾ ಮಾಡ್ಯೂಲ್ ಅನ್ನು ನಾನು ಇನ್ನೂ ಕಂಡುಕೊಂಡಿಲ್ಲ ಮತ್ತು ಈ ಯೋಜನೆಗಾಗಿ ಕೆಲವು ರೀತಿಯ ಹೊದಿಕೆಗಳನ್ನು ಬರೆಯುವುದು ಅಸಮಂಜಸವಾಗಿ ಶ್ರಮದಾಯಕವಾಗಿದೆ.

ನಿಮ್ಮ ಗಮನಕ್ಕೆ ಧನ್ಯವಾದಗಳು. ನನ್ನ ಕಥೆಯು ನಿಮಗೆ ಸ್ವಲ್ಪ ಆಸಕ್ತಿದಾಯಕ ಅಥವಾ ಉಪಯುಕ್ತವಾಗಿದೆ ಎಂದು ನಾನು ಭಾವಿಸುತ್ತೇನೆ.

ಮೂಲ: www.habr.com

ಕಾಮೆಂಟ್ ಅನ್ನು ಸೇರಿಸಿ