在阿里云部署 Django 应用,核心逻辑其实就三步:环境准备 -> 代码上传与配置 -> 反向X_X与域名解析。
别整那些虚的,直接上干货。这里推荐一种最稳定、最符合生产环境标准的方案:Nginx + Gunicorn + Systemd (或 Supervisor)。不要用 Django 自带的 runserver 跑生产环境,那是开发用的,一碰就挂。
第一步:搞定服务器(ECS)
-
选购 ECS:
- 系统选 Ubuntu 20.04/22.04 LTS 或 CentOS 7/8(推荐 Ubuntu,包管理更现代,踩坑少)。
- 配置看预算,起步 2核4G 足够跑一个小站。
- 安全组:记得在阿里云控制台开启端口
80(HTTP),443(HTTPS), 和22(SSH)。如果你打算用数据库直连,还得开数据库端口(但强烈建议数据库独立部署或使用 RDS,不要暴露在内网端口给公网)。
-
连接服务器:
ssh root@your_server_ip
第二步:基础环境搭建
登录服务器后,执行以下命令(以 Ubuntu 为例):
# 更新源
sudo apt update && sudo apt upgrade -y
# 安装 Python3, pip, venv, nginx, supervisor (用于进程管理)
sudo apt install python3-pip python3-venv nginx supervisor -y
注意:不要直接用
apt install python3-django,版本可能滞后。我们要用虚拟环境和 pip 安装特定版本。
第三步:项目代码上传与虚拟环境
-
创建用户和项目目录(好习惯,别全用 root):
sudo adduser django_user sudo su - django_user mkdir ~/myproject cd ~/myproject -
上传代码:
把你的 Django 项目文件夹通过scp或 Git 拉取到服务器上。git clone https://github.com/your-repo.git . # 或者 scp -r local_folder/* django_user@server_ip:~/myproject/ -
创建虚拟环境并安装依赖:
python3 -m venv venv source venv/bin/activate # 关键:确保 requirements.txt 里有 gunicorn pip install -r requirements.txt -
静态文件收集:
Django 生产环境不处理静态文件,交给 Nginx。python manage.py collectstatic --noinput确认
settings.py中:STATIC_URL = '/static/' STATIC_ROOT = BASE_DIR / 'staticfiles' # 这个路径要和 collectstatic 输出一致 -
配置数据库:
- 如果是 MySQL/PostgreSQL,确保你在
settings.py里配好了账号密码,并且服务器能连通数据库(如果是本地测试,先装个数据库;如果生产环境,建议用阿里云 RDS,内网连接更快更安全)。 - 别忘了运行迁移:
python manage.py migrate
- 如果是 MySQL/PostgreSQL,确保你在
第四步:编写 Gunicorn 启动脚本
Gunicorn 是 WSGI HTTP Server,Django 的搭档。
创建一个 systemd 服务文件 /etc/systemd/system/gunicorn.service:
[Unit]
Description=Gunicorn instance to serve myproject
After=network.target
[Service]
User=django_user
Group=www-data
WorkingDirectory=/home/django_user/myproject
Environment="PATH=/home/django_user/myproject/venv/bin"
ExecStart=/home/django_user/myproject/venv/bin/gunicorn --workers 3 --bind unix:myproject.sock myproject.wsgi:application
[Install]
WantedBy=multi-user.target
myproject.sock是 sock 文件名,后面 Nginx 要引用。myproject.wsgi:application是你的 wsgi.py 里的 application 对象。
加载并启动:
sudo systemctl daemon-reload
sudo systemctl start gunicorn
sudo systemctl enable gunicorn
sudo systemctl status gunicorn # 检查是否 running
第五步:配置 Nginx 反向X_X
Nginx 负责接收用户请求,转发给 Gunicorn,并处理静态文件。
编辑 /etc/nginx/sites-available/default (或新建一个 conf 文件):
server {
listen 80;
server_name your_domain.com www.your_domain.com; # 换成你的域名或 IP
# 静态文件直接由 Nginx 处理,速度极快
location /static/ {
alias /home/django_user/myproject/staticfiles/;
}
# 媒体文件(用户上传的图片等)
location /media/ {
alias /home/django_user/myproject/media/;
}
# 所有其他请求转发给 Gunicorn
location / {
include proxy_params;
proxy_pass http://unix:/home/django_user/myproject/myproject.sock;
}
}
测试配置并重启 Nginx:
sudo nginx -t
sudo systemctl restart nginx
第六步:域名解析与 HTTPS(可选但推荐)
-
DNS 解析:
去阿里云 DNS 控制台,添加一条 A 记录,将www.your_domain.com指向你的 ECS 公网 IP。 -
SSL 证书(Let’s Encrypt):
为了安全和 SEO,必须上 HTTPS。sudo apt install certbot python3-certbot-nginx sudo certbot --nginx -d your_domain.com -d www.your_domain.com按照提示操作,Certbot 会自动帮你修改 Nginx 配置并续期证书。
常见坑点排查
-
权限问题:
- 报错
Permission denied?检查 Nginx worker 用户是否有权限读取项目文件和 sock 文件。 - 通常让 Gunicorn 以
django_user运行,Nginx 以www-data运行。如果 sock 文件权限不对,Nginx 连不上。 - 解决:
sudo chown django_user:www-data /home/django_user/myproject/myproject.sock
- 报错
-
静态文件 404:
- 确认
STATIC_ROOT路径正确。 - 确认 Nginx
alias路径末尾有没有斜杠。 - 确认
collectstatic真的执行了。
- 确认
-
Gunicorn 没启动:
journalctl -u gunicorn -e查看日志,90% 的问题都在日志里。
-
防火墙:
- 云服务器内部可能有
ufw或firewalld,确保放行了 80/443。 - 更重要的是:阿里云控制台的安全组!很多人服务器内部通了,但云控制台没开端口,导致网络访问不了。
- 云服务器内部可能有
总结
这套流程是工业界标准做法。虽然看起来步骤多,但一旦跑通,后续维护极其简单。每次更新代码:
cd ~/myproject
git pull
source venv/bin/activate
pip install -r requirements.txt # 如果有新依赖
python manage.py collectstatic --noinput
python manage.py migrate
sudo systemctl restart gunicorn
一行命令更新,稳如老狗。
云知道CLOUD