我正在尝试使用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运行任务,则其他客户端甚至无法登录到网络。
您能帮我解决这个问题吗?
谢谢!
答案 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的更多信息