Масштабирование сокета.ввод-вывод Node.js Приложение, использующее Cloud Foundry и пакет сборки NginX

#node.js #nginx #socket.io #ibm-cloud #cloud-foundry

#node.js #nginx #socket.io #ibm-cloud #cloud-foundry

Вопрос:

Я пытаюсь масштабировать свой сокет.ввод-вывод Node.js горизонтальный сервер с использованием Cloud Foundry (в IBM Cloud).

На данный момент мой manifest.yml для cf выглядит так:

 applications:
  - name: chat-app-server
    memory: 512M
    instances: 2
    buildpacks:
      - nginx_buildpack
 

Таким образом, развертывание выполняется, но, конечно, соединения сокетов между клиентом и сервером завершаются сбоем, поскольку соединение не является липким.

Официальный сокет.в документации по вводу-выводу приведен пример использования NginX для использования нескольких узлов. При использовании пользовательского файла nginx.conf с использованием Socket.io шаблон Мне не хватает некоторой информации (выделено символом ???).

 events { worker_connections 1024; }

http {

  server {
    listen {{port}};
    server_name ???;

    location / {


        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $host;

        proxy_pass http://nodes;

        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }

  }

    upstream nodes {
       # enable sticky session based on IP
       ip_hash;

       server ???:???;
       server ???:???;
  }
}
 

Я пытался выяснить, где cloud foundry запускает два экземпляра, указанные в файле manifest.yml, но безуспешно.

Как мне получить требуемые адреса / порты сервера из Cloud foundry? Есть ли способ динамически получать эту информацию из CF?

Я развертываю свое приложение с помощью cf push .

Ответ №1:

Я не использовал сокет.Ввод-вывод раньше, так что я могу быть не в курсе, но из быстрого чтения документов кажется, что все должно просто работать.

Два пункта из документации:

a.) При использовании WebSockets это не проблема. Cloud Foundry полностью поддерживает WebSockets. Надеюсь, большинство ваших клиентов могут это сделать.

б.) При возврате к длительному опросу вам понадобятся липкие сеансы. Cloud Foundry поддерживает готовые сеансы, поэтому, опять же, это должно просто работать. Однако есть одно предостережение относительно поддержки CF липких сеансов: ожидается, что имя файла cookie сеанса будет JSESSIONID .

Опять же, я не очень хорошо знаком с Socket.Ввод-вывод, но я подозреваю, что по умолчанию он, вероятно, использует другое имя файла cookie сеанса (большинство вещей за пределами Java делают). Вам просто нужно изменить имя файла cookie сеанса на JSESSIONID и липкие сеансы должны работать.

СОВЕТ: вы можете проверить имя файла cookie сеанса, просмотрев свои файлы cookie в инструментах разработчика вашего браузера.

Последнее замечание. Вам здесь вообще не нужен Nginx. Gorouter, который является уровнем маршрутизации Cloud Foundry, будет обрабатывать поддержку привязанных сеансов для вас.

Комментарии:

1. Большое вам спасибо. Похоже, что NginX не работает вместе с развертываниями Cloud Foundry, хотя они предлагают пользовательский пакет сборки. Добавление файла cookie JSESSIONID в запросы действительно было правильным способом сделать это. В Express. JS вы можете использовать express-session в качестве промежуточного программного обеспечения, добавив пользовательский файл cookie. Это решение отлично работает для Chrome, но вызывает проблемы с Safari и вкладками инкогнито в Chrome. Я получаю много сообщений с 400 ошибочными запросами. Есть идеи, что вызывает эти ошибки и есть ли способ их избежать?

2. Nginx отлично работает на CF. Это просто не обязательно для того, что вы здесь делаете. Нет никаких видимых причин добавлять еще один уровень прокси. Это только добавит задержки и создаст для вас больше работы.

3. Я не знаю о 400-х годах. Проверьте средства разработки вашего браузера, чтобы убедиться, что он возвращает заголовок Set-Cookie из вашего приложения и что у него правильное имя cookie. Кроме того, посмотрите на свое приложение и посмотрите, почему оно возвращает значение 400. Обычно это означает, что приложению что-то не нравится в запросе, выполняемом клиентом, но только ваше приложение будет точно знать, что неверно.