无法使用Nginx + uwsgi + django同时处理websocket和xhr请求

时间:2019-02-22 15:15:32

标签: django nginx websocket uwsgi

我正在尝试使用Nginx + uwsgi + django建立一个网站,其中一项任务需要websocket。该系统在django服务器(python manage.py runserver)中运行良好。但是,当我使用Nginx + uwsgi在AWS上实现此功能时,某处会出错。尽管我修改了Nginx + uwsgi的设置,但发现服务器无法同时处理websocket和xhr请求

具体问题如下:

1)如果我使用uwsgi --socket :8001 --module project.wsgi --http-websockets启动uwsgi,则可以建立websocket,但是django的“ request.websocket”中的消息始终为空,并且uwsgi日志显示warning: async call without async mode

2)接下来,我尝试通过uwsgi --socket :8001 --module project.wsgi --http-websockets --async 10 --ugreen在uwsgi中使用异步模式。在这种情况下,websocket可以正常工作,但其他xhr请求将被阻止并且服务器无法处理,直到websocket结束。例如,如果一个客户端正在使用websocket运行任务,则其他客户端甚至无法登录到网络。

您能帮我解决这个问题吗?

谢谢!

1 个答案:

答案 0 :(得分:0)

您可以根据需要将以下代码段添加到位于sites-available的nginx配置文件中。

这使您可以访问URL ws://wsbackend/wspath/上的websocket

location /ws/ {
        proxy_pass http://unix:/tmp/lcs_daphne.sock;
        proxy_http_version 1.1;

        proxy_read_timeout 86400;
        proxy_redirect     off;

        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Host $server_name;
    }

这是将http请求升级为ws请求的交换协议。

您可以参考this文档以获取有关implementation of websockets using nginx的更多信息