Latar belakang
Kebetulan saya membutuhkan tempat untuk menyimpan lebih dari 1.5tb data, dan bahkan menyediakan kemampuan untuk mengunduhnya oleh pengguna biasa melalui tautan langsung. Karena secara tradisional jumlah memori seperti itu sudah masuk ke VDS, biaya sewanya tidak terlalu diinvestasikan dalam anggaran proyek dari kategori “tidak ada hubungannya”, dan dari data sumber saya memiliki VPS 400GB SSD, di mana saya tidak dapat menempatkan 1.5TB gambar tanpa kompresi tanpa kerugian. akan berhasil.
Dan kemudian saya ingat bahwa jika Anda menghapus sampah dari disk Google, seperti program yang berjalan hanya pada Windows XP, dan hal-hal lain yang berkeliaran dari media saya ke media karena Internet tidak begitu cepat dan sepenuhnya bukan tanpa batas (misalnya, versi 10-20 dari kotak virtual itu tidak mungkin memiliki nilai selain nostalgia), maka semuanya harus sesuai dengan sangat baik. Tidak lebih cepat dikatakan daripada dilakukan. Jadi, dengan melewati batas jumlah permintaan ke api (omong-omong, dukungan teknis tanpa masalah meningkatkan kuota permintaan per pengguna dalam 100 detik menjadi 10.000), data dengan cepat mengalir ke tempat penyebaran selanjutnya.
Segalanya tampak baik-baik saja, tetapi sekarang perlu disampaikan kepada pengguna akhir. Selain itu, tanpa pengalihan ke sumber daya lain di sana, dan dengan demikian seseorang cukup mengeklik tombol "Unduh" dan menjadi pemilik beruntung dari file berharga itu.
Lalu aku, dengan angkuh, berangkat dengan serius. Pada awalnya itu adalah skrip pada AmPHP, tapi saya tidak puas dengan beban yang dibuatnya (lompatan tajam saat startup ke 100% dari konsumsi kernel). Kemudian pembungkus ikal untuk ReactPHP beraksi, yang sangat sesuai dengan keinginan saya untuk jumlah siklus clock CPU yang dikonsumsi, tetapi itu tidak memberikan kecepatan sama sekali apa yang saya inginkan (ternyata Anda hanya dapat mengurangi interval panggilan curl_multi_select, tetapi kemudian kami memiliki kerakusan panggilan yang sama untuk opsi pertama, tetapi kemudian kami memiliki kerakusan yang sama untuk opsi pertama, tetapi kemudian kami memiliki kerakusan yang sama untuk opsi pertama). ) Saya bahkan mencoba untuk menulis layanan kecil di Rust, dan itu bekerja cukup cepat (bahkan mengejutkan, itu bekerja dengan sepengetahuan saya), tetapi saya ingin lebih, dan entah bagaimana tidak mudah untuk menyesuaikannya. Selain itu, semua solusi ini entah bagaimana anehnya menahan jawaban, dan saya ingin melacak saat ketika pengunduhan file dengan akurasi terbesar berakhir.
Secara umum, untuk sementara itu miring, tetapi berhasil. Sampai suatu hari saya memiliki ide ide khayalan yang luar biasa: nginx secara teori dapat melakukan apa yang saya inginkan, itu bekerja dengan cepat, dan bahkan memungkinkan segala macam penyimpangan dengan konfigurasi. Kita harus mencoba - bagaimana jika berhasil? Dan setelah setengah hari pencarian terus-menerus, sebuah solusi bekerja dengan stabil selama beberapa bulan yang memenuhi semua persyaratan saya.
Kustomisasi NGINX
Versi singkat tanpa komentar dapat dilihat di bawah 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; }
Menulis naskah untuk mengelola semua kebahagiaan ini
Contohnya akan dalam PHP dan sengaja ditulis dengan body kit minimum. Saya pikir setiap orang yang memiliki pengalaman dengan bahasa lain akan dapat mengintegrasikan artikel ini menggunakan contoh saya.
<?php
Ringkasan
Secara umum, metode ini membuatnya cukup mudah untuk mengatur distribusi file ke pengguna dari penyimpanan cloud apa pun. Ya, bahkan dari telegram atau VK, (asalkan ukuran file tidak melebihi ukuran yang diperbolehkan untuk repositori ini). Saya punya ide yang mirip dengan ini , tapi sayangnya saya menemukan file hingga 2GB, dan saya belum menemukan cara atau modul untuk menempelkan jawaban dari hulu, menulis beberapa pembungkus untuk proyek ini sangat melelahkan.
Terima kasih atas perhatian anda Saya harap cerita saya setidaknya sedikit menarik atau bermanfaat bagi Anda.