ื”ืคืฆืช ืงื‘ืฆื™ื ืž-Google Drive ื‘ืืžืฆืขื•ืช nginx

ืคืจื”ื™ืกื˜ื•ืจื™ื”

ืงืจื” ืฉื”ื™ื™ืชื™ ืฆืจื™ืš ืœืื—ืกืŸ ื™ื•ืชืจ ืž-1.5 TB ืฉืœ ื ืชื•ื ื™ื ืื™ืคืฉื”ื•, ื•ื’ื ืœืกืคืง ืืช ื”ื™ื›ื•ืœืช ืœืžืฉืชืžืฉื™ื ืจื’ื™ืœื™ื ืœื”ื•ืจื™ื“ ืื•ืชื ื“ืจืš ืงื™ืฉื•ืจ ื™ืฉื™ืจ. ืžื›ื™ื•ื•ืŸ ืฉื‘ืื•ืคืŸ ืžืกื•ืจืชื™ ื›ืžื•ื™ื•ืช ื›ืืœื” ืฉืœ ื–ื™ื›ืจื•ืŸ ืขื•ื‘ืจื•ืช ืœ-VDS, ืขืœื•ืช ื”ื”ืฉื›ืจื” ืฉืื™ื ื” ื›ืœื•ืœื” ื‘ืชืงืฆื™ื‘ ื”ืคืจื•ื™ืงื˜ ืžืงื˜ื’ื•ืจื™ื™ืช "ืื™ืŸ ืžื” ืœืขืฉื•ืช", ื•ืžื ืชื•ื ื™ ื”ืžืงื•ืจ ื”ื™ื” ืœื™ VPS 400GB SSD, ืฉื‘ื•, ื’ื ืื ืื ื™ ืจืฆื™ืชื™, ืœื ื™ื›ื•ืœืชื™ ืœืฉื™ื 1.5TB ืฉืœ ืชืžื•ื ื•ืช ื‘ืœื™ ื“ื—ื™ืกื” ืœืœื ืื•ื‘ื“ืŸ ื–ื” ื™ืฆืœื™ื—.

ื•ืื– ื ื–ื›ืจืชื™ ืฉืื ืื ื™ ืžื•ื—ืง ื–ื‘ืœ ืžื’ื•ื’ืœ ื“ืจื™ื™ื‘, ื›ืžื• ืชื•ื›ื ื™ื•ืช ืฉื™ืจื•ืฆื• ืจืง ื‘-Windows XP, ื•ืขื•ื“ ื“ื‘ืจื™ื ืฉืขื•ื‘ืจื™ื ืžืžื›ืฉื™ืจ ืื—ื“ ืœืžืฉื ื”ื• ืžืื– ื”ื™ืžื™ื ืฉื‘ื”ื ื”ืื™ื ื˜ืจื ื˜ ืœื ื”ื™ื” ื›ืœ ื›ืš ืžื”ื™ืจ ื‘ื›ืœืœ ืœื ื‘ืœืชื™ ืžื•ื’ื‘ืœ ( ืœื“ื•ื’ืžื”, ืœื ื”ื™ื” ืกื‘ื™ืจ ืฉ-10-20 ื”ื’ืจืกืื•ืช ื”ืœืœื• ืฉืœ ื”ืงื•ืคืกื” ื”ื•ื™ืจื˜ื•ืืœื™ืช ื™ื”ื™ื• ื‘ืขืœื™ ืขืจืš ืื—ืจ ืžืœื‘ื“ ื ื•ืกื˜ืœื’ื™ื”), ืื– ื”ื›ืœ ืืžื•ืจ ืœื”ืชืื™ื ื”ื™ื˜ื‘. ืœื ืžื•ืงื“ื ื™ื•ืชืจ ืžืืฉืจ ื ืขืฉื”. ื•ื›ืš, ืชื•ืš ืคืจื™ืฆืช ืžื’ื‘ืœืช ืžืกืคืจ ื”ื‘ืงืฉื•ืช ืœ-API (ืื’ื‘, ืชืžื™ื›ื” ื˜ื›ื ื™ืช ืœืœื ื‘ืขื™ื•ืช ื”ื’ื“ื™ืœื” ืืช ืžื›ืกืช ื”ื‘ืงืฉื•ืช ืœืžืฉืชืžืฉ ืœ-100 ืชื•ืš 10 ืฉื ื™ื•ืช), ื”ื ืชื•ื ื™ื ื–ืจืžื• ื‘ืžื”ื™ืจื•ืช ืœืžืงื•ื ื”ืคืจื™ืกื” ื”ื ื•ืกืคืช ืฉืœื•. .

ื”ื›ืœ ื ืจืื” ื˜ื•ื‘, ืื‘ืœ ืขื›ืฉื™ื• ืฆืจื™ืš ืœื”ืขื‘ื™ืจ ืืช ื–ื” ืœืžืฉืชืžืฉ ื”ืงืฆื”. ื™ืชืจ ืขืœ ื›ืŸ, ืœืœื ื›ืœ ื”ืคื ื™ื•ืช ืœืžืฉืื‘ื™ื ืื—ืจื™ื, ืืœื ื›ืš ืฉืื“ื ืคืฉื•ื˜ ืœื•ื—ืฅ ืขืœ ื›ืคืชื•ืจ "ื”ื•ืจื“" ื•ื”ื•ืคืš ืœื‘ืขืœื™ื ื”ืžืื•ืฉืจ ืฉืœ ื”ืงื•ื‘ืฅ ื”ื™ืงืจ.

ื›ืืŸ, ืืœื•ื”ื™ื, ื ื›ื ืกืชื™ ืœื›ืœ ืžื™ื ื™ ืฆืจื•ืช. ื‘ื”ืชื—ืœื” ื–ื” ื”ื™ื” ืกืงืจื™ืคื˜ ื‘-AmPHP, ืื‘ืœ ืœื ื”ื™ื™ืชื™ ืžืจื•ืฆื” ืžื”ืขื•ืžืก ืฉื”ื•ื ื™ืฆืจ (ืงืคื™ืฆื” ื—ื“ื” ื‘ื”ืชื—ืœื” ืœ-100% ืฆืจื™ื›ืช ืœื™ื‘ื”). ื•ืื– ื ื›ื ืกื” ืœืžืฉื—ืง ืžืขื˜ืคืช ื”ืชืœืชืœื™ื ืฉืœ ReactPHP, ืฉื“ื™ ื”ืชืื™ืžื” ืœืจืฆื•ื ื•ืช ืฉืœื™ ืžื‘ื—ื™ื ืช ืžืกืคืจ ืžื—ื–ื•ืจื™ ื”ืžืขื‘ื“ ืฉื ืฆืจื›ื•, ืื‘ืœ ืœื ื ืชื ื” ืืช ื”ืžื”ื™ืจื•ืช ื‘ื›ืœืœ ืžื” ืฉืจืฆื™ืชื™ (ื”ืชื‘ืจืจ ืฉืืคืฉืจ ืคืฉื•ื˜ ืœืฆืžืฆื ืืช ืžืจื•ื•ื— ื”ื”ืชืงืฉืจื•ืช 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));

ืชื•ืฆืื•ืช ืฉืœ

ื‘ืื•ืคืŸ ื›ืœืœื™, ืฉื™ื˜ื” ื–ื• ืžืงืœื” ืœืžื“ื™ ืขืœ ืืจื’ื•ืŸ ื”ืคืฆืช ื”ืงื‘ืฆื™ื ืœืžืฉืชืžืฉื™ื ืžื›ืœ ืื—ืกื•ืŸ ื‘ืขื ืŸ. ื›ืŸ, ืืคื™ืœื• ืžื˜ืœื’ืจื ืื• VK, (ื‘ืชื ืื™ ืฉื’ื•ื“ืœ ื”ืงื•ื‘ืฅ ืœื ื—ื•ืจื’ ืžื”ื’ื•ื“ืœ ื”ืžื•ืชืจ ืฉืœ ืื—ืกื•ืŸ ื–ื”). ื”ื™ื” ืœื™ ืจืขื™ื•ืŸ ื“ื•ืžื” ืœื–ื” ื–ื”, ืื‘ืœ ืœืฆืขืจื™ ืื ื™ ื ืชืงืœ ื‘ืงื‘ืฆื™ื ืฉืœ ืขื“ 2GB, ื•ืขื“ื™ื™ืŸ ืœื ืžืฆืืชื™ ืฉื™ื˜ื” ืื• ืžื•ื“ื•ืœ ืœื”ื“ื‘ืงืช ืชื’ื•ื‘ื•ืช ืžืžืขืœื” ื”ื–ืจื, ื•ื›ืชื™ื‘ืช ืกื•ื’ ืฉืœ ืขื˜ื™ืคื•ืช ืขื‘ื•ืจ ื”ืคืจื•ื™ืงื˜ ื”ื–ื” ื“ื•ืจืฉืช ืขื‘ื•ื“ื” ื‘ืœืชื™ ืกื‘ื™ืจื”.

ืชื•ื“ื” ืœืš ืขืœ ืชืฉื•ืžืช ื”ืœื‘. ืื ื™ ืžืงื•ื•ื” ืฉื”ืกื™ืคื•ืจ ืฉืœื™ ื”ื™ื” ืœืคื—ื•ืช ืงืฆืช ืžืขื ื™ื™ืŸ ืื• ืฉื™ืžื•ืฉื™ ืขื‘ื•ืจืš.

ืžืงื•ืจ: www.habr.com

ื”ื•ืกืคืช ืชื’ื•ื‘ื”