file upload - carga de archivo nginx 1.5+-mejores prácticas
file-upload (5)
Estoy buscando cargar archivos a través de mi servidor nginx
. Actualmente estoy ejecutando nginx-1.4.6
y estoy dispuesto a pasar al último estable nginx-1.5*
según sea necesario.
El favorito de la comunidad es / era el nginx-upload-module
Valery Kholodkov, que se encuentra here . Lamentablemente, Valery ya no está manteniendo este módulo, detalles here . A partir de nginx-1.3.9
el módulo funciona parcialmente o no funciona en absoluto.
He compilado el nginx-upload-module
en nginx-1.4.6
y estoy obteniendo un error (Client cxn cerrado) que parece estar arreglado en el changeset nginx-1.5.3
. Sin embargo, he aplicado el parche y no tuve suerte.
El post ligeramente actualizado de Anatoly, here , ofrece múltiples soluciones, incluye cuatro soluciones
A medida que me sumerjo en la segunda y cuarta soluciones (prefiero no hacer de lua
una dependencia, pero podría), pensé que es apropiado preguntarle a esta comunidad:
¿Cuáles son las mejores prácticas actuales para cargar archivos con nginx-1.5+
?
Permítanme agregar que estoy cargando archivos desde un comando POST
python
e intentando probar con curl
. PHP
no está en mi stack tecnológico.
Hay un buen artículo sobre tu duda. here
Intenté nginx-upload-module. Es una buena solución, pero parece que esto no funciona para las nuevas versiones. También hay algunos módulos en Lua que pueden ayudarte. En mi caso, tenía una lógica de negocio que luego implementé en mi aplicación.
Tenga en cuenta que ese gran problema para cargar archivos es el FILER. Esto es botleneck: una gran cantidad de pruebas de carga que hice me muestran esta conclusión.
Me doy cuenta de que esta es una pregunta muy antigua, pero está en la primera página de búsqueda de Google para "módulo de carga nginx" y es el primer resultado de desbordamiento de pila, por lo que, en caso de que esto ayude a alguien más, se encontrará con esta pregunta:
Estoy usando el nginx-upload-module en nginx 1.10.3. Como la pregunta original menciona, Valery Kholodkov ya no está manteniendo el módulo. Sin embargo, hay varias horquillas diferentes y otras personas la han modificado para que funcione con las versiones más nuevas de nginx.
Esta solicitud de extracción es lo que utilicé para compilar nginx con el módulo de carga.
https://github.com/vkholodkov/nginx-upload-module/pull/88
El módulo de carga, IMO, sigue siendo la mejor solución si usa nginx y php-fpm. Este módulo permite que las cargas sean manejadas completamente por nginx hasta que estén completas, y luego el trabajo de procesar la carga se pasa a PHP. Por lo tanto, los procesos de php-fpm no crearán un cuello de botella cuando los usuarios suban muchos archivos.
Nginx admite el método ''POST'', donde puede usar parámetros grandes. El cliente puede usar php o jsp para usar el método de publicación para compilar la solicitud al servidor nginx.
Solo un borrador rápido pero prueba esto ...
Upload.php
if (isset($_FILES[''dlc_file'']) && !empty($_FILES[''dlc_file''])) {
if (empty($_FILES[''dlc_file''][''name'']) === true) {
echo = "Please choose a file to upload";
} else {
$allowed = array(''zip'', ''rar'', ''gzip'', ''tar'', ''7z'', ''png'', ''jpg'');
$file_name = $_FILES[''dlc_file''][''name''];
$file_extn = strtolower(end(explode(''.'', $file_name)));
$file_temp = $_FILES[''dlc_file''][''tmp_name''];
if (in_array($file_extn, $allowed) === true) {
$file_path = ''dlc/'' . substr(md5(time()), 0, 10) . ''.'' . $file_extn;
move_uploaded_file($file_temp, $file_path);
echo = "Successfully uploaded $file_name";
} else {
$file_types = implode('', '', $allowed);
echo "File type is not allowed, Allowed file types $file_types";
}
}
}
index.php
<form action="upload.php" method="post" enctype="multipart/form-data>
<input type="file" name="dlc_file">
<input type="submit" name="submit" value="Upload">
</form>
Tal vez puedas usar Perl si no te gusta php o lua.
http://nginx.org/en/docs/http/ngx_http_perl_module.html#methods
$ r-> has_request_body (controlador)
Pero fuera de la caja, nginx no es la herramienta para guardar una solicitud de entrada recibida y almacenarla.
Tal vez uWSGI ( https://uwsgi-docs.readthedocs.io/en/latest/ ) es una mejor manera de ir con http-socket https://uwsgi-docs.readthedocs.io/en/latest/HTTP.html y una aplicación de Python.