2009-06-17 11 views
4

Ich habe Nginx als meine Front-End-Webserver auf Port 80 zuhören. Und bestimmte Anforderungen, ich habe Nginx auf Reverse-Proxy es auf einem Mochiweb-basierten Web-Server, den ich geschrieben habe eingerichtet , denn dies auf Port 8000. Meine nginx Konfiguration hören sieht wie folgt aus:Nginx Reverse Proxy benutzerdefinierte Mochiweb-Anwendung

location /mymochiserver { 

      proxy_pass   http://127.0.0.1:8000; 
      proxy_redirect  off; 

      proxy_set_header Host    $host; 
      proxy_set_header X-Real-IP  $remote_addr; 
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 

      client_max_body_size  10m; 
      client_body_buffer_size 128k; 

      proxy_connect_timeout  90; 
      proxy_send_timeout   90; 
      proxy_read_timeout   90; 

      proxy_buffer_size   4k; 
      proxy_buffers    4 32k; 
      proxy_busy_buffers_size 64k; 
      proxy_temp_file_write_size 64k; 
     } 

Nun, wenn ich Zugriff auf die URL http://localhost/mymochiserver ich keine Antwort auf den Browser sehen. Der Browser sagt nur "Warten auf localhost". Wenn ein Benutzer eine Verbindung herstellt, druckt mymochiserver ein Trace in das Terminalfenster, aus dem es ausgeführt wird, und im Moment sehe ich die Trace für jedes Browserfenster, das ich öffne, um diese URL zu verbinden. Aber ich sehe nichts von der Ausgabe, von der ich erwarte, dass sie in den Browser geschrieben wird. ABER, wenn ich direkt auf die URL http://127.0.0.1:8000/ zugreife funktioniert alles einwandfrei, und ich sehe die Ausgabe von mymochiserver im Browser. So funktioniert es wenn direkt angerufen wird. Aber wenn es rückwärts durch Nginx läuft, scheint es nicht zu funktionieren. Irgendeine Idee, was könnte falsch sein?


Update: In meinem Mochiweb Anwendung habe ich diese Zeilen Code:

Socket = Req:get(socket), 
inet:setopts(Socket, [{active, once}]), 
proc_lib:hibernate(?MODULE, feed, [Response, Userid, 1]); 

Es ist im Grunde eine COMET Anwendung, in der Nutzer auf die mymochiserver verbinden wird, und der Server schiebt Daten zu allen verbundene Kunden Wenn keine Daten vom Server gesendet werden, überwache ich den Prozess. Und dann, wenn ich aufgewacht bin, rufe ich die Feed-Funktion auf, um die Daten zu senden. Und wenn ich den Ruhezustand Code entferne, funktioniert alles gut, und ich sehe Ausgabe im Browser. Aber wenn ich überwintern, funktioniert es nicht. Irgendeine Idee, was schief läuft?

Antwort

4

Behoben!

Referenz: http://timanovsky.wordpress.com/2009/01/09/toward-a-million-user-long-poll-http-application-nginx-erlang-mochiweb/

Ich hatte Proxy-Pufferung auszuschalten und die proxy_read_timeout in nginx zu erhöhen, damit es funktioniert. So sieht meine Konfigurationsdatei jetzt so aus:

location /mymochiapp { 
      proxy_pass   http://127.0.0.1:8000; 
      proxy_redirect  off; 

      proxy_set_header Host    $host; 
      proxy_set_header X-Real-IP  $remote_addr; 
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 

      client_max_body_size  10m; 
      client_body_buffer_size 128k; 

      proxy_connect_timeout  90; 
      proxy_send_timeout   90; 
      proxy_read_timeout   3600; 

      proxy_buffering off; 
     } 

Danke thomas55 für das Aufzeigen der Antwort!