Ubuntu服务器运行Gunicorn时Git拉取的新代码未生效如何解决?
这种情况我在部署Django项目时碰到过好多次,大概率是缓存残留、进程没彻底重启或者代码拉取的小问题,咱们一步步来排查解决:
第一步:先确认代码真的拉取到服务器的项目目录了?
别笑,有时候真的会犯这种低级错误——比如拉取代码时进错了目录,或者拉取过程中出现冲突没解决,导致最新代码根本没同步过来。
- 先进入你的Django项目根目录:
cd /path/to/your/django/project - 查看当前分支的最新提交:
git log -1,对比Git服务器上的最新commit哈希值,确认是不是一致 - 如果有冲突,先解决冲突再重新拉取:
git pull origin your-branch
第二步:确保Gunicorn真的彻底重启了
重载Gunicorn有时候不足以让新代码生效,尤其是当代码涉及到模块级别的变更时。
- 如果用systemd管理Gunicorn,先看状态确认是否运行正常:
sudo systemctl status gunicorn,注意看Active状态和进程ID(PID)有没有变化 - 直接彻底重启比重载更靠谱:
sudo systemctl restart gunicorn,甚至可以先停再启:sudo systemctl stop gunicorn && sudo systemctl start gunicorn - 如果你用了虚拟环境,拉取代码后如果新增了依赖,一定要重新安装:
source /path/to/your/venv/bin/activate && pip install -r requirements.txt,不然新代码里的依赖缺失会导致Gunicorn启动失败,继续跑旧进程
第三步:清理Django的缓存和编译文件
Django会自动编译.py文件成.pyc,还有可能缓存模板或数据,这些都会导致旧代码残留:
- 删除项目里的所有编译文件:
find . -name "*.pyc" -delete && rm -rf __pycache__ - 清理Django的内置缓存(Django 4.2+可用):
python manage.py clearcache,如果是旧版本,可以手动删除缓存后端的存储(比如Redis、Memcached里的对应键,或者本地缓存目录)
第四步:更新静态资源并清理Nginx缓存
如果修改了CSS、JS、图片这类静态文件,别忘了同步和清理缓存:
- 重新收集静态文件到Nginx指向的目录:
python manage.py collectstatic --noinput - 重启Nginx确保配置和静态文件生效:
sudo systemctl restart nginx - 如果Nginx配置了静态文件缓存,可以临时注释掉缓存配置测试,或者手动删除Nginx的缓存目录(比如
/var/cache/nginx/下的文件)
第五步:杀掉残留的Gunicorn进程
有时候重启Gunicorn后,旧的worker进程还在偷偷运行,继续服务旧代码:
- 查看所有Gunicorn相关进程:
ps aux | grep gunicorn - 杀掉所有Gunicorn进程:
sudo pkill -f gunicorn - 然后重新启动Gunicorn:
sudo systemctl start gunicorn
第六步:检查数据库迁移和其他编译操作
如果修改了models或者翻译文件,别忘了执行对应的操作:
- 运行数据库迁移:
python manage.py makemigrations && python manage.py migrate - 如果更新了翻译文件,重新编译:
python manage.py compilemessages
一般按这个流程走下来,新代码就能正常生效了。如果还是不行,可以查看Gunicorn的日志(比如/var/log/gunicorn/error.log)和Nginx的日志(/var/log/nginx/error.log),看看有没有报错信息,这往往能定位到问题所在。
内容的提问来源于stack exchange,提问作者reza_khalafi
相关产品推荐
相关产品推荐

