新手如何在云服务器上从零部署Python Django网站应用?

从零部署 Python Django 网站应用到云服务器

整体架构概览

用户浏览器 → Nginx (反向X_X/静态文件) → Gunicorn (WSGI服务器) → Django应用
                                      ↑
                              PostgreSQL/MySQL数据库

第一步:准备云服务器

1. 选择云服务商并连接服务器

以 Ubuntu 22.04 为例,通过 SSH 连接:

ssh root@你的服务器IP

2. 更新系统

sudo apt update && sudo apt upgrade -y

第二步:安装基础环境

1. 安装 Python 3 及必要工具

sudo apt install python3-pip python3-venv python3-dev 
    libpq-dev postgresql postgresql-contrib 
    nginx curl git -y

说明:

  • python3-venv:创建虚拟环境
  • libpq-dev:PostgreSQL 客户端开发库(Django 连接 Postgres 需要)
  • postgresql:本地数据库(生产环境建议用云服务数据库如 AWS RDS)

2. 配置 PostgreSQL

# 启动 PostgreSQL
sudo systemctl start postgresql
sudo systemctl enable postgresql

# 进入 PostgreSQL 交互模式
sudo -u postgres psql

# 创建数据库和用户(示例)
CREATE DATABASE mysite_db;
CREATE USER mysite_user WITH PASSWORD 'your_strong_password';
ALTER ROLE mysite_user SET client_encoding TO 'utf8';
ALTER ROLE mysite_user SET default_transaction_isolation TO 'read committed';
ALTER ROLE mysite_user SET timezone TO 'UTC';
GRANT ALL PRIVILEGES ON DATABASE mysite_db TO mysite_user;
q

第三步:准备 Django 项目

方法一:在服务器上直接开发(适合简单项目)

方法二:本地开发后上传(推荐)

1. 本地创建 Django 项目

# 本地操作
django-admin startproject mysite
cd mysite
pip install django gunicorn psycopg2-binary

2. 修改 Django 设置

mysite/settings.py 关键修改:

# ALLOWED_HOSTS 必须设置!
ALLOWED_HOSTS = ['你的服务器IP', 'www.yourdomain.com']

# 数据库配置
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'mysite_db',
        'USER': 'mysite_user',
        'PASSWORD': 'your_strong_password',
        'HOST': 'localhost',       # 如果数据库在同一台服务器
        'PORT': '5432',
    }
}

# 安全设置(生产环境必须)
DEBUG = False
SECRET_KEY = '这里放一个强随机密钥'  # 不要硬编码,用环境变量

# 静态文件配置
STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')
STATIC_URL = '/static/'

# 媒体文件配置(可选)
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
MEDIA_URL = '/media/'

3. 生成 requirements.txt

pip freeze > requirements.txt

4. 上传到服务器

scp -r mysite/ root@你的服务器IP:/var/www/mysite

第四步:服务器端部署 Django 应用

1. 创建虚拟环境并安装依赖

cd /var/www/mysite

# 创建虚拟环境
python3 -m venv venv

# 激活虚拟环境
source venv/bin/activate

# 升级 pip
pip install --upgrade pip

# 安装依赖
pip install -r requirements.txt

2. 收集静态文件

python manage.py collectstatic --noinput

3. 执行数据库迁移

python manage.py migrate
python manage.py createsuperuser  # 创建管理员账户

4. 测试运行

python manage.py runserver 0.0.0.0:8000

访问 http://你的服务器IP:8000 确认 Django 正常运行,然后 Ctrl+C 停止。


第五步:使用 Gunicorn 作为 WSGI 服务器

1. 安装 Gunicorn

pip install gunicorn

2. 测试 Gunicorn

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

mysite 是包含 wsgi.py 的项目目录名,application 是 wsgi.py 中的可调用对象。


第六步:配置 Nginx 反向X_X

1. 创建 Nginx 配置文件

sudo nano /etc/nginx/sites-available/mysite

配置文件内容:

server {
    listen 80;
    server_name 你的服务器IP www.yourdomain.com;

    # 静态文件
    location /static/ {
        alias /var/www/mysite/staticfiles/;
    }

    # 媒体文件(如果有用户上传)
    location /media/ {
        alias /var/www/mysite/media/;
    }

    # 所有其他请求转发给 Gunicorn
    location / {
        proxy_pass http://127.0.0.1:8000;
        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;
    }
}

2. 启用站点并重启 Nginx

# 创建软链接
sudo ln -s /etc/nginx/sites-available/mysite /etc/nginx/sites-enabled/

# 测试配置是否正确
sudo nginx -t

# 重启 Nginx
sudo systemctl restart nginx

第七步:使用 systemd 管理 Gunicorn 服务

1. 创建 systemd 服务文件

sudo nano /etc/systemd/system/gunicorn.service

服务文件内容:

[Unit]
Description=Gunicorn daemon for mysite
After=network.target

[Service]
User=root
Group=www-data
WorkingDirectory=/var/www/mysite
ExecStart=/var/www/mysite/venv/bin/gunicorn 
          --access-logfile - 
          --workers 3 
          --bind unix:/var/www/mysite/mysite.sock 
          mysite.wsgi:application

[Install]
WantedBy=multi-user.target

2. 创建 socket 文件供 Nginx 使用

sudo nano /etc/nginx/sites-available/mysite

修改 Nginx 配置中的 location 部分:

location / {
    proxy_pass http://unix:/var/www/mysite/mysite.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;
}

3. 启动并启用服务

# 重新加载 systemd
sudo systemctl daemon-reload

# 启动 Gunicorn
sudo systemctl start gunicorn

# 开机自启
sudo systemctl enable gunicorn

# 检查状态
sudo systemctl status gunicorn

# 查看日志
sudo journalctl -u gunicorn

4. 修复权限问题

# 确保 Nginx 可以读取 socket
sudo chown www-data:www-data /var/www/mysite/mysite.sock
sudo chmod 660 /var/www/mysite/mysite.sock

# 或者更简单的方案:让 Gunicorn 以 www-data 运行
# 修改 gunicorn.service 中的 User 为 www-data

第八步:配置 HTTPS(SSL 证书)

使用 Let’s Encrypt 免费证书

# 安装 Certbot
sudo apt install certbot python3-certbot-nginx

# 获取证书
sudo certbot --nginx -d 你的域名 -d www.你的域名

# 自动续期已内置在 cron 中
sudo systemctl list-timers | grep certbot

Certbot 会自动修改 Nginx 配置,添加 SSL 和 HTTP→HTTPS 重定向。


第九步:安全加固

1. 防火墙配置

sudo ufw allow OpenSSH
sudo ufw allow 'Nginx Full'   # 或 allow 80,443
sudo ufw enable
sudo ufw status

2. 禁用不必要的端口

# 确保只有 22(SSH), 80(HTTP), 443(HTTPS) 开放
sudo ufw delete allow 8000

3. 使用环境变量管理敏感信息

创建 .env 文件(不要提交到 Git):

# /var/www/mysite/.env
SECRET_KEY=your_secret_key_here
DEBUG=False
DB_NAME=mysite_db
DB_USER=mysite_user
DB_PASSWORD=your_password
DB_HOST=localhost
DB_PORT=5432

修改 settings.py 使用 python-decouple 或 django-environ:

pip install django-environ
# settings.py
import environ
env = environ.Env()
environ.Env.read_env()  # 读取 .env 文件

SECRET_KEY = env('SECRET_KEY')
DEBUG = env.bool('DEBUG', default=False)

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': env('DB_NAME'),
        'USER': env('DB_USER'),
        'PASSWORD': env('DB_PASSWORD'),
        'HOST': env('DB_HOST'),
        'PORT': env('DB_PORT'),
    }
}

4. 将 .env 加入 .gitignore

.env
venv/
*.pyc
__pycache__/

第十步:自动化部署(可选但推荐)

使用 Git + Webhook 实现一键部署

# 服务器端设置
cd /var/www
mkdir deploy
git init --bare deploy.git

# 创建 post-receive hook
nano deploy.git/hooks/post-receive

post-receive 内容:

#!/bin/bash
GIT_WORK_TREE=/var/www/mysite git checkout -f
cd /var/www/mysite
source venv/bin/activate
pip install -r requirements.txt
python manage.py collectstatic --noinput
python manage.py migrate --noinput
systemctl restart gunicorn
chmod +x deploy.git/hooks/post-receive

本地推送:

git remote add production ssh://root@你的服务器IP/var/www/deploy.git
git push production main

完整部署流程图

┌─────────────┐     ┌──────────┐     ┌──────────────┐     ┌─────────────┐
│  浏览器      │────▶│  Nginx   │────▶│  Gunicorn    │────▶│  Django App │
│  (HTTP/HTTPS)│     │ :80/443  │     │  (Unix Socket)│     │  (Python)   │
└─────────────┘     └──────────┘     └──────────────┘     └──────┬──────┘
                                                                 │
                                                          ┌──────▼──────┐
                                                          │ PostgreSQL  │
                                                          │   Database  │
                                                          └─────────────┘

常见问题排查

问题 解决方案
Permission denied 检查文件权限:sudo chown -R www-data:www-data /var/www/mysite
Nginx 返回 502 Bad Gateway 检查 Gunicorn 是否运行:systemctl status gunicorn;检查 socket 路径是否正确
静态文件 404 确认 collectstatic 已执行;确认 Nginx alias 路径正确
数据库连接失败 检查 pg_hba.conf 允许本地连接;确认用户名密码正确
ImportError 确认虚拟环境已激活;确认安装了所有依赖

快速检查清单 ✅

  • [ ] Python 3 + pip 已安装
  • [ ] PostgreSQL 已安装并创建数据库
  • [ ] Django 项目能本地运行
  • [ ] ALLOWED_HOSTS 已配置
  • [ ] DEBUG = False
  • [ ] 虚拟环境已创建且依赖已安装
  • [ ] collectstatic 已执行
  • [ ] migrate 已执行
  • [ ] Gunicorn 可通过命令行启动
  • [ ] Nginx 配置正确并通过 nginx -t 测试
  • [ ] systemd 服务已创建并能启动
  • [ ] 防火墙只开放必要端口
  • [ ] HTTPS 证书已配置
  • [ ] 敏感信息使用环境变量管理

按照以上步骤,你可以成功将一个 Django 应用部署到云服务器上。初次部署可能需要一些调试时间,但后续流程会变得非常顺畅。

未经允许不得转载:云知识CLOUD » 新手如何在云服务器上从零部署Python Django网站应用?