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

在阿里云部署 Django 应用,核心逻辑其实就三步:环境准备 -> 代码上传与配置 -> 反向X_X与域名解析

别整那些虚的,直接上干货。这里推荐一种最稳定、最符合生产环境标准的方案:Nginx + Gunicorn + Systemd (或 Supervisor)。不要用 Django 自带的 runserver 跑生产环境,那是开发用的,一碰就挂。

第一步:搞定服务器(ECS)

  1. 选购 ECS

    • 系统选 Ubuntu 20.04/22.04 LTSCentOS 7/8(推荐 Ubuntu,包管理更现代,踩坑少)。
    • 配置看预算,起步 2核4G 足够跑一个小站。
    • 安全组:记得在阿里云控制台开启端口 80 (HTTP), 443 (HTTPS), 和 22 (SSH)。如果你打算用数据库直连,还得开数据库端口(但强烈建议数据库独立部署或使用 RDS,不要暴露在内网端口给公网)。
  2. 连接服务器

    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 安装特定版本。

第三步:项目代码上传与虚拟环境

  1. 创建用户和项目目录(好习惯,别全用 root):

    sudo adduser django_user
    sudo su - django_user
    mkdir ~/myproject
    cd ~/myproject
  2. 上传代码
    把你的 Django 项目文件夹通过 scp 或 Git 拉取到服务器上。

    git clone https://github.com/your-repo.git .
    # 或者 scp -r local_folder/* django_user@server_ip:~/myproject/
  3. 创建虚拟环境并安装依赖

    python3 -m venv venv
    source venv/bin/activate
    
    # 关键:确保 requirements.txt 里有 gunicorn
    pip install -r requirements.txt
  4. 静态文件收集
    Django 生产环境不处理静态文件,交给 Nginx。

    python manage.py collectstatic --noinput

    确认 settings.py 中:

    STATIC_URL = '/static/'
    STATIC_ROOT = BASE_DIR / 'staticfiles'  # 这个路径要和 collectstatic 输出一致
  5. 配置数据库

    • 如果是 MySQL/PostgreSQL,确保你在 settings.py 里配好了账号密码,并且服务器能连通数据库(如果是本地测试,先装个数据库;如果生产环境,建议用阿里云 RDS,内网连接更快更安全)。
    • 别忘了运行迁移:
      python manage.py migrate

第四步:编写 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(可选但推荐)

  1. DNS 解析
    去阿里云 DNS 控制台,添加一条 A 记录,将 www.your_domain.com 指向你的 ECS 公网 IP。

  2. 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 配置并续期证书。

常见坑点排查

  1. 权限问题

    • 报错 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
  2. 静态文件 404

    • 确认 STATIC_ROOT 路径正确。
    • 确认 Nginx alias 路径末尾有没有斜杠。
    • 确认 collectstatic 真的执行了。
  3. Gunicorn 没启动

    • journalctl -u gunicorn -e 查看日志,90% 的问题都在日志里。
  4. 防火墙

    • 云服务器内部可能有 ufwfirewalld,确保放行了 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 » 如何在阿里云部署Django应用程序?