本文将详细介绍如何将Django项目从本地开发环境完整地部署到云服务器生产环境,涵盖从服务器初始化到最终上线的每一个步骤。


第一阶段:本地项目准备

1.1 项目检查与配置

确保项目在本地运行正常,然后进行生产环境配置:

# settings.py 关键配置
DEBUG = False  # 必须关闭调试模式
ALLOWED_HOSTS = ['your_server_ip', 'your_domain.com', 'localhost']

# 数据库配置(从SQLite切换到PostgreSQL)
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'mydatabase',
        'USER': 'mydatabaseuser',
        'PASSWORD': 'mypassword',  # 生产环境建议使用环境变量
        'HOST': 'localhost',
        'PORT': '5432',
    }
}

# 静态文件配置
STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')  # 收集静态文件目录
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')

1.2 生成依赖文件和环境配置

# 生成依赖列表
pip freeze > requirements.txt

# 安装PostgreSQL适配器
pip install psycopg2-binary
pip install gunicorn  # 提前测试

# 导出本地数据(在本地执行)
python manage.py dumpdata --exclude auth.permission --exclude contenttypes > datadump.json

第二阶段:服务器初始化

2.1 连接服务器

ssh root@your_server_ip

2.2 创建部署用户

adduser deploy
usermod -aG sudo deploy
su - deploy  # 切换到deploy用户

2.3 系统更新和基础软件安装

sudo apt update && sudo apt upgrade -y
sudo apt install -y python3-pip python3-venv postgresql postgresql-contrib nginx git curl

2.4 防火墙配置

sudo ufw allow 'OpenSSH'
sudo ufw allow 'Nginx Full'  # 允许HTTP和HTTPS
sudo ufw enable

第三阶段:数据库配置

3.1 PostgreSQL设置

sudo -u postgres psql
-- 在PostgreSQL控制台中执行
CREATE DATABASE mydatabase;
CREATE USER mydatabaseuser WITH PASSWORD 'strongpassword';
ALTER ROLE mydatabaseuser SET client_encoding TO 'utf8';
ALTER ROLE mydatabaseuser SET default_transaction_isolation TO 'read committed';
ALTER ROLE mydatabaseuser SET timezone TO 'UTC';
GRANT ALL PRIVILEGES ON DATABASE mydatabase TO mydatabaseuser;
\q

第四阶段:项目部署

4.1 获取项目代码

mkdir ~/projects
cd ~/projects
git clone https://github.com/yourusername/yourproject.git myproject
cd myproject

4.2 创建虚拟环境

python3 -m venv venv
source venv/bin/activate
pip install --upgrade pip
pip install -r requirements.txt

4.3 传输本地数据

在本地机器执行:

scp datadump.json deploy@your_server_ip:~/projects/myproject/
scp .env deploy@your_server_ip:~/projects/myproject/  # 如果有环境变量文件

4.4 环境变量配置

nano ~/projects/myproject/.env.production
# .env.production
DEBUG=False
SECRET_KEY=your-production-secret-key
DJANGO_SETTINGS_MODULE=myproject.settings.production
DATABASE_URL=postgresql://mydatabaseuser:strongpassword@localhost/mydatabase
ALLOWED_HOSTS=your_server_ip,your_domain.com

4.5 数据库迁移和数据导入

source venv/bin/activate
python manage.py migrate
python manage.py loaddata datadump.json
python manage.py collectstatic  # 收集静态文件
python manage.py createsuperuser  # 创建管理员账户

4.6 文件权限设置

sudo chown -R deploy:www-data ~/projects/myproject
sudo chmod -R 755 ~/projects/myproject
sudo chown -R www-data:www-data ~/projects/myproject/staticfiles
sudo chown -R www-data:www-data ~/projects/myproject/media

第五阶段:Gunicorn配置

5.1 创建Gunicorn服务文件

sudo nano /etc/systemd/system/gunicorn.service
[Unit]
Description=Gunicorn daemon for myproject
After=network.target postgresql.service

[Service]
User=deploy
Group=www-data
WorkingDirectory=/home/deploy/projects/myproject
Environment="PATH=/home/deploy/projects/myproject/venv/bin"
EnvironmentFile=/home/deploy/projects/myproject/.env.production
ExecStart=/home/deploy/projects/myproject/venv/bin/gunicorn \
    --access-logfile - \
    --workers 3 \
    --bind unix:/run/gunicorn.sock \
    --timeout 120 \
    myproject.wsgi:application

[Install]
WantedBy=multi-user.target

5.2 启动并启用Gunicorn

sudo systemctl start gunicorn
sudo systemctl enable gunicorn
sudo systemctl status gunicorn  # 检查状态

第六阶段:Nginx配置

6.1 创建Nginx配置文件

sudo nano /etc/nginx/sites-available/myproject
server {
    listen 80;
    server_name your_server_ip your_domain.com;

    # 静态文件服务
    location /static/ {
        alias /home/deploy/projects/myproject/staticfiles/;
        expires 1y;
        add_header Cache-Control "public, immutable";
    }

    # 媒体文件服务
    location /media/ {
        alias /home/deploy/projects/myproject/media/;
        expires 30d;
        add_header Cache-Control "public";
    }

    # 代理动态请求到Gunicorn
    location / {
        proxy_set_header Host $http_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;
        proxy_pass http://unix:/run/gunicorn.sock;
        proxy_connect_timeout 30s;
        proxy_send_timeout 30s;
        proxy_read_timeout 30s;
    }

    # 客户端最大body大小(文件上传)
    client_max_body_size 100M;

    # 禁用favicon日志
    location = /favicon.ico {
        access_log off;
        log_not_found off;
    }
}

6.2 启用站点并测试

sudo ln -s /etc/nginx/sites-available/myproject /etc/nginx/sites-enabled/
sudo nginx -t  # 测试配置
sudo systemctl restart nginx

第七阶段:SSL证书配置(可选但推荐)

7.1 安装Certbot

sudo apt install certbot python3-certbot-nginx

7.2 获取SSL证书

sudo certbot --nginx -d your_domain.com -d www.your_domain.com

7.3 设置自动续期

sudo crontab -e
# 添加以下行:
0 12 * * * /usr/bin/certbot renew --quiet

第八阶段:最终测试与监控

8.1 服务状态检查

# 检查所有服务状态
sudo systemctl status gunicorn
sudo systemctl status nginx
sudo systemctl status postgresql

# 查看日志
sudo journalctl -u gunicorn -f
sudo tail -f /var/log/nginx/error.log

8.2 网站功能测试

  1. 访问网站首页
  2. 测试静态文件加载(CSS/JS)
  3. 测试动态页面(登录、表单提交)
  4. 测试媒体文件上传和显示
  5. 检查管理员后台

8.3 性能监控设置

# 安装基本监控工具
sudo apt install htop nethogs

# 监控服务器资源
htop  # CPU和内存
nethogs  # 网络流量

故障排除指南

常见问题解决:

  1. 502 Bad Gateway: 检查Gunicorn是否运行:sudo systemctl status gunicorn
  2. 静态文件404: 检查Nginx配置中的路径和文件权限
  3. 数据库连接错误: 检查PostgreSQL服务状态和用户权限
  4. 权限被拒绝: 检查文件和目录的所有权及权限

日志查看命令:

# Gunicorn日志
sudo journalctl -u gunicorn --since today

# Nginx访问日志
sudo tail -f /var/log/nginx/access.log

# Nginx错误日志  
sudo tail -f /var/log/nginx/error.log

# PostgreSQL日志
sudo tail -f /var/log/postgresql/postgresql-13-main.log

总结

通过以上完整的8个阶段,您已经成功将Django项目部署到生产环境。这个配置提供了:

  1. 安全性: 关闭调试模式、配置防火墙、使用SSL
  2. 性能: Nginx处理静态文件,Gunicorn处理动态内容
  3. 稳定性: 系统服务管理、日志监控、自动重启
  4. 可维护性: 清晰的目录结构、环境变量配置、版本控制

记得定期备份数据库和重要文件,并保持系统和依赖包的更新。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐