如何在Windows上正确部署Django Channels并配置可扩展的Daphne服务?
我之前在Windows服务器上部署Django Channels项目时踩过不少坑,折腾出一套稳定可行的方案,刚好能解决你的问题,分享给你:
一、先搞定基础环境和项目配置
首先确保你的Python环境没问题,先安装必要的依赖:
pip install django channels daphne channels-redis
(channels-redis是用来做WebSocket消息跨进程同步的,如果你打算用多进程模式,这个是必须的;单进程的话可以暂时不用,但推荐装上以备扩展)
接下来修改Django项目的配置:
- 在
settings.py里,把daphne和channels加到INSTALLED_APPS最前面(因为Daphne需要优先加载):
INSTALLED_APPS = [ 'daphne', 'channels', # 你的其他app... ]
- 配置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)], }, }, }
- 调整
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服务,配置简单还自带日志管理。
步骤如下:
- 下载NSSM:取对应32/64位版本解压到固定路径(比如
C:\nssm),然后把这个路径加到系统PATH环境变量里,方便命令行调用。 - 以管理员身份打开命令提示符(CMD),运行以下命令打开NSSM图形配置界面:
nssm install DaphneChannelsService
- 在弹出窗口里配置:
- 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
- Path:选择你的Python解释器路径,比如
- Details标签:设置服务的显示名称和描述,方便识别
- Log标签:配置日志文件路径,比如
C:\Logs\daphne_stdout.log和C:\Logs\daphne_stderr.log,方便排查问题 - Log On标签:默认用Local System账户即可,若项目需访问网络共享资源,可切换到指定用户
- Application标签:
- 配置完成后点击
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。
四、关键注意事项
- 静态文件处理:Daphne本身不负责处理静态文件,可通过两种方式解决:
- 用IIS做反向代理,静态文件请求转发到IIS,WebSocket和HTTP请求转发到Daphne
- 用
whitenoise库让Django直接处理静态文件(适合小型项目,配置简单)
- 防火墙设置:确保Windows防火墙开放了你指定的端口(比如8000),否则外部无法访问服务
- Redis服务:若用多进程模式,必须确保Redis在Windows上正常运行(可下载Windows版本并安装为服务),否则不同进程间的WebSocket消息无法同步,会导致部分客户端收不到消息
- 启动失败排查:若服务启动失败,先查看NSSM配置的日志文件,或直接在命令行运行Daphne启动命令,排查依赖缺失、配置错误等问题
内容的提问来源于stack exchange,提问作者Mirdalan




