redis 在Django通道中使用Elastic Beanstalk时出现WebSocket错误

ix0qys7i  于 2023-10-15  发布在  Redis
关注(0)|答案(2)|浏览(116)

我正在尝试让一个由django channels提供支持的聊天应用程序在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,但仍然得到相同的错误。
我也读过Websockets with socket.io on AWS Elastic Beanstalk,但没有为Django配置代理服务器的选项,我认为它默认使用Apache。
Elastic Beanstalk的配置中我缺少了什么才能让它工作?
有什么办法可以改变这一点,使我们可以运行daphne服务器与asgi?

czfnxgou

czfnxgou1#

我没有使用Elastic Beanstalk,但这里是我的VPS配置。Ubuntu 14.04,带Nginx和Supervisor。Supervisor的工作是确保服务器和辅助进程始终运行。Nginx监听localhost上的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;
    }
}

下面是我的Supervisor配置。我只需重新启动supervisor 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
erhoui1w

erhoui1w2#

我认为你的问题可能只与负载均衡器有关,你必须创建新证书并将其应用于负载均衡器,以便它们允许ec2机器示例和Web Socket URL之间的通信。
&
解决这个问题的另一种方法是,你可以像这样使用你的EC2服务器IP地址:“ws:129.12.11.54“但这不是一种有效的方式来与django通道的websockets通信,这种方式可能会损害您的隐私,并且使用这种方式您无法获得安全的web sockets连接,您将获得“ws://“而不是“wss://“
我也遇到了同样的问题,如果你有有效的解决办法,请转告我。

相关问题