Django Channels Nginx 制作
Posted
技术标签:
【中文标题】Django Channels Nginx 制作【英文标题】:Django Channels Nginx production 【发布时间】:2018-02-20 20:40:13 【问题描述】:我有一个 django 项目,最近添加了使用 websockets 的频道。这似乎一切正常,但我遇到的问题是准备好生产。
我的设置如下:
nginx web server
Gunicorn for django
SSL enabled
因为我已将频道添加到混音中。我花了最后一天试图让它工作。
在所有教程中,他们都说你在某个端口上运行 daphne,然后展示如何为此设置 nginx。
但是让 gunicorn 为 django 服务怎么样?
所以现在我有 guncorn 在 8001 上运行这个 django 应用程序
如果我在另一个端口上运行 daphne,比如说 8002 - 它应该如何知道这个 django 项目的标准?那么运行工作者呢?
Gunicorn、Daphne 和 runworkers 应该一起跑步吗?
【问题讨论】:
我不确定您是否真的需要两者?我没有和达芙妮合作过,所以我可能错了。请检查此线程是否有任何帮助***.com/questions/42417919/… 【参考方案1】:这个问题其实在最新的Django Channels docs中已经解决了:
使用通用路径前缀(如 /ws/)是一种很好的做法 区分 WebSocket 连接和普通 HTTP 连接 因为它会使将 Channels 部署到生产环境中 某些配置更容易。
特别是对于大型网站,可以配置一个 像 nginx 这样的生产级 HTTP 服务器来路由请求 (1) 生产级 WSGI 服务器(如 Gunicorn+Django)的路径 用于普通 HTTP 请求或 (2) 生产级 ASGI 服务器,例如 用于 WebSocket 请求的 Daphne+Channels。
请注意,对于较小的站点,您可以使用更简单的部署策略 Daphne 服务于所有请求——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 套接字文件。)
【讨论】:
如果我理解得很好,gunicorn 代替工人?所以不需要运行python manage.py runworker
?
做了一些测试后没有,没有必要使用'runworker'。
python manage.py runworker
仅在 Django Channels 2.x 中需要,如果您想使用通道来运行工作进程或后台进程 (channels.readthedocs.io/en/latest/topics/worker.html)。通常,您会为此使用 celery 之类的东西(他们提到了为什么在包含的文档链接中)。
在 Channels 3.0.3 中也是这样吗?
我只是看了一下 v3 发行说明,它看起来应该不会对部署产生任何影响。文档 (channels.readthedocs.io/en/stable/…) 中包含的官方部署指南也建议上述解决方案仍然有效。如果您发现其他问题,请在此处添加您的答案或让我知道,以便我调查并更新我的答案。【参考方案2】:
我创建了一个example 如何混合 Django Channels 和 Django Rest Framework。我设置了 nginx 路由:
websockets 连接将连接到 daphne 服务器 HTTP 连接 (REST API) 将连接到 gunicorn 服务器这是我的 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;
【讨论】:
【参考方案3】:我最近回答了一个类似的question,看看那里有关 django 频道如何工作的解释。
基本上,您不再需要 gunicorn。您有 daphne,它是接受 HTTP/Websockets 的接口服务器,并且您有运行 django 视图的工作人员。那么很明显,您的频道后端将所有内容粘合在一起。
要使其工作,您必须在 settings.py 中配置 CHANNEL_LAYERS
并运行接口服务器:
$ daphne my_project.asgi:channel_layer
和你的工人:
$ python manage.py runworker
注意!如果您选择 redis 作为通道后端,请注意您提供的文件大小。如果您有大型静态文件,请确保 NGINX 为它们提供服务,否则客户端将遇到由于 redis 内存不足而可能发生的神秘错误。
【讨论】:
我不建议将 daphne 用作 HTTP 的 WSGI,因为它比接收 HTTP 流量的 gunicorn worker 需要更多资源 不建议在生产中使用 daphne 谁建议在生产中反对 Daphne?不是官方的 Django-channels 文档。 channels.readthedocs.io/en/stable/deploying.html以上是关于Django Channels Nginx 制作的主要内容,如果未能解决你的问题,请参考以下文章
使用 nginx 和 daphne 部署 django、channels 和 websockets
无法使用 django-channels 连接到 websocket,docker 上的 nginx 作为服务
Django Channels 没有检测到 NGINX 的 WebSocket 请求
Ubuntu + Django(DRF) + channels(websocket)+NGINX + uwsgi 环境部署