Nginx: Cómo deshabilitar completamente el almacenamiento en búfer del cuerpo de la solicitud

17

Estoy tratando de configurar Madsonic en mi caja de Ubuntu y hacer que Nginx se ejecute delante de él. El problema es que sigo recibiendo esta advertencia cuando intento cargar cosas a través de la interfaz web:

31115#0: *14 a client request body is buffered to a temporary file

Esto también explica por qué las barras de progreso en la ventana de carga no funcionan. Aquí está mi configuración relevante de Nginx:

    # proxy the madsonic server here
    location / {
            proxy_pass                      https://madsonic-server/;
            proxy_redirect                  off;
            proxy_buffering                 off;
            proxy_request_buffering         off;
            allow                           all;
            proxy_http_version              1.1;

            proxy_set_header                Host $http_host;
            proxy_set_header                X-Real-IP $remote_addr;
            proxy_set_header                X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header                X-Forwarded-Host $server_name;
            proxy_set_header                X-Forwarded-Proto $scheme;

            client_body_buffer_size         0;
            client_max_body_size            0;
            proxy_max_temp_file_size        0;
            proxy_read_timeout              18000;
            proxy_send_timeout              18000;

            gzip                            off;
    }

Estoy usando Nginx 1.9.12 en este momento.

Lo que me gustaría lograr es hacer que Nginx no use buffers de cuerpo de solicitud en absoluto y simplemente pasar el cuerpo de solicitud directamente a Madsonic, independientemente de su tamaño. ¿Es esto posible? Si es así, ¿cuál sería la configuración correcta?

Parece que se responden otras preguntas con formas de establecer los tamaños del búfer. No quiero ningún tampón. Quiero pasar directamente el cuerpo de la solicitud a Madsonic.

rad
fuente
No puedes apagarlo. Solo puede establecer el tamaño del búfer.
Michael Hampton
@MichaelHampton pero ¿qué pasa con esta explicación?
rad
Ah, tienes razon. Y parece que has respondido tu propia pregunta.
Michael Hampton
@MichaelHampton bueno, sí, excepto que todavía no está apagado por alguna razón :(
rad
¿Alguna suerte con esto? Tengo el mismo problema de acuerdo con la configuración de documentos proxy_request_buffering de hará el truco, pero aún almacena las cargas.
alejandrodnm

Respuestas:

17

Tuve el mismo problema al configurar un proxy Nginx para un registro Docker. Terminé haciendo:

client_max_body_size 0;
proxy_http_version 1.1;
proxy_request_buffering off;

client_max_body_sizeTodavía tenía que ser 0 para evitar el error, pero watch -n 1 du -hs .claramente mostraba una diferencia. El almacenamiento en búfer hizo que los datos aparecieran después de la solicitud, ningún almacenamiento en búfer lo hizo aparecer durante la solicitud.

proxy_http_version 1.1es necesario debido a la codificación fragmentada. Cita de los documentos de Nginx:

Cuando se utiliza la codificación de transferencia fragmentada HTTP / 1.1 para enviar el cuerpo de la solicitud original, el cuerpo de la solicitud se almacenará en el búfer independientemente del valor de la directiva a menos que HTTP / 1.1 esté habilitado para el proxy.

Halfgaar
fuente