Django 项目在阿里云 Ubuntu 上的完整部署流程(含注意事项&常见坑)

85 阅读5分钟

0. 环境准备(SSH 登录/基础工具)

  • 用 SSH 连接你的服务器:

    bash复制编辑ssh root@47.120.45.1
    
  • 更新系统,安装必要工具(如已安装可略过):

    bash复制编辑sudo apt update && sudo apt upgrade -y
    sudo apt install git curl vim python3 python3-pip python3-venv -y
    

1. 项目代码准备与虚拟环境

1.1 上传项目代码到服务器

  • 推荐用 git clone,也可以用 scpftp 上传代码到 /srv/medical-companion-server-python 目录。

1.2 进入项目目录并创建虚拟环境

bash复制编辑cd /srv/medical-companion-server-python
python3 -m venv venv      # 注意:使用系统自带 venv,不要用 pip install virtualenv,否则会报“externally-managed-environment”错误
source venv/bin/activate
  • 注意: 没有 venv/bin/activate 是因为没创建虚拟环境,先执行 python3 -m venv venv

2. 安装依赖

  • 如果有 requirements.txt

    bash复制编辑pip install -r requirements.txt
    
  • 如果没有,手动安装所需库(如 Django、djangorestframework、mysqlclient 等):

    bash复制编辑pip install django djangorestframework mysqlclient drf-yasg
    

3. MySQL 数据库配置

3.1 MySQL 安装与创建数据库

  • (如已安装可跳过)安装 MySQL:

    bash复制编辑sudo apt install mysql-server libmysqlclient-dev
    
  • 登录 MySQL 创建数据库和授权账号(如果已创建可跳过):

    sql复制编辑CREATE DATABASE medical_companion_system DEFAULT CHARACTER SET utf8mb4;
    GRANT ALL PRIVILEGES ON medical_companion_system.* TO 'root'@'%' IDENTIFIED BY 'Wanglizhi2$';
    FLUSH PRIVILEGES;
    

3.2 settings.py 配置

  • 检查你的 settings.py 数据库配置(注意端口字段应该是 PORT,不是 POST!):

    python复制编辑DATABASES = {
        "default": {
            "ENGINE": "django.db.backends.mysql",
            "NAME": "medical_companion_system",
            "USER": "root",
            "PASSWORD": "Wanglizhi2$",
            "HOST": "47.120.45.1",
            "PORT": 3306,
        }
    }
    
  • 注意事项:

    • 配置错端口字段会导致连接失败。

    • MySQL 用户需有远程权限(如果数据库和 web 分别在不同服务器)。

4. 项目基础配置

  • 修改 settings.py静态资源路径主机名等关键项:

    python复制编辑import os
    STATIC_ROOT = os.path.join(BASE_DIR, 'static')
    ALLOWED_HOSTS = ['47.120.45.1', 'localhost', '127.0.0.1']
    
  • 注意事项:

    • ALLOWED_HOSTS 里必须有公网 IP,才能被外部访问。

    • 部署生产时建议 DEBUG = False,开发测试可以先 DEBUG = True

5. 数据迁移和超级管理员

5.1 迁移数据库表结构

bash复制编辑python manage.py makemigrations
python manage.py migrate
  • 作用: 把 models.py 的结构映射到数据库,创建所需数据表。

5.2 创建超级管理员账户(可选但建议)

bash复制编辑python manage.py createsuperuser
  • 说明: 如果需要用 Django 自带后台,务必创建;不用后台可跳过。

6. 收集静态文件

  • 设置好 STATIC_ROOT 后,执行:

    bash复制编辑python manage.py collectstatic
    
  • 注意事项:

    • 生产环境静态文件需用 Nginx 提供访问,Django 本身不托管静态资源。

7. 运行 Gunicorn(生产部署应用服务器)

7.1 安装 Gunicorn

bash复制编辑pip install gunicorn

7.2 启动 Gunicorn 测试

bash复制编辑gunicorn medical_companion_server.wsgi:application --bind 0.0.0.0:8000
  • 保持终端打开,刷新浏览器看效果。

  • 注意: 关掉终端进程会消失,正式部署需后台启动。

7.3 Gunicorn 后台启动(建议用 nohup 或 supervisor)

  • 快速后台运行:

    bash复制编辑nohup gunicorn medical_companion_server.wsgi:application --bind 0.0.0.0:8000 > gunicorn.log 2>&1 &
    
  • 推荐用 supervisor 保证重启/掉线服务不断,见下方扩展说明。

8. Nginx 反向代理和静态资源托管

8.1 安装 Nginx

bash复制编辑sudo apt install nginx
sudo systemctl start nginx
sudo systemctl enable nginx

8.2 配置 Nginx

  • 编辑 /etc/nginx/sites-available/medcomp(推荐用此新建文件,不要直接改 nginx.conf):

    nginx复制编辑server {
        listen 80;
        server_name 47.120.45.1;
    
        location /static/ {
            alias /srv/medical-companion-server-python/static/;
        }
    
        location / {
            proxy_pass http://127.0.0.1:8000;
            proxy_set_header Host $host;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }
    }
    
  • 建立软链接并重载 Nginx:

    bash复制编辑sudo ln -s /etc/nginx/sites-available/medcomp /etc/nginx/sites-enabled/
    sudo nginx -t
    sudo systemctl reload nginx
    
  • 注意事项:

    • proxy_pass 地址和 Gunicorn 启动端口要完全一致。

    • 每次改配置要 nginx -t 检查并 reload。

9. 防火墙和安全组放行

  • 阿里云安全组: 登录云控制台 → 安全组 → 放行 80 端口(HTTP)、如需 443(HTTPS)也要放。

  • Ubuntu 本地防火墙(如启用):

    bash复制编辑sudo ufw allow 80
    sudo ufw allow 8000
    sudo ufw reload
    

10. 访问网站

  • 用浏览器访问 http://47.120.45.1/ 检查页面能否打开。

  • 后台管理(如创建了管理员):http://47.120.45.1/admin

11. 常见问题与排查

11.1 502 Bad Gateway(Nginx 访问报错)

  • 最常见原因:

    • Gunicorn 没有启动,或端口写错

    • Gunicorn 进程崩溃(数据库连接异常等)

    • Nginx 配置有误,proxy_pass 地址和 Gunicorn 不一致

  • 排查办法:

    1. ps aux | grep gunicorn 确认进程是否存活

    2. netstat -tunlp | grep 8000 检查 8000 端口是否有监听

    3. 检查 Gunicorn 启动命令终端是否报错

    4. 检查 Nginx 配置 proxy_pass 与 Gunicorn 保持一致

    5. 每次改完 Nginx 配置要重载(sudo nginx -t && sudo systemctl reload nginx

11.2 requirements.txt 找不到

  • 只需手动安装项目依赖,后期可用 pip freeze > requirements.txt 生成,方便下次迁移部署。

11.3 端口写错(POST → PORT)

  • 数据库配置用 PORT,写错会导致数据库连接失败。

11.4 静态资源 404

  • 没有执行 python manage.py collectstatic 或 Nginx 静态资源路径 alias 配置错误。

11.5 externally-managed-environment 报错

  • 不要用 pip install --user,要用 python3 -m venv venv 创建虚拟环境,再 source venv/bin/activate

12. 推荐的 Gunicorn 永久运行方式

用 supervisor 守护 Gunicorn(推荐生产环境)

  1. 安装 supervisor:

    bash复制编辑sudo apt install supervisor
    
  2. 新建 /etc/supervisor/conf.d/gunicorn_medcomp.conf 内容如下(注意路径换成你的):

    ini复制编辑[program:gunicorn_medcomp]
    directory=/srv/medical-companion-server-python
    command=/srv/medical-companion-server-python/venv/bin/gunicorn medical_companion_server.wsgi:application --bind 0.0.0.0:8000
    autostart=true
    autorestart=true
    user=root
    stdout_logfile=/srv/medical-companion-server-python/gunicorn_supervisor.log
    stderr_logfile=/srv/medical-companion-server-python/gunicorn_supervisor_error.log
    
  3. 加载并启动:

    bash复制编辑sudo supervisorctl reread
    sudo supervisorctl update
    sudo supervisorctl start gunicorn_medcomp
    
  4. 重启 supervisor 后 Gunicorn 会自动随系统启动、异常自动重启。

总结表

步骤

命令/配置

说明(注意项)

环境准备

apt update、apt install ...

基础包/工具,系统要最新

项目上传

git clone / scp / ftp

推荐用 git,目录结构要对

虚拟环境

python3 -m venv venv + source venv/bin/activate

别用 --user、别忘记激活

依赖安装

pip install -r requirements.txt / 手动装

requirements.txt 没有就手动安装

MySQL 配置

settings.py,注意 PORT,账号权限

HOST/PORT 必须写对

数据迁移

python manage.py makemigrations/migrate

表结构写入数据库

管理员

python manage.py createsuperuser

建议创建,用于后台

静态资源

python manage.py collectstatic

STATIC_ROOT 路径和 nginx 保持一致

Gunicorn 启动

gunicorn medical_companion_server.wsgi:application --bind 0.0.0.0:8000

必须后台或用 supervisor

Nginx 配置

sites-available/medcomp + enable + reload

alias/proxy_pass 必须对应端口

安全组

阿里云后台放行 80,ufw 允许 80/8000

否则外部访问不到

访问

浏览器访问 http://公网IP/

页面正常即成功

哪一步出错或不明白,把命令和报错贴给我,我帮你继续定位
如果你想后续加 React/Vue 管理后台或开启 HTTPS,也可以问我要流程。

如何再次后台启动

ChatGPT 说:

👌 你现在已经杀掉进程了,如果要 再次后台启动 gunicorn,有两种常见方式:

🔹 方法 1:命令行直接后台启动

进入你的项目目录 /srv/medical-companion-server-python

cd /srv/medical-companion-server-python
source venv/bin/activate
gunicorn medical_companion_server.wsgi:application \
  --bind 0.0.0.0:8000 \
  --workers 4 \
  --daemon \
  --pid /tmp/gunicorn.pid

说明:

  • --workers 4:开启 4 个 worker 进程(根据 CPU 调整)

  • --daemon:后台运行(和 -D 一样)

  • --pid /tmp/gunicorn.pid:写入 PID 文件,方便之后停止/重启

🔹 方法 2:用 nohup 后台运行(不依赖 gunicorn 自带的 daemon)

cd /srv/medical-companion-server-python
source venv/bin/activate
nohup gunicorn medical_companion_server.wsgi:application \
  --bind 0.0.0.0:8000 \
  --workers 4 > gunicorn.log 2>&1 &
echo $! > /tmp/gunicorn.pid
  • 日志会输出到 gunicorn.log

  • $! 保存最后一个后台进程的 PID,写入 /tmp/gunicorn.pid

🔹 方法 3(推荐生产环境):用 systemd 管理

写一个 /etc/systemd/system/gunicorn.service,以后就能用:

sudo systemctl start gunicorn
sudo systemctl stop gunicorn
sudo systemctl restart gunicorn