Django频道制作Nginx

时间:2017-09-12 11:39:59

标签: django nginx gunicorn django-channels daphne

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

我的设置如下:

Nginx web server
Gunicorn for django
SSL enabled

因为我已添加了频道。我花了最后一天试图让它发挥作用。

在所有turtotials上他们说你在某个端口上运行daphne然后显示如何为此设置nginx。

但是有枪炮为django服务呢?

所以现在我有guncorn在8001上运行这个django app

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

Gunicorn,Daphne和跑步者都应该一起跑吗?

3 个答案:

答案 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路由设置为:

  • 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;
    }

}