2013-04-29 14 views
10

Rozumiem, że wiele node.js, i zakładam, że przez rozszerzenie Meteor, można uruchomić na jednym serwerze przy użyciu Nginx. Mam zainstalowaną Nginx i działa na serwerze Ubuntu, mogę nawet dostać go, aby odpowiedzieć na żądania i proxy ich do jednej aplikacji mojej. Uderzyłem jednak na blokadę drogi, próbując zmusić Nginx do ruchu proxy do drugiej aplikacji.Problemy z Nginxem i wieloma aplikacjami Meteor/Nodejs

Niektóre tła:

  • 1-ty aplikacja działa na porcie 8001
  • 2-ty aplikacja działa na porcie 8002
  • Nginx nasłuchuje na porcie 80
  • próbujących uzyskać nginx wysłać ruch na/do app jeden i ruch w/app2/do aplikacji dwa
  • Obie aplikacje można uzyskać, przechodząc do domeny: 8001 i domeny: 8002

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

Każdy wgląd, co może się dziać, gdy ruch idzie/app2/bym bardzo wdzięczny!

Odpowiedz

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

następnie

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; 

} 

Kilka wskazówki kontrolują Proxy:

spojrzeć here @nginx docs

następnie jedziemy:

waga = NUMBER - ustaw ciężar serwera, jeśli nie jest ustawiona waga jest równa 1. niewyważenie domyślnego rundy robin.

max_fails = NUMER - liczba nieudanych prób komunikacji z serwerem w terminie (nadany przez parametr fail_timeout) po czym jest uważany nieczynny. Jeśli nie jest ustawiony, liczba prób wynosi jeden. Wartość 0 wyłącza tę kontrolę. To, co jest uważane za niepowodzenie, definiowane jest przez proxy_next_upstream lub fastcgi_next_upstream (z wyjątkiem błędów http_404, które nie liczą się do max_fails).

fail_timeout = czas - czas, w którym musi nastąpić * max_fails * liczba nieudanych prób komunikacji z serwerem, który spowoduje, że serwer uznać nieczynny, a także czas, w którym serwer będzie uznać za bezskuteczny (przed kolejną próbą). Jeśli nie jest ustawiony, czas wynosi 10 sekund. fail_timeout nie ma nic wspólnego z czasem odpowiedzi upstream, użyj proxy_connect_timeout i proxy_read_timeout do kontrolowania tego.

w dół - oznacza serwer jako stały offline, do użycia z dyrektywą ip_hash.

kopia zapasowa - (0.6.7 lub nowszy) używa tylko tego serwera jeśli serwery non-powrotne są w dół lub zajęty (nie może być używany z dyrektywą 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; 

Chciaż to jest to, czego potrzebujesz:

jeśli u po prostu chcą kontrolować de obciążenia pomiędzy vhostów dla jednej aplikacji:

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 
    } 

jeśli u mieć 2 lub więcej aplikacji: 1 przed per aplikacji jak:

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

nadzieję, że to pomaga.

+2

To jedna sweeeeet odpowiedź tutaj! Przebij się! :) –

+0

To wspaniała odpowiedź, dziękuję. Moje jedyne pytanie to to, że nie próbuję zrobić okrągłego robina (o którym częściowo mówiliście). Dodam poprawne pozycje w górę, ale jestem ciekawy ... czy moje wpisy dotyczące lokalizacji są w porządku? – jak119

+0

Polecam następny: jeśli app1 jest podstawową aplikacją, a app2 to "dziecko aplikacji 1". ur lokalizacja jest w porządku. Możesz też umieścić oba na/app1 i/app2. Boll – jmingov

0

Osoby szukające alternatywy dla Nginx: Zainstaluj pakiet klastrowy dla każdej aplikacji Meteor i pakiet będzie obsługiwał automatyczne równoważenie obciążenia. https://github.com/meteorhacks/cluster

Jak ustawić:

# 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 

Przykład Setup:

{ 
    "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" 
    } 
} 
Powiązane problemy