2013-04-29 7 views
10

Ich verstehe, dass mehrere node.js, und ich nehme an, Erweiterung Meteor, kann auf einem Server mit Nginx ausgeführt werden. Ich habe Nginx Setup und läuft auf einem Ubuntu-Server gut, ich kann sogar bekommen, um Anfragen zu beantworten und sie auf eine meiner Anwendungen zu übertragen. Ich habe jedoch einen Roadblock getroffen, als ich versucht habe, Nginx dazu zu bringen, den Traffic auf die zweite Anwendung zu übertragen.Probleme mit Nginx und mehrere Meteor/Nodejs Apps

Einige Hintergrundinformationen:

  • erste App läuft auf Port 8001
  • 2. App läuft auf Port 8002
  • Nginx auf Port 80
  • Versuch nginx zu bekommen Verkehr an/senden App one and traffic at/app2/to app zwei
  • Beide Apps können erreicht werden, indem Sie zu Domäne: 8001 und Domäne: 8002

Meine Nginx config:

upstream mydomain.com { 
server 127.0.0.1:8001; 
server 127.0.0.1:8002; 
} 

# the nginx server instance 
server { 
listen 0.0.0.0:80 default_server; 
access_log /var/log/nginx/mydomain.log; 

location /app2 { 
    rewrite /app2/(.*) /$1 break; 
    proxy_set_header X-Real-IP $remote_addr; 
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
    proxy_set_header Host $http_host; 
    proxy_set_header X-NginX-Proxy true; 
    proxy_pass http://127.0.0.1:8002; 
    proxy_redirect off; 
    proxy_http_version 1.1; 
    proxy_set_header Upgrade $http_upgrade; 
    proxy_set_header Connection "upgrade"; 
} 

location/{ 
    proxy_set_header X-Real-IP $remote_addr; 
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
    proxy_set_header Host $http_host; 
    proxy_set_header X-NginX-Proxy true; 
    proxy_pass http://127.0.0.1:8001; 
    proxy_redirect off; 
    proxy_http_version 1.1; 
    proxy_set_header Upgrade $http_upgrade; 
    proxy_set_header Connection "upgrade"; 
} 
} 

Einsicht, was los auf im Gange sein könnte, wenn der Verkehr/to/app2 geht ich es sehr zu schätzen würde!

Antwort

26
proxy_pass http://127.0.0.1:8002/1; <-- these should be 
proxy_pass http://**my_upstream_name**; <--these 

dann

upstream my_upstream_name { 

//Ngixn do a round robin load balance, some users will conect to/and othes to /app2 

server 127.0.0.1:8001; 

server 127.0.0.1:8002; 

} 

Einige Tipps den Proxy-Kontrolle:

einen Blick darauf werfen here @nginx docs

dann hier gehen wir:

gewicht = NUMMER - gewicht des servers einstellen, wenn nicht gesetzt gewicht ist gleich eins. das Standard Round Robin aus dem Gleichgewicht bringen.

max_fails = NUMBER - Anzahl von Fehlversuchen mit dem Server innerhalb der Zeitperiode (zugewiesen durch den Parameter fail_timeout) bei der Kommunikation nach der es funktionsunfähig angesehen wird. Wenn nicht festgelegt, ist die Anzahl der Versuche eins. Ein Wert von 0 deaktiviert diese Prüfung. Was als Fehler angesehen wird, wird durch proxy_next_upstream oder fastcgi_next_upstream definiert (außer http_404 Fehler, die nicht zu max_fails zählen).

fail_timeout = TIME - die Zeit, während die muss * max_fails auftritt * Anzahl von Fehlversuchen bei der Kommunikation mit dem Server, der Server außer Betrieb zu betrachten verursachen würde, und auch die Zeit, für die der Server außer Betrieb betrachtet werden (bevor ein anderer Versuch unternommen wird). Wenn nicht eingestellt, beträgt die Zeit 10 Sekunden. fail_timeout hat nichts mit Upstream-Antwortzeit zu tun, benutze proxy_connect_timeout und proxy_read_timeout um dies zu kontrollieren.

down - markiert den Server als permanent offline, um mit der Direktive ip_hash verwendet zu werden.

Sicherung - (0,6.7 oder höher) verwendet nur auf diesen Server, wenn die Nicht-Backup-Server alle oder beschäftigt sind (nicht mit der Richtlinie ip_hash)

EXAMPLE generic 

    upstream my_upstream_name { 
     server backend1.example.com weight=5; 
     server 127.0.0.1:8080   max_fails=3 fail_timeout=30s; 
     server unix:/tmp/backend3; 
    } 
// proxy_pass http://my_upstream_name; 

tho diese ist, was Sie brauchen, verwendet werden:

wenn u nur wollen, für eine App de Last zwischen vhosts steuern:

upstream my_upstream_name{ 
      server 127.0.0.1:8080   max_fails=3 fail_timeout=30s; 
      server 127.0.0.1:8081   max_fails=3 fail_timeout=30s; 
      server 127.0.0.1:8082   max_fails=3 fail_timeout=30s; 
      server 127.0.0.1:8083 backup; 
// proxy_pass http://my_upstream_name; 
// amazingness no.1, the keyword "backup" means that this server should only be used when the rest are non-responsive 
    } 

wenn u 2 oder mehr Anwendungen haben: 1 Upstream pro App wie:

upstream my_upstream_name{ 
       server 127.0.0.1:8080   max_fails=3 fail_timeout=30s; 
       server 127.0.0.1:8081   max_fails=3 fail_timeout=30s; 
       server 127.0.0.1:8082   max_fails=3 fail_timeout=30s; 
       server 127.0.0.1:8083 backup; 
      } 
upstream my_upstream_name_app2 { 
       server 127.0.0.1:8084   max_fails=3 fail_timeout=30s; 
       server 127.0.0.1:8085   max_fails=3 fail_timeout=30s; 
       server 127.0.0.1:8086   max_fails=3 fail_timeout=30s; 
       server 127.0.0.1:8087 backup; 
      } 
upstream my_upstream_name_app3 { 
       server 127.0.0.1:8088   max_fails=3 fail_timeout=30s; 
       server 127.0.0.1:8089   max_fails=3 fail_timeout=30s; 
       server 127.0.0.1:8090   max_fails=3 fail_timeout=30s; 
       server 127.0.0.1:8091 backup; 
      } 

hoffe es hilft.

+2

, die hier eine sweeeeet Antwort ist! Habe eine Verbesserung :) –

+0

Das ist eine tolle Antwort, danke. Meine einzige Frage ist, dass ich nicht versuche, ein Round-Robin zu machen (was du teilweise angesprochen hast). Ich werde die richtigen Upstream-Einträge hinzufügen, aber ich bin neugierig ... sind meine Standorteinträge in Ordnung? – jak119

+0

Ich empfehle die nächste: Wenn App1 ist die Kern-App und die App2 sind ein "Kind von app1". Ihr Standort ist in Ordnung. Sie können auch beide auf/app1 und/app2 setzen. Boll – jmingov

0

Leute, die nach einer Alternative für Nginx suchen: Installieren Sie das Cluster-Paket für jede Meteor-App und das Paket wird automatisch mit dem Lastenausgleich umgehen. https://github.com/meteorhacks/cluster

Wie es einzurichten:

# You can use your existing MONGO_URL for this 
export CLUSTER_DISCOVERY_URL=mongodb://host:port/db, 
# this is the direct URL to your server (it could be a private URL) 
export CLUSTER_ENDPOINT_URL=http://ipaddress 
# mark your server as a web service (you can set any name for this) 
export CLUSTER_SERVICE=web 

Beispielaufbau:

{ 
    "ip-1": { 
    "endpointUrl": "http://ip-1", 
    "balancerUrl": "https://one.bulletproofmeteor.com" 
    }, 
    "ip-2": { 
    "endpointUrl": "http://ip-2", 
    "balancerUrl": "https://two.bulletproofmeteor.com" 
    }, 
    "ip-3": { 
    "endpointUrl": "http://ip-3", 
    "balancerUrl": "https://three.bulletproofmeteor.com" 
    }, 
    "ip-4": { 
    "endpointUrl": "http://ip-4" 
    } 
}