2009-07-21 10 views
14

Ich brauche Hilfe von einigen Linux-Gurus. Ich arbeite an einer Webapp, die einen Comet-Server enthält. Der Comet-Server wird auf localhost: 8080 ausgeführt und stellt die URL localhost: 8080/long_polling für Clients bereit, mit denen eine Verbindung hergestellt werden kann. Meine Webapp läuft auf localhost: 80.Nginx-Proxy zu Kometen

ich nginx Proxy-Anfragen von nginx zum Kometen-Server verwendet haben (localhost: 80/long_polling auf localhost proxied: 8080/long_polling), aber ich habe zwei gripes mit dieser Lösung:

  1. nginx gibt mir eine 504 Gateway-Timeout nach einer Minute, obwohl ich JEDES einzelne Timeout-Einstellung zu 600 Sekunden ändere
  2. Ich möchte nicht wirklich Nginx Proxy auf den Comet-Server sowieso haben - der Nginx-Proxy ist nicht für lang anhaltende Verbindungen gebaut (bis zu einer halben Stunde möglich). Ich würde den Clients lieber erlauben, sich direkt mit dem Comet-Server zu verbinden und den Comet-Server damit umgehen zu lassen.

Also meine Frage ist: Gibt es eine Linux-Trick, der mir localhost zu belichten erlaubt: 8080/long_polling zu localhost: 80/long_polling ohne den nginx Proxy zu verwenden? Da muss etwas sein. Deshalb denke ich, dass diese Frage wahrscheinlich am besten von einem Linux-Guru beantwortet werden kann.

Der Grund, warum ich/long_polling auf Port 80 ausgesetzt werden muss, ist, so dass ich AJAX verwenden kann, um eine Verbindung herzustellen (Ajax same-origin-policy).

Diese Referenz mein nginx proxy.conf ist:

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  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; 

Antwort

4

Ich glaube nicht, das ist möglich ...

localhost:8080/long_polling ist ein URI ... genauer gesagt, sollte es sein http://localhost:8080/long_polling ... in HTTP würde die URI als Anforderung /long_polling aufgelöst werden, Port 80 auf den Server mit der Domäne 'localhost' ... das heißt, eine tcp-Verbindung zu 127.0.0.1:80 zu öffnen und

senden
GET /long_polling HTTP/1.1 
Host: localhost:8080 

sowie einige zusätzliche HTTP-Header ... Ich habe noch nicht gehört, dass die Ports accross Prozesse gebunden werden können ...

eigentlich, wenn ich gut verstehen, nginx entworfen wurde, um eine skalierbare Proxy zu sein. .. auch, sie behaupten, sie brauchen 2,5 MB für 10000 HTTP-Leerlauf Verbindungen ... so dass sollte wirklich kein Problem sein ...

was comet server verwenden Sie? Könntest du vielleicht den Comet Server Proxy einen Webserver lassen? normale HTTP-Anfragen sollten schnell ...

greetz

back2dos

+1

Nun, wenn Nginx diese kleine Menge an Speicher verwendet, würde ich es gerne mit Nginx als Front-Proxy-Server dann arbeiten. Sie müssen nur den "504 Gateway Time-Out" -Fehler beheben, der nach etwa einer Minute auftritt (immer nach etwa 55 - 65 Sekunden). Danke für Ihre Antwort. Ich verwende node.js als COMET-Server. – Chris

0

, ohne dabei einige ernsthafte TCP/IP mungling, gehandhabt werden können Sie nicht zwei Anwendungen auf demselben TCP-Port auf der gleichen aussetzen IP Adresse. Sobald nginx mit dem Dienst begonnen hat, kann es die Verbindung nicht mehr an andere Anwendungen weitergeben, sondern nur an Proxy.

so, entweder Benutzer einen anderen Port, eine andere IP-Nummer (könnte auf der gleichen physischen Maschine sein), oder leben mit Proxy.

bearbeiten: Ich denke, Nginx ist Zeitlimit, weil es keine Aktivität für eine lange Zeit sieht.vielleicht könnte das Hinzufügen einer Nullnachricht alle paar Minuten dazu führen, dass die Verbindung nicht fehlschlägt.

+0

Ok - Ich denke, der Linux-Guru hat gesprochen :) Es ist einfach nicht möglich. Dann muss ich dann herausfinden, wie man nginx keine Zeit machen kann. Vielen Dank! Wenn jemand, der dies liest, eine Idee hat, warum Nginx ausläuft, lass es mich wissen! – Chris

2

Versuchen

proxy_next_upstream error; 

Der Standardwert ist

proxy_next_upstream error timeout; 

Das Timeout kann nicht mehr als 75 Sekunden betragen.

http://wiki.nginx.org/NginxHttpProxyModule#proxy_next_upstream

http://wiki.nginx.org/NginxHttpProxyModule#proxy_connect_timeout

+0

In einer verwandten Notiz stolperte ich über Ihre E-Mail an die Nginx-Mailing-Liste, in der Sie erwähnen, dass Sie node.js verwenden. Sie sind mir in meinem eigenen Projekt * genau * einen Schritt voraus. Ich plane auch, node.js hinter nginx zu verwenden. Bitte halten Sie uns auf dem Laufenden! Ich habe ein paar node.js Projekte auf Github FWIW: http://github.com/fictorial/ – z8000

+0

Hallo Brian! node.js ist süß.Der COMET-Server war einfach zu schreiben und verhält sich gut. Noch nicht sicher, wie es in der Produktion halten wird. – Chris

+0

Sind Sie überhaupt daran interessiert, zu teilen, woran Sie gearbeitet haben? Ein COMET-Server, der hinter einem produktionsbereiten Reverse-Proxy wie nginx (veröffentlicht in der node.js Google-Gruppe) läuft, wäre eine großartige Möglichkeit, mehr Leute für node.js zu interessieren und würde mir auch helfen! ;) – z8000

6

ich es tatsächlich geschafft, das jetzt zum Laufen zu bringen. Danke euch allen. Der Grund nginx war 504 Ablaufen war eine dumme ein: Ich hatte nicht proxy.conf eingeschlossen in meinem nginx.conf etwa so:

include /etc/nginx/proxy.conf; 

Also, ich behalte nginx als Frontend-Proxy auf den COMET-Server .

+2

könnten Sie Ihre nginx.conf und proxy.conf als Referenz veröffentlichen? – z8000

7

Hier ist meine Nginx.conf und meine proxy.conf. Beachten Sie jedoch, dass die proxy.conf weit übertrieben ist - ich habe gerade alle diese Einstellungen vorgenommen, während ich versucht habe, mein Programm zu debuggen.

/etc/nginx/nginx.conf

worker_processes 1;                                  
user www-data; 

error_log /var/log/nginx/error.log debug; 
pid  /var/run/nginx.pid; 

events { 
    worker_connections 1024; 
} 

http { 
    include /etc/nginx/proxy.conf; 

    include  /etc/nginx/mime.types; 
    default_type application/octet-stream; 

    access_log /var/log/nginx/access.log; 

    sendfile  on; 
    tcp_nopush  on; 

    keepalive_timeout 600; 
    tcp_nodelay  on; 

    gzip on; 
    gzip_comp_level 2; 
    gzip_proxied any; 
    gzip_types text/plain text/html text/css application/x-javascript text/xml application/xml application/xml+rss text/javascript; 

    include /etc/nginx/conf.d/*.conf; 
    include /etc/nginx/sites-enabled/*; 
} 

/etc/nginx/proxy.conf

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  6000; 
proxy_send_timeout   6000; 
proxy_read_timeout   6000; 
proxy_buffer_size   4k; 
proxy_buffers    4 32k; 
proxy_busy_buffers_size  64k; 
proxy_temp_file_write_size 64k; 
send_timeout    6000; 
proxy_buffering    off; 
proxy_next_upstream error; 
+0

danke für den Austausch! – z8000

0

Vielleicht möchten Sie versuchen (80) hören auf dem node.js-Server anstelle von 8080 (i nehme an, Sie verwenden, dass als Asynchron-Server?) Und möglicherweise Ngnix insgesamt verpassen. Ich verwende connect Middleware und express zu statischen Dateien des Servers und beschäftige mich mit Zwischenspeicherung, die normalerweise von Ngnix gehandhabt würde. Wenn Sie mehrere Instanzen von Knoten ausführen möchten (was ich empfehlen würde), sollten Sie sich node.js selbst als Proxy/Load Balancer für andere Knoteninstanzen und nicht für Nginx als Gateway ansehen. Ich stieß jedoch auf ein Problem damit, wenn ich zu viele statische Bilddateien gleichzeitig lief, aber nachdem ich die Bilder auf S3 gesetzt hatte, stabilisierte es sich. Nginx KANN für das, was du tust, ein Overkill sein. Probieren Sie es aus und sehen Sie. Viel Glück.