我有一个django项目,最近添加了使用websockets的渠道。这似乎一切正常,但我遇到的问题是准备好生产。
我的设置如下:
Nginx web server
Gunicorn for django
SSL enabled
因为我已添加了频道。我花了最后一天试图让它发挥作用。
在所有turtotials上他们说你在某个端口上运行daphne然后显示如何为此设置nginx。
但是有枪炮为django服务呢?
所以现在我有guncorn在8001上运行这个django app
如果我在另一个端口上运行daphne,那就说8002 - 它应该怎么知道这个django项目的标准?跑步工人呢?
Gunicorn,Daphne和跑步者都应该一起跑吗?
答案 0 :(得分:4)
这个问题实际上是在最新的Django Channels docs中解决的:
最好使用/ ws /等通用路径前缀 区分WebSocket连接和普通HTTP连接 因为它将使Channels部署到生产环境中 某些配置更容易。
特别是对于大型网站,可以配置 生产级HTTP服务器(如nginx)可根据以下内容路由请求 (1)生产级WSGI服务器(如Gunicorn + Django)的路径 用于普通的HTTP请求或(2)生产级的ASGI服务器,例如 Daphne +用于WebSocket请求的通道。
请注意,对于较小的站点,您可以使用更简单的部署策略 达芙妮在其中处理所有请求-HTTP和WebSocket-而不是 有一个单独的WSGI服务器。在此部署配置中,否 / ws /等通用路径前缀是必需的。
实际上,您的NGINX配置看起来像(简称为仅包含相关位):
upstream daphne_server {
server unix:/var/www/html/env/run/daphne.sock fail_timeout=0;
}
upstream gunicorn_server {
server unix:/var/www/html/env/run/gunicorn.sock fail_timeout=0;
}
server {
listen 80;
server_name _;
location /ws/ {
proxy_pass http://daphne_server;
}
location / {
proxy_pass http://gunicorn_server;
}
}
(以上假设您将Gunicorn和Daphne服务器绑定到Unix套接字文件。)
答案 1 :(得分:1)
我最近回答了一个类似question的问题,请看看有关django频道如何工作的解释。
基本上,你不再需要枪炮了。您有daphne,它是接受HTTP / Websockets的接口服务器,并且您的工作人员可以运行django视图。那么显然你有你的频道后端将所有东西粘在一起。
要使其正常运行,您必须在settings.py中配置CHANNEL_LAYERS
并运行接口服务器:
$ daphne my_project.asgi:channel_layer
和你的工人:
$ python manage.py runworker
NB!如果您选择redis作为频道后端,请注意您正在投放的文件大小。如果您有大型静态文件,请确保NGINX为其提供服务,否则客户端将遇到由于redis内存不足而可能发生的神秘错误。
答案 2 :(得分:1)
我已经创建了一个example如何混合使用Django Channels和Django Rest Framework。我将Nginx路由设置为:
这是我的Nginx配置文件:
upstream app {
server wsgiserver:8000;
}
upstream ws_server {
server asgiserver:9000;
}
server {
listen 8000 default_server;
listen [::]:8000;
client_max_body_size 20M;
location / {
try_files $uri @proxy_to_app;
}
location /tasks {
try_files $uri @proxy_to_ws;
}
location @proxy_to_ws {
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_redirect off;
proxy_pass http://ws_server;
}
location @proxy_to_app {
proxy_set_header X-Forwarded-Proto https;
proxy_set_header X-Url-Scheme $scheme;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_pass http://app;
}
}