在 nginx 后面使用 Daphne

Posted

技术标签:

【中文标题】在 nginx 后面使用 Daphne【英文标题】:Using Daphne behind nginx 【发布时间】:2018-11-20 09:25:13 【问题描述】:

我有一个 Django 应用程序,它使用 uWSGI 和 nginx 进行生产部署。现在我正在集成 Channels 2.0,并意识到 Daphne 是 uwsgi 的替代品。我可以让 Daphne 在独立模式下运行它,但是当我尝试在 nginx 代理后面运行它时,我不断收到连接超时 (504)

我的 nginx 配置文件是我为 uWSGI 服务器配置的,我希望它能够正常工作,因为套接字名称是相同的。

可能的问题

从 nginx 日志中的样子来看,nginx 尝试连接到 uwsgi://unix:///path/to/nginx.sock,但我认为它不应该以 uwsgi 为前缀,而应该只是 unix:///path/to/nginx.sock

后续问题

是否推荐使用 Daphne 来同时提供 http 和 websocket 服务?或者我应该将 uWSGI 用于 http,而 Daphne 仅用于 websocket。 如果两者都使用 Daphne,我是否正确保留相同的 uwsgi_params 文件?

settings.py

INSTALLED_APPS = [
    'django.contrib.auth',
    'django.contrib.admin',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'django_celery_results',
    'home',
    'corsheaders',
    'rest_framework',
    'channels'
]

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'corsheaders.middleware.CorsMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware'
]

WSGI_APPLICATION = 'home.wsgi.application'

ASGI_APPLICATION = "home.routing.application"

CHANNEL_LAYERS = 
    "default": 
        "BACKEND": "channels_redis.core.RedisChannelLayer",
        "CONFIG": 
            "hosts": [(REDIS_HOST, REDIS_PORT)],
        ,
    ,

asgi.py

import os
import django
from channels.routing import get_default_application

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "home.settings_dev")
django.setup()
application = get_default_application()

nginx.conf

upstream home 
  server unix:///Users/pranavprakash/workspace/HomeApp/nginx.sock;


# configuration of the server
server 
  # the port your site will be served on
  listen      80;
  # the domain name it will serve for
  server_name localhost; # substitute your machine's IP address or FQDN
  charset     utf-8;

  # max upload size
  client_max_body_size 75M;   # adjust to taste

  # Django media
  location /media  
    alias /Users/pranavprakash/workspace/HomeApp/media;
  

  location /static 
    alias /Users/pranavprakash/workspace/HomeApp/staticfiles;
  

  # Finally, send all non-media requests to the Django server.
  location / 
    uwsgi_pass  home;
    include     /Users/pranavprakash/workspace/HomeApp/uwsgi_params;
  

Daphne 服务器日志

daphne -u nginx.sock home.asgi:application

2018-06-11 07:09:27,062 INFO     Starting server at unix:nginx.sock
2018-06-11 07:09:27,062 INFO     HTTP/2 support not enabled (install the http2 and tls Twisted extras)
2018-06-11 07:09:27,063 INFO     Configuring endpoint unix:nginx.sock

Nginx 日志

2018/06/11 12:41:09 [error] 56711#0: *1 upstream timed out (60: Operation timed out) while reading response header from upstream, client: 127.0.0.1, server: localhost, request: "GET / HTTP/1.1", upstream: "uwsgi://unix:///Users/pranavprakash/workspace/HomeApp/nginx.sock", host: "localhost"
2018/06/11 12:41:47 [info] 56711#0: *1 kevent() reported that client 127.0.0.1 closed keepalive connection

【问题讨论】:

【参考方案1】:

如果我理解正确,uwsgi 不再提供上游的“家”服务,请尝试将uwsgi_pass home; 更改为proxy_pass home;

【讨论】:

以上是关于在 nginx 后面使用 Daphne的主要内容,如果未能解决你的问题,请参考以下文章

在负载均衡器后面运行多个 daphne 实例:django-channels

使用 nginx 和 daphne 部署 django、channels 和 websockets

使用 Daphne 和 Nginx 部署 django 频道的问题

使用 SSL 使用 Daphne + NGINX 部署 Django 通道

使用 nginx、django、daphne 部署到 docker

开始使用 Django 频道时遇到问题