Каналы Django + эластичный бобовый стебель

Я настроил балансировщик нагрузки приложений, который перенаправляет /ws/ запросы на порт 5000, где у меня работает Daphne вместе с 4 рабочими (которые перезагружаются через Supervisord). Однако в консоли Chrome я получаю сообщение об ошибке

WebSocket connection to 'wss://api.example.com/ws/' failed: WebSocket is closed before the connection is established.

при попытке подключиться к моему WebSocket с помощью простого кода JavaScript (см. Мультичат что-то совсем близкое). Любые идеи?

Маршрутизация.py

websocket_routing = [
# Called when WebSockets connect
route("websocket.connect", ws_connect),

# Called when WebSockets get sent a data frame
route("websocket.receive", ws_receive),

# Called when WebSockets disconnect
route("websocket.disconnect", ws_disconnect),
]

Настройки.py

# Channel settings
CHANNEL_LAYERS = {
"default": {
    "BACKEND": "asgi_redis.RedisChannelLayer",
    "CONFIG": {
        "hosts": ["redis://:[email protected]:6379/0"],
    },
    "ROUTING": "Project.routing.channel_routing",
},

}

Supervisord.conf

[program:Daphne]
environment=PATH="/opt/python/run/venv/bin"
environment=LD_LIBRARY_PATH="/usr/local/lib"
command=/opt/python/run/venv/bin/daphne -b 0.0.0.0 -p 5000 Project.asgi:channel_layer
directory=/opt/python/current/app
autostart=true
autorestart=true
redirect_stderr=true
stdout_logfile=/tmp/daphne.out.log
[program:Worker]
environment=PATH="/opt/python/run/venv/bin"
environment=LD_LIBRARY_PATH="/usr/local/lib"
command=/opt/python/run/venv/bin/python manage.py runworker -v2
directory=/opt/python/current/app
process_name=%(program_name)s_%(process_num)02d
numprocs=4
autostart=true
autorestart=true
redirect_stderr=true
stdout_logfile=/tmp/workers.out.log

daphne.out.log

2017-03-05 00:58:24,168 INFO     Starting server at tcp:port=5000:interface=0.0.0.0, channel layer Project.asgi:channel_layer.
2017-03-05 00:58:24,179 INFO     Using busy-loop synchronous mode on channel layer
2017-03-05 00:58:24,182 INFO     Listening on endpoint tcp:port=5000:interface=0.0.0.0

work.out.log

2017-03-05 00:58:25,017 - INFO - runworker - Using single-threaded worker.
2017-03-05 00:58:25,019 - INFO - runworker - Using single-threaded worker.
2017-03-05 00:58:25,010 - INFO - runworker - Using single-threaded worker.
2017-03-05 00:58:25,020 - INFO - runworker - Running worker against channel layer default (asgi_redis.core.RedisChannelLayer)
2017-03-05 00:58:25,020 - INFO - worker - Listening on channels chat.receive, http.request, websocket.connect, websocket.disconnect, websocket.receive
2017-03-05 00:58:25,021 - INFO - runworker - Running worker against channel layer default (asgi_redis.core.RedisChannelLayer)
2017-03-05 00:58:25,021 - INFO - worker - Listening on channels chat.receive, http.request, websocket.connect, websocket.disconnect, websocket.receive
2017-03-05 00:58:25,021 - INFO - runworker - Running worker against channel layer default (asgi_redis.core.RedisChannelLayer)
2017-03-05 00:58:25,022 - INFO - worker - Listening on channels chat.receive, http.request, websocket.connect, websocket.disconnect, websocket.receive
2017-03-05 00:58:25,029 - INFO - runworker - Using single-threaded worker.
2017-03-05 00:58:25,029 - INFO - runworker - Running worker against channel layer default (asgi_redis.core.RedisChannelLayer)
2017-03-05 00:58:25,030 - INFO - worker - Listening on channels chat.receive, http.request, websocket.connect, websocket.disconnect, websocket.receive

Код JavaScript, который выполняется до сбоя

// Correctly decide between ws:// and wss://
var ws_scheme = window.location.protocol == "https:" ? "wss" : "ws";
var ws_path = ws_scheme + '://' + window.location.host + "/ws/";
console.log("Connecting to " + ws_path);
var socket = new ReconnectingWebSocket(ws_path);

Очевидно, что в журналах daphne/worker нет соответствующего вывода, что подразумевает, что соединение изначально потенциально неправильно маршрутизируется.


person Faris Sbahi    schedule 05.03.2017    source источник


Ответы (1)


Все было настроено правильно - это проблема с разрешениями. Обратите особое внимание на все соответствующие группы безопасности AWS (как на балансировщик нагрузки, так и на инстансы, входящие в целевую группу).

person Faris Sbahi    schedule 15.05.2017
comment
Привет @Фарис. Как вы отключили обычный скрипт супервизора wsgi. Также вам пришлось внести изменения в файлы конфигурации apache, чтобы включить поддержку ws. Спасибо - person Dr Manhattan; 28.05.2017
comment
wsgi все еще работает на порту 80, daphne работает на порту 5000. Также я не думаю, что wsgi управляется супервизором на эластичном бобовом стебле, кто-то поправит меня, если я ошибаюсь, но единственный процесс, который я вижу, это httpd - person Dr Manhattan; 11.08.2017