Ich verwende Nginx / Ruby-on-Rails und habe ein einfaches mehrteiliges Formular zum Hochladen von Dateien. Alles funktioniert einwandfrei, bis ich mich entscheide, die maximale Größe der Dateien, die ich hochladen möchte, einzuschränken. Dazu setze ich den Nginx client_max_body_size
auf 1 MB ( 1 MB) und erwarte als Antwort einen HTTP 413-Status (Request Entity Too Large), wenn diese Regel verletzt wird.
Das Problem ist, dass beim Hochladen einer 1,2-MB-Datei anstelle der Anzeige der HTTP 413-Fehlerseite der Browser ein wenig hängt und dann mit der Meldung "Verbindung wurde zurückgesetzt, während die Seite geladen wurde" stirbt.
Ich habe fast jede Option ausprobiert, die Nginx bietet, nichts scheint zu funktionieren. Hat jemand irgendwelche Ideen dazu?
Hier ist meine 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;
}
}
Vielen Dank.
**Edit**
Umgebung / UA: Windows XP / Firefox 3.6.13
quelle
Content-Length
eher sendet als tutTransfer-Encoding: chunked
.Expect
es der richtige Weg für große Anfragen.request.setHeader(HttpHeaders.EXPECT, CONTINUE);
mitimport org.apache.http.HttpHeaders;
undimport static org.jboss.netty.handler.codec.http.HttpHeaders.Values.CONTINUE;
Stirbt Ihr Upload ganz am Ende? 99% vor dem Absturz? Client-Body und Puffer sind der Schlüssel, da Nginx eingehende Daten puffern muss. Die Body-Konfigurationen (Daten des Anforderungs-Body) geben an, wie nginx den Massenfluss von Binärdaten von Clients mit mehreren Teilen in die Logik Ihrer App verarbeitet.
Die
clean
Einstellung gibt Speicher- und Verbrauchsgrenzen frei, indem nginx angewiesen wird, den eingehenden Puffer in einer Datei zu speichern und diese Datei später durch Löschen von der Festplatte zu bereinigen.Stellen Sie
body_in_file_only
anclean
und stellen Sie Puffer für dieclient_max_body_size
. In der Konfiguration der ursprünglichen Frage war bereits sendfile aktiviert. Erhöhen Sie auch die Zeitüberschreitungen. Ich verwende die folgenden Einstellungen, um dies zu beheben, die für Ihre lokalen Konfigurations-, Server- und http-Kontexte geeignet sind.quelle
openshift
php7
nginx
.Aus der Dokumentation :
Ich vermute, dass dies der Fall ist. Wenn Sie das HTTP mit Tools wie Firebug oder Live-HTTP-Headern (beide Firefox-Erweiterungen) hin und her überprüfen , können Sie sehen, was wirklich vor sich geht.
quelle