在阿里云部署 Django 应用程序是一个常见且成熟的需求。下面我将为你提供一套完整、可操作、面向生产环境的部署方案,涵盖从资源准备到上线运行的关键步骤(以 ECS + Nginx + Gunicorn + PostgreSQL 为例):
✅ 一、前期准备
1. 购买并配置阿里云 ECS 实例
- 选择 Ubuntu 22.04 LTS 或 CentOS 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.log 和 journalctl -u gunicorn |
🚀 进阶选项(按需选用)
- 容器化部署:Docker + Docker Compose → 推送到 ACR(阿里云容器镜像服务)→ 运行于 ACK(Kubernetes)
- Serverless:函数计算 FC + API Gateway(适合轻量级接口)
- 多环境管理:开发/测试/生产分离,用不同 RDS 实例 + 域名子域区分
需要我为你生成:
- 完整的
docker-compose.yml模板? - 自动化部署脚本(Ansible / Shell)?
- 针对特定需求(如 Celery 异步任务、Redis 缓存、文件上传 OSS)的配置指南?
欢迎告诉我你的具体场景,我可以进一步定制方案!
CLOUD技术博