You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 17:53:17