Client_max_body_size no funciona en Nginx

Publicado 27 de agosto de 2024

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:

  1. Establece un límite predeterminado en el bloque http
  2. Ajusta los límites para bloques de servidor o ubicación específicos según sea necesario
  3. Supervisa los recursos del servidor y ajusta según sea necesario
  4. 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:

  1. El client_max_body_size de Nginx esté configurado igual o más alto que el límite de la app.
  2. Tu app esté configurada para manejar los tamaños de archivo permitidos por Nginx.
  3. 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:

  1. Configura tu servidor para aceptar cargas de contenido parcial
  2. Implementa lógica para reensamblar los trozos en archivos completos
  3. Usa almacenamiento temporal para los trozos durante el proceso de carga
  4. 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:

  1. Configura un servidor o contenedor dedicado para manejar cargas de archivos
  2. Configura este servidor con límites de recursos más altos para el procesamiento de archivos
  3. 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:

  1. 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 "";
}
  1. 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;
  1. Considera usar la función X-Accel-Redirect de Nginx para servir archivos cargados de manera eficiente