You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在Windows上正确部署Django Channels并配置可扩展的Daphne服务?

我之前在Windows服务器上部署Django Channels项目时踩过不少坑,折腾出一套稳定可行的方案,刚好能解决你的问题,分享给你:

一、先搞定基础环境和项目配置

首先确保你的Python环境没问题,先安装必要的依赖:

pip install django channels daphne channels-redis

channels-redis是用来做WebSocket消息跨进程同步的,如果你打算用多进程模式,这个是必须的;单进程的话可以暂时不用,但推荐装上以备扩展)

接下来修改Django项目的配置:

  1. settings.py里,把daphnechannels加到INSTALLED_APPS最前面(因为Daphne需要优先加载):
INSTALLED_APPS = [
    'daphne',
    'channels',
    # 你的其他app...
]
  1. 配置ASGI应用和通道层:
# settings.py末尾添加
ASGI_APPLICATION = 'your_project_name.asgi.application'

CHANNEL_LAYERS = {
    'default': {
        'BACKEND': 'channels_redis.core.RedisChannelLayer',
        'CONFIG': {
            "hosts": [('127.0.0.1', 6379)],
        },
    },
}
  1. 调整asgi.py文件(如果没有就新建),确保它能正确加载Django和Channels路由:
import os
import django
from channels.routing import ProtocolTypeRouter, URLRouter
from django.core.asgi import get_asgi_application

# 设置Django环境
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'your_project_name.settings')
django.setup()

# 导入你的WebSocket路由(请替换成你自己的路由文件)
from your_app.routing import websocket_urlpatterns

application = ProtocolTypeRouter({
    # HTTP请求交给Django处理
    "http": get_asgi_application(),
    # WebSocket请求交给Channels路由处理
    "websocket": URLRouter(websocket_urlpatterns),
})

二、部署Daphne为Windows服务(最优方案:NSSM)

Windows上没有像Linux的systemd那样友好的进程管理器,但**NSSM(Non-Sucking Service Manager)**是个绝佳替代——它能把任意命令行程序包装成Windows服务,配置简单还自带日志管理。

步骤如下:

  1. 下载NSSM:取对应32/64位版本解压到固定路径(比如C:\nssm),然后把这个路径加到系统PATH环境变量里,方便命令行调用。
  2. 管理员身份打开命令提示符(CMD),运行以下命令打开NSSM图形配置界面:
nssm install DaphneChannelsService
  1. 在弹出窗口里配置:
    • Application标签
      • Path:选择你的Python解释器路径,比如C:\Python39\python.exe(替换成你自己的Python路径)
      • Arguments:填写Daphne启动命令,示例:
        -m daphne -b 0.0.0.0 -p 8000 --workers 4 --threads 8 your_project_name.asgi:application
        
        参数说明:
        • -b 0.0.0.0:允许所有IP访问
        • -p 8000:监听端口(按需修改)
        • --workers 4:启动4个进程(根据服务器CPU核心数调整,8核可设为6-8)
        • --threads 8:每个进程的线程数(按需调整)
      • Working Directory:选择你的Django项目根目录,比如C:\Projects\my_django_channels_project
    • Details标签:设置服务的显示名称和描述,方便识别
    • Log标签:配置日志文件路径,比如C:\Logs\daphne_stdout.logC:\Logs\daphne_stderr.log,方便排查问题
    • Log On标签:默认用Local System账户即可,若项目需访问网络共享资源,可切换到指定用户
  2. 配置完成后点击Install Service,服务就安装好了。

之后你可以通过以下命令管理服务:

  • 启动:nssm start DaphneChannelsService
  • 停止:nssm stop DaphneChannelsService
  • 修改配置:nssm edit DaphneChannelsService
  • 删除服务:nssm remove DaphneChannelsService

也可以在Windows「服务」管理器里找到该服务,设置为自动启动,实现服务器重启后自动运行。

三、替代方案:用Windows自带的sc命令

如果你不想额外安装工具,也可以用Windows自带的sc命令创建服务,但配置繁琐易出错,示例命令如下(替换成你的实际路径):

sc create DaphneService binPath= "\"C:\Python39\python.exe\" -m daphne -b 0.0.0.0 -p 8000 --workers 4 your_project_name.asgi:application" start= auto DisplayName= "Daphne Django Channels Service"

注意:binPath=后面的空格不能省略,路径里的引号要转义(用\"),且这种方式无日志管理,排查问题较麻烦,更推荐NSSM。

四、关键注意事项

  1. 静态文件处理:Daphne本身不负责处理静态文件,可通过两种方式解决:
    • 用IIS做反向代理,静态文件请求转发到IIS,WebSocket和HTTP请求转发到Daphne
    • whitenoise库让Django直接处理静态文件(适合小型项目,配置简单)
  2. 防火墙设置:确保Windows防火墙开放了你指定的端口(比如8000),否则外部无法访问服务
  3. Redis服务:若用多进程模式,必须确保Redis在Windows上正常运行(可下载Windows版本并安装为服务),否则不同进程间的WebSocket消息无法同步,会导致部分客户端收不到消息
  4. 启动失败排查:若服务启动失败,先查看NSSM配置的日志文件,或直接在命令行运行Daphne启动命令,排查依赖缺失、配置错误等问题

内容的提问来源于stack exchange,提问作者Mirdalan

火山引擎 最新活动