конфигурация для настройки nginx с django и nodejs для websocket (wss://)

У меня есть следующая конфигурация для настройки приложения django, которое будет обслуживаться через uwsgi на nginx.

upstream node{
    server 127.0.0.1:8081  max_fails=1 fail_timeout=20s;

}
server {
    listen 8000 default_server ssl;
    server_name bla.bla;

    ssl_certificate path;
    ssl_certificate_key path;

    location /serve {
        proxy_pass http://node;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $host;
        proxy_cache_bypass 1;
        proxy_no_cache 1;
        proxy_redirect off;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-NginX-Proxy true;
        proxy_connect_timeout 2s;
    }
    location / {
        include         uwsgi_params;
        uwsgi_pass      unix:///var/uwsgi/sel.sock;
    }
}

У меня есть сервер nodejs с сервером веб-сокетов, работающим на порту 8081.

var WebSocketServer = require('ws').Server
  , wss = new WebSocketServer({ port: 8081, path: "/serve" });

Теперь, когда я обращаюсь к серверу веб-сокетов на своей html-странице, используя

var websocket = new WebSocket("wss://host:8081/serve"); // works
var websocket = new WebSocket("wss://host:8000/serve"); // doesn't work get 504 error

Что я делаю не так? Может ли кто-нибудь указать на мою ошибку и показать указатель для ее правильной настройки.

РЕДАКТИРОВАТЬ: моя версия nginx - это версия nginx: nginx/1.4.6 (Ubuntu)


person Pavan K    schedule 12.08.2016    source источник
comment
Вы пытались увеличить значение proxy_connect_timeout?   -  person VBart    schedule 14.08.2016
comment
@VBart да, я поставил 30, все равно не работает.   -  person Pavan K    schedule 14.08.2016
comment
Я не уверен, что этот чат работает, но я видел ваш пост с Node+Nginx+Django+Websocket. Я пытаюсь настроить ту же точную конфигурацию. У вас есть блог или серия ресурсов, которыми вы можете поделиться, чтобы помочь мне с конфигурациями и настройками? Я думаю, что смог создать здесь чат (chat.stackoverflow.com/rooms/ 121421/), но это может не сработать. В любом случае, просто ищу руководство для той же настройки   -  person ThatsRightJack    schedule 20.08.2016


Ответы (1)


wss предполагает зашифрованное соединение WebSocket с использованием TLS. Если wss://host:8081 работает, то ваш node.js прослушивает зашифрованные соединения. Но вы настроили nginx для терминации TLS и проксирования незашифрованных данных.

person VBart    schedule 12.08.2016
comment
Как его правильно настроить? Любые указатели приветствуются? Я пробовал все, но не могу понять это. - person Pavan K; 13.08.2016
comment
@PavanK Прежде всего, проверьте, работает ли URI, который используется с nginx: new WebSocket("wss://host:8081/serve"); - person VBart; 14.08.2016
comment
Да, это работает на этом пути. Я также отредактировал пост с новой конфигурацией. Я выкладывал старый конфиг ранее. - person Pavan K; 14.08.2016
comment
https сделал свое дело. Не могу поверить, что я этого не пробовал. Большое спасибо за твою помощь. Вы можете отредактировать ответ, и я приму его - person Pavan K; 15.08.2016
comment
Но было бы лучше, если бы вы нашли способ настроить nodejs для незашифрованных веб-сокетов. У меня нет опыта работы с nodejs и я не могу с этим помочь. - person VBart; 15.08.2016
comment
Есть ли причина слушать незашифрованные веб-сокеты? Все данные зашифрованы, что хорошо, не так ли? - person Pavan K; 15.08.2016
comment
Это пустая трата ресурсов на шифрование и расшифровку данных только для их передачи между процессами на локальном компьютере. - person VBart; 15.08.2016
comment
О, у меня сложилось впечатление, что зашифрованные данные просто пересылаются на nodejs из веб-сокета html. Я хочу, чтобы мои данные веб-сокета в конечном итоге находились на wss на стороне клиента. Если я слушаю ws://, все данные видны, верно? - person Pavan K; 15.08.2016
comment
Ваш nginx прослушивает зашифрованные данные, затем расшифровывает данные, поэтому он узнает имя хоста и URI запроса. Вам не нужно повторно шифровать его, чтобы перейти к node.js. - person VBart; 15.08.2016