Problema: La directiva client_max_body_size de Nginx no surte efecto
Al configurar Nginx, es posible que encuentres un problema donde la directiva client_max_body_size no funciona como se espera. Esto puede causar rechazos de solicitudes o límites en la carga de archivos. Entender por qué sucede esto y cómo solucionarlo es fundamental para un servidor web que funcione correctamente.
Configuración de client_max_body_size en Nginx
Localización del archivo de configuración
El archivo de configuración de Nginx suele estar en una de estas ubicaciones:
- /etc/nginx/nginx.conf
- /usr/local/nginx/conf/nginx.conf
- /usr/local/etc/nginx/nginx.conf
Las configuraciones de bloques de servidor a menudo están en archivos separados en el directorio /etc/nginx/sites-available/, con enlaces en /etc/nginx/sites-enabled/.
Los ajustes de bloques de ubicación están en bloques de servidor, permitiendo configuraciones específicas.
Configuración del límite de tamaño de carga
La sintaxis para la directiva client_max_body_size es:
client_max_body_size tamaño;
Algunos valores para diferentes usos:
- Cargas de archivos pequeños (fotos de perfil): 2-5 MB
- Cargas de documentos: 10-20 MB
- Cargas de archivos grandes (videos): 100 MB - 1 GB
Para equilibrar seguridad y funcionalidad:
- Establece un límite predeterminado en el bloque http
- Ajusta los límites para bloques de servidor o ubicación específicos según sea necesario
- Supervisa los recursos del servidor y ajusta según sea necesario
- Usa otras medidas de seguridad como limitación de velocidad para cargas grandes
Prueba tu configuración después de hacer cambios para asegurarte de que funcione correctamente.
Solución de problemas cuando client_max_body_size no funciona
Verificación de la configuración de Nginx
Para comprobar errores de sintaxis en tu configuración de Nginx, ejecuta:
nginx -t
Este comando prueba los archivos de configuración e informa sobre cualquier problema.
Después de cambiar la configuración de Nginx, recárgala con:
sudo systemctl reload nginx
o
sudo nginx -s reload
Para revisar los registros de error de Nginx, visualiza este archivo:
/var/log/nginx/error.log
Busca entradas sobre el tamaño de la solicitud o errores 413.
Investigación de problemas en la aplicación del lado del servidor
Para la configuración de PHP, verifica estos ajustes en php.ini:
upload_max_filesize = 20M
post_max_size = 20M
Establece estos valores para que coincidan o excedan tu client_max_body_size de Nginx.
Los límites de carga de la aplicación pueden estar en los archivos de configuración o código de la app. Consulta la documentación de tu app para ajustar estos límites.
Nginx y tu aplicación deben trabajar juntos para las cargas de archivos. Asegúrate de que:
- El client_max_body_size de Nginx esté configurado igual o más alto que el límite de la app.
- Tu app esté configurada para manejar los tamaños de archivo permitidos por Nginx.
- El usuario del servidor web pueda escribir en el directorio de carga.
Soluciones alternativas para cargas de archivos grandes
Implementación de división de archivos del lado del cliente
La división de archivos del lado del cliente, también conocida como cargas en trozos, ofrece beneficios para manejar cargas de archivos grandes:
- Permite cargas reanudables, reduciendo el impacto de problemas de red
- Mejora la experiencia del usuario proporcionando retroalimentación del progreso
- Ayuda a eludir los límites de tamaño de archivo del lado del servidor
Bibliotecas JavaScript para división de archivos incluyen:
- Resumable.js: Una biblioteca para cargas de archivos en trozos y reanudables
- Plupload: Un cargador de archivos con soporte para trozos
- Fine Uploader: Un cargador con capacidades de división en trozos
Para el manejo de cargas en trozos del lado del servidor:
- Configura tu servidor para aceptar cargas de contenido parcial
- Implementa lógica para reensamblar los trozos en archivos completos
- Usa almacenamiento temporal para los trozos durante el proceso de carga
- Valida y procesa el archivo completo una vez que se reciben todos los trozos
Uso de proxy inverso para cargas de archivos
Configurar un servidor de carga separado puede ayudar a gestionar cargas de archivos grandes:
- Configura un servidor o contenedor dedicado para manejar cargas de archivos
- Configura este servidor con límites de recursos más altos para el procesamiento de archivos
- Usa Nginx en el servidor principal como proxy inverso para enrutar solicitudes de carga
Consideraciones de balanceo de carga para cargas de archivos incluyen:
- Distribuir el tráfico de carga entre múltiples servidores backend
- Usar hash consistente para enrutar trozos del mismo archivo al mismo servidor
- Implementar comprobaciones de salud para eliminar servidores de carga que no respondan del grupo
Para usar Nginx como proxy inverso para archivos grandes:
- Configura Nginx para enviar solicitudes al servidor de carga:
location /upload {
proxy_pass http://upload_server;
proxy_request_buffering off;
proxy_http_version 1.1;
proxy_set_header Connection "";
}
- Ajusta la configuración de tiempo de espera para acomodar transferencias de archivos grandes:
proxy_connect_timeout 300s;
proxy_send_timeout 300s;
proxy_read_timeout 300s;
- Considera usar la función X-Accel-Redirect de Nginx para servir archivos cargados de manera eficiente





