Проблема с использованием websocket с эластичным beanstalk, nginx и node.js

Я пытаюсь развернуть приложение node.js с sock.js на EB. Веб-сокеты отлично работают без прокси. При использовании прокси-сервера nginx возникла проблема с подключением WS. Я открыл файл .ebextensions / .config:

files:
  "/etc/nginx/conf.d/wssproxy.conf":
    mode: "000644"
    owner: root
    content: |
      map $http_upgrade $connection_upgrade {
        default upgrade;
        ''      close;
      }
      proxy_http_version 1.1;
      proxy_set_header Upgrade $http_upgrade;
      proxy_set_header Connection $connection_upgrade;

Веб-сокеты не работают, но в журнале ошибок nginx указано:

upstream prematurely closed connection while reading upstream, client: 83.219.138.215, server: , request: "POST x/XXXXX/432/2l4e2j6v/xhr_streaming HTTP/1.1", upstream: "http://xxx.0.0.1:8081/XXXXX/432/2l4e2j6v/xhr_streaming", host: "XXXXXX.elasticbeanstalk.com", referrer: "http://XXXXXX.elasticbeanstalk.com/"


person user2279406    schedule 12.11.2014    source источник
comment
интересно, вам удалось заставить это работать. У меня похожая проблема stackoverflow.com/questions/27084124/   -  person aginsburg    schedule 24.11.2014


Ответы (1)


Вероятно, это связано с тем, что ваш балансировщик нагрузки не детерминированно сопоставляет запросы с вышестоящими серверами как на уровне 7 (HTTP), так и на уровне 4 (веб-сокеты). Вы заметите, что предоставленное вами сообщение об ошибке показывает, что вы используете xhr-streaming, который работает на уровне 7. Я предполагаю, что если вы используете только протокол websocket или просто HTTP-опрос, эти ошибки станут более последовательными, но они не будут Уходите.

Вот более подробное объяснение с несколькими возможными решениями. К сожалению, все они довольно неприятны в реализации. Следующий вопрос относится к socket.io, но поскольку вы используете sockjs, идеальное решение немного проще реализовать учитывая использование sockjs специфичных для сервера идентификаторов в путях запросов HTTP-опроса.

Node socket.io при балансировке нагрузки Amazon EC2

Все эти проблемы исчезли бы, если бы можно было использовать метод детерминированной балансировки нагрузки на ELB, такой как хеширование пути IP или HTTP.

person aembke    schedule 23.06.2015