αααααα»αααααααααα·ααΆααααα
ααΆααΎαααααΎαα‘αΎαααααααα»αααααΌαααΆααααα»ααα·ααααααααΎαααΈ 1.5 TB αα ααααααααΆαα½α α αΎααααααΆαααααααααααααΆααααα’αααααααΎααααΆααααααααΆαααα»αααΆαααΆαααααΆααΆαααααααααααΆααα α αΆααααΆααααΈααα·ααΆαααα’αααα αα αΆααααααααα VDS ααΆαααααααΈ αααααααααΆααα½αααααα·αααΆαα αααΎααα αααα»αααα·ααΆααααααααΈαααααα "ααααΆαα’αααΈααααΌαααααΎ" α αΎαααΈαα·ααααααααααααααα»αααΆα VPS 400GB SSD αααααΌααααΈαααααα»α αααα»αα αα αααα»ααα·αα’αΆα ααΆααααΌαααΆα 1.5TB αααααααΆαααΆααααα αΆαααααααααΆαααΆαααΆααααααα ααΆααΉαααααααα
α αΎααααααΆαααααααα»αα αΆαααΆααααα·αααΎαααα»ααα»αααΆαα₯αααΆαααΆαααΈ Google Drive ααΌα ααΆαααααα·ααΈαααααΉαααααΎαααΆαααααΎ Windows XP αα·ααααααααααααααααααΆαααααΆααααααΌαααΈα§ααααααα½ααα α§ααααααα½ααααα αΆααααΆααααΈαααααααα’ααΈαααΊααααα·αααΏαααΆααααααααα·αααααα ( α§ααΆα ααα αααα 10-20 αααααα’αααα·αααα·α ααααααΆαα·αααΆααααααα’αααΈαααα ααΈααΆαααΉααααΉααα) αααααΆααααα’αααΈαααΆααα’αααα½αααααααα’ααΆααα αα·αααααα·ααΆαααΏαααΆαααααΎααα ααΌα ααααα αΎα ααΆαααααα»αααααααααααΎα ααα½αααααΎαα ααΆαα api (ααααα·ααΈααα αααα½ααα αα ααααααααααααΆααααα αΆααΆαα½αααΆααααααΎαααΌααΆααααααΎαααααΆααα’αααααααΎααααΆααααα 100 αααα»ααααααα 10 αα·ααΆααΈ) αα·ααααααααΆαα αΌααααΆαααΏααα ααΆααααααααααΆαααααααΆααααααααααααααααΆα .
α’αααΈαα αΆααααΈααΌα ααΆααα’ ααα»ααααα₯α‘αΌααααααΆααααΌααααααααΌααα ααΆααα’αααααααΎααααΆααα α»ααααααα ααΆαααααα ααα αααααααΆαααΆααααααΌααααααα ααΆααααααΆααααααααα ααα»ααααααΎααααΈα±ααααα»αααααααΆααααααΆααααα α»α αααΌαα»α "ααΆααα" α αΎαααααΆαααΆααα αΆααααααΈαααΆαααα―αααΆααααααΆααααααα
αα ααΈααα αααααααααΆααα αΆαα αααα»αααΆαα αΌααα αααα»ααααα αΆαααααααααααα ααααΌαααΆααΆααααααΈααα αααα»α AmPHP ααα»αααααααα»ααα·ααααα α·αααααΉαααααα»ααααααΆαααααΎααα (ααΆαααααααΆαααααΆαααα αααα αΆααααααΎααα αΌαααα 100% ααααΌαααααΎααααΆαα)α αααααΆαααα curl wrapper αααααΆαα ReactPHP ααΆαα αΌαααααα αααααΆαααααΉαααΆαα ααααΆααααααααα»αααΆααααααΉαα ααα½ααα CPU cycles αααααααΎααααΆαα ααα»αααααα·αααΆααααααααααΏαα’αααΈααΆααα’ααααααααα»αα ααααΆα (ααΆααααααΆα’αααα’αΆα ααΆαααααααα ααααααααααααΆαα α ααΌαααααα 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;
}
ααααααααΈαααααααΆααααααα’αΆα ααΎααα ααααα 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;
}
ααΎααααα»ααααααααααααΈαααΎααααΈααααααααααα»ααααααααΆααα’ααααα
α§ααΆα αααααΉαααΆααα αααα»α 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 ααααα (αααααααΆααα αα―αααΆααα·αααΎαααΈααα ααααα’αΆα
α’αα»ααααΆαααΆαααααα ααααα»αααα)α αααα»αααΆααααα·αααααααααΉα
ααΌαβα’ααα»αβα ααααβααΆαβααα α·αααβαα»αααΆααβααααβαααα’αααα αααα»ααααααΉαααΆααΏααααααααα»ααααΆαα αα ααΆαααα½αα±ααα αΆααα’αΆααααααα¬ααΆααααααααααααααΆααα’αααα
ααααα: www.habr.com