首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >无法使用Nginx和Uvicorn连接到websocket

无法使用Nginx和Uvicorn连接到websocket
EN

Stack Overflow用户
提问于 2021-08-18 07:27:24
回答 1查看 4.9K关注 0票数 6

我用Django、Uvicorn、Nginx和Redis构建了一个码头容器,并且正在使用django-通道,但是当我运行这个容器时,它说它不能连接到websocket,这可以在浏览器控制台中看到:

WebSocket connection to 'ws://127.0.0.1:8080/ws/notifications/' failed

当我使用Django的runserver命令进行开发时,它工作得很好,但是当我包含Nginx和Uvicorn时,它会中断。

Entrypoint.sh:

代码语言:javascript
运行
复制
gunicorn roomway.asgi:application --forwarded-allow-ips='*' --bind 0.0.0.0:8000 -k uvicorn.workers.UvicornWorker

Nginx配置:

代码语言:javascript
运行
复制
upstream django {
    server app:8000;
}

map $http_upgrade $connection_upgrade {
    default upgrade;
    '' close;
}

server {
    listen 8080;

    location /static {
        alias /vol/static;
    }

    location /ws/ {
        proxy_pass http://0.0.0.0:8000;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection $connection_upgrade;
    }

    location / {
        proxy_pass http://django;
        proxy_set_header Host $http_host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection $connection_upgrade;
        proxy_redirect off;
        proxy_buffering off;
    }
}

settings.py:

代码语言:javascript
运行
复制
CHANNEL_LAYERS={
    'default': {
        'BACKEND': 'channels_redis.core.RedisChannelLayer',
        'CONFIG': {
            'hosts': [('redis', 6379)],  #Redis port
        }
    }
}

处理套接字的JS文件:

代码语言:javascript
运行
复制
var wsStart = "ws://"    
var webSocketEndpoint =  wsStart + window.location.host + '/ws/notifications/'
const notificationSocket = new WebSocket(webSocketEndpoint)

asgi.py:

代码语言:javascript
运行
复制
application = ProtocolTypeRouter({
    "http": django_asgi_app,
    "websocket": AuthMiddlewareStack(
        URLRouter([
            url(r'^ws/notifications/', NotificationConsumer.as_asgi()),
            path("ws/<str:room_name>/", ChatConsumer.as_asgi())            
        ])
    )
})

Nginx在上面的代码中抛出这个错误:

代码语言:javascript
运行
复制
[error] 23#23: *4 connect() failed (111: Connection refused) while connecting to upstream, server: , request: "GET /ws/notifications/ HTTP/1.1", upstream: "http://0.0.0.0:8000/ws/notifications/", host: "127.0.0.1:8080"

当我将proxy_pass改为http://django而不是0.0.0.0时,Nginx不再抛出该错误,但我在控制台上得到了相同的错误。同样,这一次Django会抛出以下警告:

代码语言:javascript
运行
复制
[WARNING] Unsupported upgrade request.       
[WARNING] No supported WebSocket library detected. Please use 'pip install uvicorn[standard]', or install 'websockets' or 'wsproto' manually.
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-10-10 20:47:14

正如Iain Shelvington在评论中所指出的,websockets似乎没有包含在uvicorn的基本安装中。

代码语言:javascript
运行
复制
pip uninstall uvicorn
pip install 'uvicorn[standard]'
票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68828128

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档