Проблема с Nginx и несколькими приложениями Meteor/Nodejs

Я понимаю, что несколько node.js, и я предполагаю расширение Meteor, можно запускать на одном сервере с помощью Nginx. У меня есть настройка и запуск Nginx на сервере Ubuntu, я могу даже заставить ее отвечать на запросы и прокси-сервера на одно приложение. Тем не менее, я попал в блокпост при попытке получить Nginx для прокси-трафика во второе приложение.

Некоторая предыстория:

  • 1-е приложение, работающее на порту 8001
  • Второе приложение, работающее на порту 8002
  • Nginx, прослушивающий порт 80
  • Попытка заставить nginx отправлять трафик в/в приложение один и трафик в/app2/в приложение два
  • Оба приложения можно найти, перейдя в домен: 8001 и домен: 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";
}
}

Любое понимание того, что может происходить, когда трафик идет в /app 2/, я был бы очень признателен!

Ответ 1

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

, затем

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;

}

Несколько советов управляют прокси:

посмотрите здесь @nginx docs

то здесь мы идем:

weight = NUMBER - задайте вес сервера, если не установлен вес, равен единице. дисбаланс по умолчанию round robin.

max_fails = NUMBER - количество неудачных попыток связи с сервером в течение периода времени (назначенного параметром fail_timeout), после которого он считается неработоспособным. Если не задано, количество попыток равно одному. Значение 0 отключает эту проверку. То, что считается сбоем, определяется proxy_next_upstream или fastcgi_next_upstream (за исключением ошибок http_404, которые не учитываются в max_fails).

fail_timeout = TIME - время, в течение которого должно произойти * max_fails * количество неудачных попыток связи с сервером, что приведет к тому, что сервер будет считаться неработоспособным, а также время, за которое сервер будет считаться неработоспособным (до того, как будет сделана другая попытка). Если не установлено время 10 секунд. fail_timeout не имеет ничего общего с временем ответа на восходящее время, используйте для этого контроль proxy_connect_timeout и proxy_read_timeout.

вниз - помещает сервер как постоянный offline, который будет использоваться с директивой ip_hash.

резервная копия - (0.6.7 или новее) использует этот сервер только в том случае, если серверы без резервного копирования все заняты (не могут использоваться с директивой 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; 

Это то, что вам нужно:

если вы просто хотите контролировать нагрузку между vhosts для одного приложения:

 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
    } 

, если у вас есть 2 или более приложений: 1 вверх по потоку для каждого приложения, например:

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

надеюсь, что это поможет.

Ответ 2

Люди, которые ищут альтернативу для Nginx: установите пакет Cluster для каждого приложения Meteor, и пакет автоматически обработает балансировку нагрузки. https://github.com/meteorhacks/cluster

Как настроить:

# 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

Пример настройки:

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