在我们的 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
为什么会这样?
问题不是很详细,但答案在于 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