从零部署 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