简体   繁体   English

Django频道+ Elastic Beanstalk

[英]Django Channels + Elastic Beanstalk

I've set up an Application load balancer that redirects /ws/ requests to port 5000 where I have Daphne running along with 4 workers (that reload via Supervisord). 我已经设置了一个应用程序负载平衡器,该负载平衡器将/ws/请求重定向到端口5000,其中达芙妮与4个工作程序一起运行(通过Supervisord重新加载)。 However, in the Chrome console I get the error 但是,在Chrome控制台中,我得到了错误

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

when attempting to connect to my WebSocket via simple JavaScript code (see Multichat for something quite close). 尝试通过简单的JavaScript代码连接到我的WebSocket时(请参阅Multichat中的相关内容)。 Any ideas? 有任何想法吗?

Routing.py Routing.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),
]

Settings.py Settings.py

# Channel settings
CHANNEL_LAYERS = {
"default": {
    "BACKEND": "asgi_redis.RedisChannelLayer",
    "CONFIG": {
        "hosts": ["redis://:xxxxx@xxxx-redis.xxxxx.1234.usxx.cache.amazonaws.com:6379/0"],
    },
    "ROUTING": "Project.routing.channel_routing",
},

}

Supervisord.conf 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 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

workers.out.log workers.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 code that runs before failure 失败前运行的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);

Evidently, there is no relevant output in the daphne/worker logs which implies the connection is potentially not being correctly routed in the first place. 显然,daphne / worker日志中没有相关的输出,这意味着该连接可能一开始就没有正确路由。

Everything was set up properly--'twas a permissions issue. 一切都设置正确-这是权限问题。 Pay close attention to all relevant AWS security groups (both the load balancer and instances that are a member of the target group). 密切注意所有相关的AWS安全组(负载均衡器和属于目标组的实例)。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM