Django Channels Nginx生产

Har*_*rry 6 django nginx gunicorn django-channels daphne

我有一个django项目,最近添加了使用websocket的渠道。这似乎一切正常,但是我的问题是准备生产。

我的设置如下:

Nginx web server
Gunicorn for django
SSL enabled
Run Code Online (Sandbox Code Playgroud)

由于我已经添加了频道。我花了最后一天试图使它工作。

他们说,在所有的turtotials上,您需要在某个端口上运行daphne,然后说明如何为此设置nginx。

但是,让金枪鱼服务于Django呢?

所以现在我已经在8001上运行了这个Django应用程序

如果我在另一个端口上运行daphne,让我们说8002-它应该如何知道这个django项目的标准?那跑工呢?

独角兽,达芙妮和跑步工人应该一起跑步吗?

ppl*_*ski 7

我创建了一个如何混合 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;
    }

}
Run Code Online (Sandbox Code Playgroud)


Kal*_*Kal 6

这个问题实际上是在最新的Django Channels文档中解决的

优良作法是使用/ ws /之类的通用路径前缀将WebSocket连接与普通HTTP连接区分开来,因为这将使在某些配置中将Channels部署到生产环境更加容易。

特别是对于大型站点,可以配置诸如nginx之类的生产级HTTP服务器,以基于以下路径的请求来路由请求:(1)普通HTTP请求的生产级WSGI服务器(如Gunicorn + Django),或(2)生产WebSocket请求的Daphne + Channels等高级ASGI服务器。

请注意,对于较小的站点,您可以使用更简单的部署策略,其中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;
  }
}
Run Code Online (Sandbox Code Playgroud)

(以上假设您将Gunicorn和Daphne服务器绑定到Unix套接字文件。)


r00*_*00m 2

我最近回答了一个类似的问题,看看那里有关于 django 通道如何工作的解释。

基本上,你不再需要gunicorn了。您有 daphne,它是接受 HTTP/Websockets 的接口服务器,并且您有运行 django 视图的工作人员。显然,您拥有将所有内容粘合在一起的通道后端。

要使其正常工作,您必须CHANNEL_LAYERS在 settings.py 中进行配置并运行接口服务器:

$ daphne my_project.asgi:channel_layer

和你的工人:

$ python 管理.py runworker

注意!如果您选择 Redis 作为通道后端,请注意您所服务的文件大小。如果您有大型静态文件,请确保 NGINX 为它们提供服务,否则客户端将遇到由于 Redis 内存不足而可能发生的神秘错误。

  • 谁建议不要在生产中使用 Daphne?不是官方 Django-channels 文档。https://channels.readthedocs.io/en/stable/deploying.html (4认同)