真正落地的Django自动化部署需三步:1.用rsync增量同步项目(带--delete和StrictHostKeyChecking=no);2.用systemd管理gunicorn(指定www-data用户、绝对路径启动、Restart=always);3.nginx配置中显式透传SCRIPT_NAME与PATH_INFO,并严格校验alias结尾斜杠及reload/restart顺序。

python 自动化部署 Django 项目到 Ubuntu,核心不是写个“一键脚本”就完事——而是把**人手动做的每一步拆解成可验证、可中断、可重试的原子操作**。直接跑一个 sh deploy.sh 很容易卡在 pip 安装失败、端口被占、权限不对、ALLOWED_HOSTS 漏配等地方,最后还得连上去 debug。
下面这三步,是真正能落地、敢上线的自动化逻辑:
用 ssh + rsync 做增量同步,别碰 scp 或 git clone
你本地改了两个文件,没必要重传整个项目;用 git clone 还得在服务器上维护 git 状态,出错后清理麻烦。rsync 是唯一靠谱的选择:
rsync -avz --delete -e "ssh -o StrictHostKeyChecking=no" ./myproject/ root@8.136.33.128:/var/www/myproject/-
--delete保证服务器目录和本地完全一致(但要求你本地git status干净) - 加
-o StrictHostKeyChecking=no避免首次连接卡在 yes/no 提示 - 路径末尾的
/很关键:myproject/同步内容,myproject同步目录本身
用 systemd 管理 gunicorn,而不是前台运行或 nohup
手动执行 gunicorn -c gunicorn_config.py main:app 看似简单,但进程一挂就没了,日志难查,重启不自动。systemd 才是生产环境标准做法:
让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限
- 创建
/etc/systemd/system/myproject.service,内容必须包含User=www-data(别用 root)、WorkingDirectory、Environment="PATH=/var/www/myproject/venv/bin" -
ExecStart要完整写出虚拟环境里gunicorn的绝对路径:/var/www/myproject/venv/bin/gunicorn - 启动后用
sudo systemctl daemon-reload && sudo systemctl start myproject,再用sudo journalctl -u myproject -f实时看日志 - 漏掉
Restart=always或RestartSec=5,服务崩溃后就不会自愈
nginx 配置里必须显式转发 SCRIPT_NAME 和 PATH_INFO
Django 在反向代理后常出现 404 或静态资源 403,根本原因不是权限,而是 WSGI 环境变量没透传。Nginx 默认不转发这些,你得手动加:
- 在
location /块里补这两行:fastcgi_param SCRIPT_NAME "";fastcgi_param PATH_INFO $fastcgi_script_name; - 如果用了子路径部署(比如
/myapp/),SCRIPT_NAME要设为/myapp,且 Django 的FORCE_SCRIPT_NAME = '/myapp'也得同步 - 漏掉
include fastcgi_params;或写成include uwsgi_params;(混用协议)会导致变量全丢 - 静态文件 403 多半是
alias路径结尾少了/,比如alias /var/www/myproject/static/;—— 少这个斜杠,Nginx 就不会拼接请求路径
sudo systemctl restart myproject 和 sudo systemctl reload nginx 的顺序:必须先 reload nginx(让新配置生效),再 restart gunicorn(否则旧进程还在读老代码)。这两个命令不能合并成一个脚本自动执行——因为 nginx reload 失败时,你不该顺手把后端也干掉。

















