将 Elastic Beanstalk 与 Django 通道结合使用时出现 Websocket 错误

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

我正在尝试让一个由 django 通道支持的聊天应用程序在带有负载均衡器的 AWS Elastic Beanstalk 上运行。

我基本上修改了 https://github.com/jacobian/channels-example 中的代码以使用 Elastic Beanstalk。我能够使用命令在本地成功运行它

python manage.py runserver

问题是当我使用 Elastic Beanstalk 部署它时,启动聊天应用程序时出现以下错误

WebSocket connection to 'wss://mydomain.com/test/' failed: Error 
during WebSocket handshake: Unexpected response code: 200

我尝试了https://stackoverflow.com/a/29831723/3667089提出的解决方案,但它只是显示了不同的错误代码

WebSocket connection to 'wss://mydomain.com/test/websocket' failed: 
Error during WebSocket handshake: Unexpected response code: 404

我还已经将负载均衡器侦听器端口更改为 TCP 80 并获取了 SSL 证书,以将安全侦听器端口更改为 SSL 443,但仍然遇到相同的错误。

我还阅读了AWS Elastic Beanstalk上带有socket.io的Websockets,但没有为Django配置代理服务器的选项,我认为它默认使用Apache。

为了让 Elastic Beanstalk 正常工作,我还缺少什么配置?

有什么方法可以改变这个,以便我们可以使用asgi运行daphne服务器吗?

django websocket redis amazon-elastic-beanstalk django-channels
2个回答
1
投票

我没有使用 Elastic Beanstalk,但这是我的 VPS 配置。 Ubuntu 14.04,带有 nginx 和supervisor。 Supervisor 的工作是确保服务器和工作进程始终运行。 Nginx 监听本地主机上的 8000 端口并将其转发到 8080 和 443。

# nginx.conf
server {
    listen 8080 default_server;
    server_name example.com;
    return 301 https://example.com$request_uri;
}

server {
    listen 443 default_server ssl;
    server_name example.com;

    # ... SSL stuff

    # Send root to the ASGI server
    location / {
        proxy_pass http://localhost:8000;
        proxy_http_version 1.1;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $host;
    }

    # Static Files
    location /static/ {
        root /home/ubuntu/project;
    }

    # Media Files
    location /media/ {
        root /home/ubuntu/project;
    }
}

这是我的主管配置。我只需重新启动主管即可启动服务器

sudo service supervisor restart

# supervisord.conf
[program:project_server]
directory=/home/ubuntu/project/
command=/home/ubuntu/project/venv/bin/daphne project.asgi:channel_layer --port 8000 --bind 0.0.0.0

[program:project_worker]
process_name=project_worker%(process_num)s
numprocs=3
directory=/home/ubuntu/project/
command=/home/ubuntu/project/venv/bin/python /home/ubuntu/project/manage.py runworker

[group:project]
programs=project_server,project_worker

0
投票

我认为您的问题可能仅与负载均衡器有关,您必须创建新证书并将其应用到您的负载均衡器,以便它们允许您的 ec2 计算机实例和 Web 套接字 url 之间的通信。

&

解决此问题的另一种方法是您可以使用 EC2 服务器 IP 地址,如下所示:“ ws//:129.12.11.54 ”但这不是与 django 通道的 websocket 通信的有效方法,这种方式可能会损害您的privay 并且使用这种方式您无法获得安全的网络套接字连接,您将得到“ ws //:”而不是“ wss://”

我也遇到了同样的问题,如果您有有效的解决方案,请也传达给我......

© www.soinside.com 2019 - 2024. All rights reserved.