Antecedentes
Dio la casualidad de que necesitaba un lugar para almacenar más de 1.5tb de datos, e incluso proporcionar la capacidad de descargarlos por usuarios comunes a través de un enlace directo. Como tradicionalmente esas cantidades de memoria ya van a VDS, cuyo costo de alquiler no se invierte demasiado en el presupuesto del proyecto de la categoría "nada que hacer", y de los datos de origen tenía un SSD VPS de 400 GB, donde no podía colocar 1,5 TB de imágenes sin compresión sin pérdidas Tendrá éxito.
Y luego recordé que si eliminas la basura de la unidad de Google, como los programas que se ejecutan solo en Windows XP, y otras cosas que se desvían de mis medios a los medios ya que Internet no era tan rápido y completamente no ilimitado (por ejemplo, es poco probable que esas 10-20 versiones de la caja virtual tengan otro valor que no sea nostálgico), entonces todo debería encajar muy bien. Apenas dicho que hecho. Y así, al superar el límite en el número de solicitudes a la API (por cierto, el soporte técnico sin problemas aumentó la cuota de solicitudes por usuario en 100 segundos a 10,000), los datos fluyeron rápidamente al lugar de su despliegue adicional.
Todo parece estar bien, pero ahora debe transmitirse al usuario final. Además, sin ningún redireccionamiento a otros recursos allí, y para que una persona simplemente haga clic en el botón "Descargar" y se convierta en el afortunado propietario del archivo atesorado.
Entonces, por Dios, partí de todas las maneras serias. Al principio era un script en AmPHP, pero no estaba satisfecho con la carga que creó (un salto brusco en el inicio al 100% del consumo del núcleo). Luego, el envoltorio de rizos para ReactPHP entró en acción, lo que se ajustaba bien a mis deseos para la cantidad consumida de ciclos de reloj de la CPU, pero no dio la velocidad que yo quería (resultó que simplemente puede reducir el intervalo de llamadas curl_multi_select, pero luego tenemos la misma gula para la primera opción ) Incluso intenté escribir un pequeño servicio en Rust, y funcionó bastante rápido (incluso sorprendentemente, funcionó con mi conocimiento), pero quería más, y de alguna manera no fue fácil personalizarlo. Además, todas estas soluciones de alguna manera extrañaron la respuesta, y quería rastrear el momento en que finalizó la descarga del archivo con la mayor precisión.
En general, por un tiempo estuvo torcido, pero funcionó. Hasta que un día tuve la idea de una idea delirante maravillosa: nginx en teoría puede hacer lo que quiero, funciona enérgicamente e incluso permite todo tipo de distorsiones con la configuración. Tenemos que intentarlo, ¿y si funciona? Y después de medio día de búsquedas persistentes, una solución funcionó de manera estable durante varios meses y cumplió con todos mis requisitos.
Personaliza NGINX
Una versión corta sin comentarios se puede ver debajo del 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; }
Escribir un guión para gestionar toda esta felicidad.
El ejemplo estará en PHP y escrito a propósito con un kit de cuerpo mínimo. Creo que todos los que tengan experiencia con cualquier otro idioma podrán integrar este artículo utilizando mi ejemplo.
<?php
Resumen
En general, este método hace que sea bastante fácil organizar la distribución de archivos a los usuarios desde cualquier almacenamiento en la nube. Sí, incluso desde telegram o VK, (siempre que el tamaño del archivo no exceda el tamaño permitido para este repositorio). Tuve una idea similar a esta , pero desafortunadamente me encuentro con archivos de hasta 2 GB, y todavía no he encontrado una forma o módulo para pegar las respuestas desde arriba, escribir algunos contenedores para este proyecto es irrazonablemente laborioso.
Gracias por su atencion Espero que mi historia haya sido al menos un poco interesante o útil para ti.