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

Django+Daphne代码更新后无需重启服务器的热重载方案咨询

可行的无重启热重载方案(Daphne+Nginx架构)

我之前维护类似的Django REST生产环境时也碰到过这个问题——开发服务器的热重载太省心,但生产用Daphne+Nginx就没那么灵活。结合你用cron拉取代码的场景,给你几个不用重启整个服务器的靠谱方案:

方案1:给Daphne发送SIGHUP信号重载Worker

Daphne本身支持通过SIGHUP信号触发Worker重载,这个操作不会终止主进程,Nginx的反向代理连接也不会中断,完美匹配你的需求。你只需要在cron的代码拉取脚本里加几行:

# 1. 拉取最新代码
git pull origin main

# 2. 找到Daphne主进程的PID(根据你的ASGI应用名称调整匹配规则)
DAPHNE_PID=$(pgrep -f "daphne your_project.asgi:application")

# 3. 发送SIGHUP信号触发重载
if [ -n "$DAPHNE_PID" ]; then
  kill -HUP $DAPHNE_PID
  echo "Daphne workers reloaded successfully"
else
  echo "Daphne process not found"
fi

执行后,Daphne会重启所有Worker,自动重新加载最新代码并生成新的.pyc文件,整个过程服务不会中断。

方案2:用Systemd服务重载(如果用Systemd管理Daphne)

如果你的Daphne是通过Systemd作为服务管理的,那可以直接利用Systemd的重载机制,更规范可靠。

首先确保你的daphne.service配置文件里加上重载指令:

[Service]
ExecStart=/path/to/venv/bin/daphne your_project.asgi:application
ExecReload=/bin/kill -HUP $MAINPID
Restart=always

然后在cron脚本里替换信号发送的步骤为:

git pull origin main
systemctl reload daphne.service

Systemd会自动处理PID查找和信号发送,还能记录日志,方便排查问题。

方案3:清理旧Pyc文件+重载(解决Pyc缓存遗留问题)

有时候旧的.pyc文件可能不会被自动覆盖,导致新代码不生效。可以在拉取代码后先清理缓存,再触发重载:

git pull origin main

# 清理项目目录下的所有pyc文件和__pycache__文件夹
PROJECT_PATH="/path/to/your/django/project"
find $PROJECT_PATH -name "*.pyc" -delete
find $PROJECT_PATH -name "__pycache__" -type d -exec rm -r {} +

# 重载Daphne Worker
kill -HUP $DAPHNE_PID

这个步骤能确保新生成的.pyc完全基于最新代码,避免缓存导致的奇怪问题。

注意事项

  • 确保执行cron脚本的用户有足够权限:既要能拉取Git代码,也要能给Daphne进程发送信号。
  • Git拉取时要处理冲突:建议在脚本里加上错误判断,如果git pull失败就不要触发重载,避免服务异常。
  • Nginx无需重启:因为Nginx只是反向代理到Daphne主进程,重载Worker不会影响主进程的监听端口,所以Nginx这边完全不用动。

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

火山引擎 最新活动