部署在 AWS ec2 实例(Ubuntu 1.18.0)代理服务器中时,Django 通道 wss 套接字无法工作

问题描述 投票:0回答:1

在我们的 Django 项目中,我们使用带有 wss 套接字连接的 django 通道。通过套接字发送数据时,部署在 AWS ec2 实例 (Ubuntu nginx/1.18.0) 代理服务器中时它不起作用。 给出以下错误:

chat/:1211 WebSocket connection to 'wss://chatbot.abc.com/ws/chat/room1/' failed: i n aws ec2 instance as docker image 2 / 2

为什么会这样?

django django-channels aws-ec2-instance-connect
1个回答
0
投票

问题不是很详细,但答案在于 Daphne 与 Django Channels 的用法。 Daphne 在您的 nginx 服务器代码和 python 应用程序之间工作,将流量引导到需要的地方。

在此实例中,我们的 websocket 在我们的服务器本地运行。与其他设置不同,我们不会联系另一台服务器来连接到此 Websocket,而是联系本地系统上的端口。然而,正如您所知,我们需要在在线生产服务器上使用

wss
https
,而不是
ws
http
。因为我们的 websocket 在服务器本地运行,所以我们的系统将其识别为
ws
连接,而不是
wss
连接。因此,我们需要在 nginx 服务器配置中将
ws
重定向到
wss

有许多不同类型的 Web 服务器可以与 Django/Django Channels 一起使用。您必须弄清楚如何在您的配置中执行此操作。这里有一些不错的答案可以帮助您入门:Nginx 反向代理 Websockets

这是我如何在 Apache 中解决问题的示例:

RewriteEngine on
RewriteCond %{HTTP:UPGRADE} ^WebSocket$ [NC,OR]
RewriteCond %{HTTP:CONNECTION} ^Upgrade$ [NC]
RewriteRule .* ws://127.0.0.1:8001%{REQUEST_URI} [P,QSA,L]
ProxyPass /wss/ wss://127.0.0.1:8001/
ProxyPassReverse /wss/ wss://127.0.0.1:8001/
...
SSLEngine on
SSLCertificateFile /etc/ssl/certificate.crt
SSLCertificateKeyFile /etc/ssl/private/private.key
SSLCertificateChainFile /etc/ssl/ca_bundle.crt

在生产中,您还需要 SSL 认证以确保加密连接,并且您需要在 daphne 指令中指定这一点。

daphne -b 0.0.0.0 -p 8001 django_project.asgi:application // Local Development Level
daphne -e ssl:443:privateKey=key.pem:certKey=crt.pem django_project.asgi:application // Production Level
© www.soinside.com 2019 - 2024. All rights reserved.