我相信我遇到了与此处 和此处找到的问题类似的问题。
要点是我在 Amazon-ec2 实例上运行带有通道的 Django 应用程序,并且 websocket 无法连接。
我关于 websockets 的大部分代码都来自这里的 django-channels 教程。
通过应用程序负载均衡器后面的安全 dns 名称引导流量。
我完全在 Daphne 上运行它(处理 https 和 websocket 流量),配置非常少:
daphne -b <server_url> -p <port> test_app.asgi:application
我还使用mozilla-django-oidc模块通过 openID-connect 进行身份验证。但是对于 websocket 测试,我不期待身份验证。我觉得有必要指出这个问题是否与 websocket 身份验证有关。
在开发中,我正在运行一个本地 redis 集群作为我的通道层。我的开发应用程序(所有 http:// 和 ws://)连接到 websocket 没有问题。聊天应用程序按预期工作。我可以连接到我的 websockets 并通过
127.0.0.1:60779 - - [07/Apr/2021:12:06:05] "WSCONNECTING /ws/chat/lobby/"
这是 asgi.py 中的代码
import chat.routing
asgi_app = get_asgi_application()
from channels.auth import AuthMiddlewareStack
application = ProtocolTypeRouter(
{
"http": asgi_app,
"websocket": AuthMiddlewareStack(
URLRouter(chat.routing.websocket_urlpatterns)
),
}
)
以及 chat/routing.py 中的代码
from django.urls import re_path
from . import consumers
websocket_urlpatterns = [
re_path(r'ws/chat/(?P<room_name>\w+)/$', consumers.ChatConsumer.as_asgi()),
]
在生产中,我使用 elasticache redis 集群作为我的通道层。我可以在 django shell 中测试它,它连接/发送/接收。
但是在生产聊天中,我无法到达房间或看到上面的WSCONNECTING消息。它永远不会升级到 websocket 的连接。之后的下一个日志是
2021-04-07 16:15:15,279 WARNING Not Found: /ws/chat/lobby/
就像它试图将该路由解析为 http 而不是 websocket 一样。
在做了一些额外的阅读之后,我尝试使用在 Daphne 上运行的主机/端口,比如
wss://<my host ip>:<port>/ws/chat/lobby
这并没有导致立即失败,但最终从未连接。
(index):46 Uncaught DOMException: Failed to execute 'send' on 'WebSocket': Still in CONNECTING state.
我觉得这与在 websocket url 中用作主机名的面向公众的主机名有关。允许所有入站流量。我不确定这与手头的问题有何关系。
我仍在努力学习如何解决这一切。任何建议都将不胜感激。
谢谢!