http - balanceo - carga nginx problema client_max_body_size
configurar balanceador de carga nginx (3)
Estoy ejecutando nginx / ruby-on-rails y tengo un formulario simple de varias partes para subir archivos. Todo funciona bien hasta que decida restringir el tamaño máximo de archivos que deseo cargar. Para hacer eso, configuro el nginx client_max_body_size
en 1m (1MB) y espero un estado de HTTP 413 (entidad de solicitud demasiado grande) en respuesta cuando esa regla se rompe.
El problema es que cuando cargo un archivo de 1.2 MB, en lugar de mostrar la página de error HTTP 413, el navegador se bloquea un poco y luego muere con un mensaje "La conexión se restableció mientras la página se estaba cargando".
He probado casi todas las opciones que ofrece nginx, nada parece funcionar. ¿Alguien tiene alguna idea acerca de esto?
Aquí está mi nginx.conf:
worker_processes 1;
timer_resolution 1000ms;
events {
worker_connections 1024;
}
http {
passenger_root /the_passenger_root;
passenger_ruby /the_ruby;
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name www.x.com;
client_max_body_size 1M;
passenger_use_global_queue on;
root /the_root;
passenger_enabled on;
error_page 404 /404.html;
error_page 413 /413.html;
}
}
Gracias.
**Edit**
Medio ambiente / UA: Windows XP / Firefox 3.6.13
¿Su carga muere al final? 99% antes de estrellarse? El cuerpo del cliente y los buffers son clave porque nginx debe almacenar los datos entrantes. Las configuraciones del cuerpo (datos del cuerpo de la solicitud) especifican cómo nginx maneja el flujo masivo de datos binarios de clientes de formularios múltiples en la lógica de su aplicación.
La configuración de clean
libera los límites de memoria y consumo al ordenar a nginx que almacene el búfer entrante en un archivo y luego lo borra del disco eliminándolo.
Establezca body_in_file_only
para clean
y ajustar los búferes para el client_max_body_size
. La configuración de la pregunta original ya tenía sendfile, también aumenta los tiempos de espera. Utilizo la configuración a continuación para corregir esto, de forma adecuada en los contextos locales de configuración, servidor y http.
client_body_in_file_only clean;
client_body_buffer_size 32K;
client_max_body_size 300M;
sendfile on;
send_timeout 300s;
De la documentación :
Es necesario tener en cuenta que los navegadores no saben cómo mostrar correctamente este error.
Sospecho que esto es lo que está sucediendo, si inspecciona el HTTP de ida y vuelta usando herramientas como Firebug o Live HTTP Headers (ambas extensiones de Firefox) podrá ver lo que realmente está sucediendo.
nginx "falla rápidamente" cuando el cliente le informa que va a enviar un cuerpo más grande que el client_max_body_size
enviando una respuesta 413 y cerrando la conexión.
La mayoría de los clientes no leen las respuestas hasta que se envía todo el cuerpo de la solicitud. Como nginx cierra la conexión, el cliente envía datos al socket cerrado, lo que provoca un TCP RST.
Si su cliente HTTP lo admite, la mejor manera de manejar esto es enviar un encabezado Expect: 100-Continue
. Nginx lo admite correctamente desde 1.2.7 y responderá con una respuesta de 413 Request Entity Too Large
lugar de 100 Continue
si Content-Length
excede el tamaño máximo del cuerpo.