Django项目部署实战:Nginx + Gunicorn 云服务器完整指南
本文将详细介绍如何将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";}# 代理动态请求到Gunicornlocation / {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 网站功能测试
- 访问网站首页
- 测试静态文件加载(CSS/JS)
- 测试动态页面(登录、表单提交)
- 测试媒体文件上传和显示
- 检查管理员后台
8.3 性能监控设置
# 安装基本监控工具
sudo apt install htop nethogs# 监控服务器资源
htop # CPU和内存
nethogs # 网络流量
故障排除指南
常见问题解决:
- 502 Bad Gateway: 检查Gunicorn是否运行:sudo systemctl status gunicorn
- 静态文件404: 检查Nginx配置中的路径和文件权限
- 数据库连接错误: 检查PostgreSQL服务状态和用户权限
- 权限被拒绝: 检查文件和目录的所有权及权限
日志查看命令:
# 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项目部署到生产环境。这个配置提供了:
- 安全性: 关闭调试模式、配置防火墙、使用SSL
- 性能: Nginx处理静态文件,Gunicorn处理动态内容
- 稳定性: 系统服务管理、日志监控、自动重启
- 可维护性: 清晰的目录结构、环境变量配置、版本控制
记得定期备份数据库和重要文件,并保持系统和依赖包的更新。