Настройка балансировки нагрузки для маршрутизации на разные страницы экземпляра? - PullRequest
0 голосов
/ 25 октября 2018
  • У меня есть балансировщик нагрузки AWS перед экземпляром x.
  • Экземпляр x работает на порту 3000. Экземпляр x имеет две страницы, то есть x / abc и x / zyx.
  • В настоящее время балансировщик нагрузки x имеет два прослушивателя, то есть 80 -> 3000 и 8080 -> 3000,И пинг на /

Требование : у меня есть два сервера, которые хотят связаться с экземпляром х.Сервер 1 хочет отправить запрос http на x / abc, а сервер 2 хочет отправить запрос http на x / zyx.

Как настроить LB для маршрутизации на определенные страницы, например, x /abc и x / zyx? ИЛИ писать мои запросы по-разному?

Код 1: Сервер 1 хочет сделать http-запрос к x / abc

// url is the DNS of load balancer... this should go to x/abc(?)
request({
    url: "LoadBalancer-11122232.us-west-2.elb.amazonaws.com:80",
    method: "POST",
    json: true,  
    body: tweetJSON
}

Код 2: Сервер 2 хочет сделать http-запрос к x / zyx

// url is the DNS of load balancer... this should go to x/abc 
// DO I EVEN NEED TWO DIFFERENT PORT LISTENERS(?)
    request({
        url: "LoadBalancer-11122232.us-west-2.elb.amazonaws.com:8080",
        method: "POST",
        json: true,  
        body: tweetJSON
    }

Ответы [ 2 ]

0 голосов
/ 25 октября 2018

Вы не настраиваете балансировщик нагрузки для маршрутизации запросов к различным конечным точкам, это скорее работа обратного прокси-сервера, например Nginx .

Балансировщик нагрузки предоставляет одну конечную точку длязвонить и перенаправлять запросы от клиентов на один из множества идентичных серверов.Цель состоит в том, чтобы разделить высокие нагрузки на многие серверы.

В вашей ситуации у вас все еще может быть балансировщик нагрузки, но что касается маршрутизации, я предлагаю вам полностью обратиться к URL:

Код 1: Сервер 1 хочет сделатьHTTP-запрос к x / abc

// url is the DNS of load balancer plus the route (/abc)
request({
    url: "https://LoadBalancer-11122232.us-west-2.elb.amazonaws.com/abc",
    method: "POST",
    json: true,  
    body: tweetJSON
}

Код 2: Сервер 2 хочет сделать http-запрос к x / zyx

// url is the DNS of load balancer plus the route (/zyx)
request({
    url: "https://LoadBalancer-11122232.us-west-2.elb.amazonaws.com/zyx",
    method: "POST",
    json: true,  
    body: tweetJSON
}

Если вам нужно запретить клиентам переходить на внутренний URL-адрес,вам нужна некоторая форма аутентификации для идентификации сервера 2.

0 голосов
/ 25 октября 2018

Обычно вы используете балансировщик нагрузки для балансировки трафика между серверами двух узлов.

Таким образом, у вас есть два довольно простых варианта.Во-первых, вместо использования классического балансировщика нагрузки Amazon (ELB), вы можете переключиться на ALB (Application Load Balancer).

Для настройки следуйте этим инструкциям Amazon .

Обратите особое внимание на последний раздел :

На вкладке «Слушатели» используйте стрелку, чтобы просмотреть правила для слушателя, а затем выберите «Добавить правило».,Укажите правило следующим образом:

В качестве имени целевой группы выберите вторую созданную целевую группу.

В качестве шаблона пути укажите точный шаблон, который будет использоваться для маршрутизации на основе пути (например,, / img / *).

Для получения дополнительной информации см. Правила прослушивателя.

Более дешевой альтернативой может быть накатывание собственного балансировщика нагрузки с использованием Nginx.Вы могли бы раскрутить экземпляр EC2 с настроенным Nginx AMI.

Тогда вы бы отредактировали свою конфигурацию Nginx, чтобы она выглядела примерно так:

# The Node.js application serving ABC

upstream node_abc {
  server ip.address.node.instance1:3000;
}

# The Node.js application serving XYZ 
upstream node_xyz {
  server ip.address.node.instance2:3000;
}

# Accept connections from clients
server {
  listen 80;
  charset utf-8;
  location /abc {
      proxy_pass http://node_abc;
      proxy_http_version 1.1;
      proxy_set_header Upgrade $http_upgrade;
      proxy_set_header Connection "upgrade";
      proxy_set_header Host $host;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header X-Forwarded-Proto $scheme;
  }
  location /xyz {
    proxy_set_header X-Forwarded-Proto $scheme;
  }
}

Хотя, даже лучше, и то, что ядумаю, что вы действительно хотите, использует nginx в качестве правильного обратного прокси-сервера балансировки нагрузки.Для этого вы должны запустить две копии одного и того же приложения node.js, где каждая из них может ответить на маршруты / abc или / xyz, и сервер страницы.Затем используйте конфигурацию, подобную этой:

#Proper Load Balanced Nginx setup

upstream node_server {
  server ip.address.node.instance1:3000;
  server ip.address.node.instance2:3000;
}

# Accept connections from clients

server {
  listen 80;
  charset utf-8;
  location / {
      proxy_pass http://node_server;
      proxy_http_version 1.1;
      proxy_set_header Upgrade $http_upgrade;
      proxy_set_header Connection "upgrade";
      proxy_set_header Host $host;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header X-Forwarded-Proto $scheme;
  }

Если вы выполните эту последнюю конфигурацию, вам не придется беспокоиться о перезаписи сложных URL на ваших страницах.

Вы получаете преимущество двух отдельных экземпляров узла на отдельных серверах.Поэтому, если один из экземпляров вашего узла выйдет из строя, тогда ваш балансировщик нагрузки будет использовать другой экземпляр узла.(Добавьте маршрут / _health в приложение nodejs, которое отвечает 200 OK)

Вы можете легко выполнить A / B-тестирование, и сине-зеленый развертывается, где вы обновляете только один экземпляр новым кодом, а затем обновляете другой..

Nginx можно настроить для различных стратегий балансировки нагрузки, по умолчанию используется циклический перебор.Вы также можете добавить sticky-сессии, если вам нужно отправлять пользователей в тот же экземпляр узла, когда они начинают сеанс.

...