2013-04-29 12 views
10

Capisco che più node.js, e presumo per estensione Meteor, può essere eseguito su un server utilizzando Nginx. Ho installato Nginx e sto girando su un server Ubuntu bene, posso persino farlo rispondere alle richieste e assegnarle a una mia applicazione. Ho comunque colpito un roadblock quando cercavo di ottenere da Nginx il traffico proxy verso la seconda applicazione.Problemi con Nginx e Multiple Meteor/Nodejs App

Alcuni retroscena:

  • prima applicazione in esecuzione sulla porta 8001
  • seconda applicazione in esecuzione sulla porta 8002
  • Nginx in ascolto sulla porta 80
  • Cercando di ottenere nginx per inviare traffico a/a App uno e il traffico a/app2/a app due
  • Entrambe le app possono essere raggiunte andando al dominio: 8001 e dominio: 8002

mio 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"; 
} 
} 

Tutta la comprensione di ciò che potrebbe essere in corso quando il traffico va a/app2/sarei molto grato!

risposta

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

poi

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; 

} 

Alcuni suggerimenti controllano il proxy:

dare un'occhiata here docs @nginx

allora qui andiamo:

peso = NUMERO - imposta il peso del server, se non impostato il peso è uguale a uno. sbilanciare il round robin predefinito.

max_fails = numero - numero di tentativi infruttuosi a comunicare con il server entro il periodo di tempo (assegnato dal parametro fail_timeout) dopo di che si è ritenuto inoperante. Se non impostato, il numero di tentativi è uno. Un valore pari a 0 disattiva questo controllo. Quello che è considerato un fallimento è definito da proxy_next_upstream o fastcgi_next_upstream (tranne gli errori http_404 che non vengono conteggiati per max_fails).

fail_timeout = TIME - il tempo durante il quale deve essere max_fails * * numero di tentativi falliti di comunicazione con il server che potrebbe causare il server da considerare inoperante, e anche il tempo per il quale il server sarà considerata inoperante (prima che venga fatto un altro tentativo). Se non impostato, il tempo è 10 secondi. fail_timeout non ha nulla a che fare con il tempo di risposta upstream, usa proxy_connect_timeout e proxy_read_timeout per controllarlo.

in basso - contrassegna il server come permanentemente offline, da utilizzare con la direttiva ip_hash.

backup - (0.6.7 o successiva) utilizza solo questo server se i server non di backup sono tutti verso il basso o occupato (non possono essere utilizzate con la direttiva 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 questi è quello che vi serve:

se u vogliono solo controllare de carico tra vhosts per un'app:

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 
    } 

se la u ha 2 o più applicazioni: 1 a monte per app come:

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

spero che sia d'aiuto.

+2

Questa è una risposta sweeeeet proprio qui! Avere un upvote :) –

+0

Questa è una risposta sorprendente, grazie. La mia unica domanda è che non sto provando a fare un round robin (che tu hai parzialmente indirizzato). Aggiungerò le voci corrette a monte ma sono curioso ... le mie voci di posizione sono a posto? – jak119

+0

raccomando il successivo: se app1 è l'app principale e l'app2 è un "figlio di app1". la tua posizione è ok. Puoi anche mettere entrambi su/app1 e/app2. Boll – jmingov

0

Utenti che cercano un'alternativa a Nginx: installare il pacchetto Cluster per ogni applicazione Meteor e il pacchetto gestirà automaticamente il bilanciamento del carico. https://github.com/meteorhacks/cluster

Come configurarlo: impostazione

# 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 

Esempio:

{ 
    "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" 
    } 
}