如何在阿里云部署Django应用程序?

在阿里云部署 Django 应用程序是一个常见且成熟的需求。下面我将为你提供一套完整、可操作、面向生产环境的部署方案,涵盖从资源准备到上线运行的关键步骤(以 ECS + Nginx + Gunicorn + PostgreSQL 为例):


✅ 一、前期准备

1. 购买并配置阿里云 ECS 实例

  • 选择 Ubuntu 22.04 LTSCentOS 7/8(推荐 Ubuntu,社区支持好)
  • 至少 2C4G(小型项目),根据负载调整
  • 安全组开放端口:
    • 22(SSH)
    • 80(HTTP)
    • 443(HTTPS,可选)
    • 不直接暴露 Django 默认端口 8000

2. 创建数据库(推荐 RDS MySQL/PostgreSQL)

  • 使用 阿里云 RDS 托管数据库(比自建更稳定、易备份)
  • 开启白名单:将 ECS 内网 IP 加入白名单
  • 创建数据库和用户,记录连接信息(host, port, dbname, user, password)

💡 若为测试/学习用途,也可在 ECS 本地安装 PostgreSQL,但生产环境强烈建议用 RDS。


✅ 二、ECS 服务器端部署步骤(以 Ubuntu 22.04 为例)

1. 登录并更新系统

sudo apt update && sudo apt upgrade -y

2. 安装基础依赖

# Python 3.10+
sudo apt install python3-pip python3-venv python3-dev libpq-dev nginx -y

# PostgreSQL 客户端(若连 RDS)
sudo apt install postgresql-client -y

3. 创建项目目录与虚拟环境

cd /opt
sudo mkdir django-app
sudo chown $USER:$USER django-app
cd django-app

python3 -m venv venv
source venv/bin/activate

pip install --upgrade pip
pip install gunicorn psycopg2-binary Pillow  # 其他依赖按需添加

4. 上传代码(两种方式)

方式 A:Git 拉取(推荐)

git clone https://github.com/your-repo/django-project.git .

方式 B:SCP 上传本地文件

scp -r /local/path/* user@your-ecs-ip:/opt/django-app/

⚠️ 确保 .env 或敏感配置不要提交到 Git!改用环境变量或阿里云 SSM Parameter Store / Secrets Manager。


✅ 三、Django 配置优化(生产模式)

编辑 settings.py

DEBUG = False
ALLOWED_HOSTS = ['your-domain.com', 'localhost']  # 替换为你的域名或IP

# 静态文件处理(关键!)
STATIC_ROOT = '/opt/django-app/staticfiles'
STATIC_URL = '/static/'
MEDIA_ROOT = '/opt/django-app/media'
MEDIA_URL = '/media/'

# 数据库(示例:RDS PostgreSQL)
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': os.getenv('DB_NAME'),
        'USER': os.getenv('DB_USER'),
        'PASSWORD': os.getenv('DB_PASSWORD'),
        'HOST': os.getenv('DB_HOST'),
        'PORT': '5432',
    }
}

# 环境变量加载(推荐 .env 文件 + python-decouple 或 django-environ)
import environ
env = environ.Env()
environ.Env.read_env(os.path.join(BASE_DIR, '.env'))

✅ 创建 .env 文件(禁止提交到 Git):

SECRET_KEY=your-secret-key-here
DB_NAME=mydb
DB_USER=appuser
DB_PASSWORD=strong-password
DB_HOST=rds-xxx.rds.aliyuncs.com

收集静态文件

python manage.py collectstatic --noinput

执行迁移

python manage.py migrate

创建超级用户(可选)

python manage.py createsuperuser

✅ 四、启动 Gunicorn(WSGI 服务)

方法:使用 systemd 管理进程(推荐)

创建服务文件 /etc/systemd/system/gunicorn.service

[Unit]
Description=gunicorn daemon for my-django-app
After=network.target

[Service]
User=ubuntu
Group=www-data
WorkingDirectory=/opt/django-app
Environment="PATH=/opt/django-app/venv/bin"
ExecStart=/opt/django-app/venv/bin/gunicorn 
    --workers 3 
    --bind unix:/opt/django-app/gunicorn.sock 
    myproject.wsgi:application

Restart=on-failure

[Install]
WantedBy=multi-user.target

🔁 替换 myproject 为你的 Django 项目名称(即含 wsgi.py 的目录名)

启用并启动:

sudo systemctl daemon-reload
sudo systemctl enable gunicorn
sudo systemctl start gunicorn
sudo systemctl status gunicorn

✅ 五、配置 Nginx 反向X_X

创建站点配置 /etc/nginx/sites-available/my-django-app

server {
    listen 80;
    server_name your-domain.com www.your-domain.com;

    location /static/ {
        alias /opt/django-app/staticfiles/;
        expires 30d;
        add_header Cache-Control "public, immutable";
    }

    location /media/ {
        alias /opt/django-app/media/;
        expires 7d;
    }

    location / {
        include proxy_params;
        proxy_pass http://unix:/opt/django-app/gunicorn.sock;
        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-Proto $scheme;
    }
}

启用站点:

sudo ln -s /etc/nginx/sites-available/my-django-app /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl restart nginx

✅ 六、(可选)配置 HTTPS(Let’s Encrypt)

sudo apt install certbot python3-certbot-nginx -y
sudo certbot --nginx -d your-domain.com -d www.your-domain.com

按提示完成验证,自动配置重定向和证书续期。


✅ 七、监控与维护建议

项目 工具/方法
日志查看 journalctl -u gunicorn -f;Nginx 访问/错误日志在 /var/log/nginx/
健康检查 配置 Nginx 返回状态码,配合云监控(CloudMonitor)设置告警
自动备份 RDS 自动快照 + 脚本定期备份 staticfiles/, media/ 到 OSS
弹性伸缩 结合 SLB + Auto Scaling Group(适合高并发场景)
CI/CD 集成 GitHub Actions / 阿里云 CodePipeline 实现自动部署

📌 常见问题排查

问题 解决方案
403 Forbidden on static files 检查 collectstatic 输出路径权限:sudo chmod -R 755 /opt/django-app/staticfiles
Gunicorn 无法启动 检查 gunicorn.sock 权限:chmod 666 /opt/django-app/gunicorn.sock(临时)或调整 User/Group
数据库连接失败 确认 RDS 白名单包含 ECS 内网 IP;检查防火墙(ufw 或安全组)
页面显示空白页 查看 /var/log/nginx/error.logjournalctl -u gunicorn

🚀 进阶选项(按需选用)

  • 容器化部署:Docker + Docker Compose → 推送到 ACR(阿里云容器镜像服务)→ 运行于 ACK(Kubernetes)
  • Serverless:函数计算 FC + API Gateway(适合轻量级接口)
  • 多环境管理:开发/测试/生产分离,用不同 RDS 实例 + 域名子域区分

需要我为你生成:

  • 完整的 docker-compose.yml 模板?
  • 自动化部署脚本(Ansible / Shell)?
  • 针对特定需求(如 Celery 异步任务、Redis 缓存、文件上传 OSS)的配置指南?

欢迎告诉我你的具体场景,我可以进一步定制方案!

未经允许不得转载:CLOUD技术博 » 如何在阿里云部署Django应用程序?