Nginx服务器Daphne Channels配置问题:服务启动后自动停止
解决Daphne启动后秒停及WebSocket连接失败问题
一、先排查Daphne进程正常退出的核心原因
从systemctl status输出看,Daphne是正常退出(status=0/SUCCESS),而非崩溃,说明启动命令或初始化环节存在静默问题,先从手动验证入手:
1. 手动执行Daphne启动命令看实时输出
直接在服务器上运行启动命令,能直观看到初始化时的报错(比如配置加载失败、依赖缺失、端口占用等):
cd /home/ubuntu/projects/my_app /home/ubuntu/projects/my_app/env/bin/daphne -b 0.0.0.0 -p 8001 my_app.asgi:application
2. 简化Daphne服务的启动命令
当前daphne.service的ExecStart命令冗余,直接调用虚拟环境内的daphne即可,无需额外嵌套python:
# /etc/systemd/system/daphne.service [Service] # 替换原ExecStart为以下内容 ExecStart=/home/ubuntu/projects/my_app/env/bin/daphne -b 0.0.0.0 -p 8001 my_app.asgi:application
修改后重载配置并重启服务:
sudo systemctl daemon-reload sudo systemctl restart daphne
二、修正ASGI配置的关键错误
1. 调整Django Settings路径
asgi.py里的settings路径写法错误,Django默认识别根配置模块,无需加.__init__:
# my_app/asgi.py # 替换原配置行 os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'my_app.settings')
2. 补全Channels核心配置
确保settings.py中包含Channels的必要配置:
INSTALLED_APPS = [ # ...其他已安装应用 'channels', ] # 指定ASGI应用入口 ASGI_APPLICATION = 'my_app.asgi.application' # 通道层配置(即使不用Redis,也建议保留基础配置) CHANNEL_LAYERS = { "default": { "BACKEND": "channels.layers.InMemoryChannelLayer" }, }
缺少CHANNEL_LAYERS可能导致部分Channels版本启动后静默退出。
三、修复Nginx的WebSocket转发问题
1. 去掉硬编码的Origin头
当前Nginx配置中硬写的Origin会导致前端真实Origin与校验规则冲突,直接删除该行:
location /ws/ { proxy_pass http://websocket; proxy_http_version 1.1; # 删除以下硬编码行 # proxy_set_header Origin "ws://mydomain.com:8001"; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Host $server_name; }
2. 确认路由匹配逻辑
Nginx的location /ws/转发后,Daphne收到的路径是/ws/video/start/,与你的consumer路由re_path(r"ws/video/start/$", ...)完全匹配,当前路由逻辑是正确的,无需调整。
四、拆分Gunicorn与Daphne的职责
当前Gunicorn使用UvicornWorker运行ASGI应用,会和Daphne产生职责重叠,建议让Gunicorn只处理HTTP请求:
# /etc/systemd/system/gunicorn.service ExecStart=/home/ubuntu/projects/my_app/env/bin/gunicorn \ --access-logfile - \ # 去掉uvicorn worker配置 --workers 3 \ --bind unix:/run/gunicorn.sock \ my_app.wsgi:application # 改用WSGI应用入口
五、验证修复效果
修改所有配置后,重启全部服务:
sudo systemctl restart gunicorn.socket gunicorn.service daphne.service nginx
检查Daphne是否持续运行:
sudo systemctl status daphne.service # 或查看进程是否存在 ps aux | grep daphne
若Daphne正常运行,再测试WebSocket连接,观察Nginx日志是否还有404报错。
内容的提问来源于stack exchange,提问作者k_k
相关产品推荐
相关产品推荐

