2012-04-07 6 views
4

Mein Setup scheint ein bisschen seltsam, aber sollte nicht zu weit geholt werden: Ich habe eine Apache2-Instanz Server-PHP-Seiten und statische Dateien. Ich habe einen Knoten js Server mit Datei-Uploads (POST) mit node-formidable. Obendrein benutze ich nginx 1.0.14. Um den Node-Server zum Hochladen in Formularen zu verwenden, die in PHP-Dateien geliefert werden, habe ich mich entschieden, nginx zu installieren, damit ich die gleiche Domain, Port und Protokoll behalten kann. Also im Grunde habe ich/upload was ich (direkt) an meinen Knoten js pipen möchte, möglichst außerhalb des Proxy insgesamt. Der Rest wird durch den apache2 Server handlede:Piping POST Körper mit nginx proxy_buffering und Knoten js formidable

location /upload { 
    client_max_body_size  10m; 
    client_body_buffer_size  128k; 
    proxy_connect_timeout  600; 
    proxy_send_timeout   600; 
    proxy_read_timeout   600; 
    proxy_buffer_size   4k; 
    proxy_buffers    4 32k; 
    proxy_busy_buffers_size  64k; 
    proxy_temp_file_write_size 64k; 
    send_timeout    600; 
    proxy_buffering    off; 
    proxy_pass https://node_backend; 
} 
location/{ 
    proxy_set_header Host $http_host; 
    proxy_pass https://apache_backend; 
} 

die auf https://stackoverflow.com/a/1167559

Mein Problem zugrunde liegt, ist, dass der nginx die gesamte POST-Anforderung puffert, bevor es von nginx zu Knoten js senden. Ich kann dies überprüfen, da der Fortschrittsindikator in Chrome bis zu 100% zählt, bevor mein Knoten js erreicht wird (mit einem sofortigen Upload von 0-100% (da er von localhost an localhost gesendet wird)).

Ich verstehe nicht, warum proxy_buffering off nicht funktioniert, wie ich erwarte (dass es nicht zwischenspeichern sollte, und stattdessen die Anforderung an das Back-End übergeben, wie es empfangen wird).

Alternativ ... Ist das auf andere Weise möglich?

Jeder Tipp/Hilfe wird sehr geschätzt.

  • Casper

  • Hinweis: Ich habe versucht, die nginx_tcp_proxy_module verwenden, die im Gebrauch nicht so weit verbreitet ist. Ich habe in Betracht gezogen, Varnish zu verwenden, da es in der Lage ist, zu tun, was ich will, piping directly to node-js based on url (ausgezeichneter Blogbeitrag vom Autor btw., Lohnenswert), aber ich betreibe einen https-Server (zwei tatsächlich), also bin ich nicht sicher, ob Varnish das tun kann (https nicht unterstützt wird, so würde ich es wickeln müssen, aber mit zwei Domänen (Zert) das unmöglich sein würde)

Antwort

1

die current docs es klar, dass die proxy_buffering Richtlinie macht nur beeinflusst die Pufferung von Antworten keine Anfragen.

Aktiviert oder deaktiviert die Pufferung von Antworten vom Proxy-Server.

Die für die Pufferung von POST-Anforderungen erforderliche Anweisung lautet proxy_request_buffering. Erneut von der current docs:

Aktiviert oder deaktiviert die Pufferung eines Clientanforderungshauptteils.

(Denn es ist erwähnenswert, die proxy_request_buffering Richtlinie Casper willen wurde hinzugefügt wurde in nginx Version 1.7.11 veröffentlicht several years after diese Frage gestellt.)

+0

Dank! Ihre Antwort hat mir viel Zeit gespart. Das Hinzufügen von 'proxy_request_buffering off;' in meinem Serverblock funktioniert. – codeKonami