Django+uWSGI+Nginx部署全流程:环境配置与优化准备指南
2025.09.18 12:10浏览量:1简介:本文详细解析Django项目部署前的准备工作,涵盖系统环境配置、依赖安装、目录结构优化等关键步骤,为后续uWSGI+Nginx部署奠定基础。
一、环境基础配置:构建稳定运行环境
1.1 操作系统选择与优化
推荐使用Ubuntu 22.04 LTS或CentOS 8作为基础系统,这两个版本均提供长期支持且社区资源丰富。系统安装时需注意:
- 磁盘分区方案:采用/(根目录)、/var(日志存储)、/opt(应用部署)独立分区
- 网络配置:静态IP地址设置,关闭不必要的网络服务
- 安全加固:禁用root远程登录,创建专用部署用户(如deployuser)
系统优化建议:
# 更新系统并安装基础工具
sudo apt update && sudo apt upgrade -y
sudo apt install -y curl wget vim git htop
# 调整文件描述符限制
echo "* soft nofile 65535" | sudo tee -a /etc/security/limits.conf
echo "* hard nofile 65535" | sudo tee -a /etc/security/limits.conf
1.2 Python环境管理
建议使用pyenv进行多版本Python管理,避免系统Python污染:
# 安装依赖
sudo apt install -y make build-essential libssl-dev zlib1g-dev \
libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm \
libncurses5-dev libncursesw5-dev xz-utils tk-dev libffi-dev liblzma-dev
# 安装pyenv
curl https://pyenv.run | bash
# 配置环境变量
echo 'export PATH="$HOME/.pyenv/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(pyenv init --path)"' >> ~/.bashrc
echo 'eval "$(pyenv virtualenv-init -)"' >> ~/.bashrc
source ~/.bashrc
# 安装指定Python版本(以3.11为例)
pyenv install 3.11.6
pyenv global 3.11.6
二、Django项目准备:代码结构优化
2.1 项目目录标准化
推荐采用以下目录结构:
/opt/myproject/
├── config/ # 配置文件目录
│ ├── settings/ # 环境相关设置
│ │ ├── base.py # 基础配置
│ │ ├── dev.py # 开发环境
│ │ └── prod.py # 生产环境
│ ├── uwsgi.ini # uWSGI配置
│ └── nginx.conf # Nginx配置模板
├── src/ # 主代码目录
│ ├── myproject/ # Django项目目录
│ │ ├── __init__.py
│ │ ├── settings.py (链接到config/settings/prod.py)
│ │ ├── urls.py
│ │ └── wsgi.py # Django WSGI入口
│ ├── apps/ # 应用目录
│ ├── static/ # 静态文件
│ └── templates/ # 模板文件
├── requirements/ # 依赖管理
│ ├── base.txt # 基础依赖
│ └── prod.txt # 生产环境额外依赖
└── logs/ # 日志目录
2.2 依赖管理最佳实践
使用pip-tools进行精确依赖管理:
# 安装pip-tools
pip install pip-tools
# 生成基础依赖文件
pip freeze > requirements/base.txt
# 生成生产环境依赖(示例)
echo "gunicorn==21.2.0" >> requirements/prod.txt
echo "psycopg2-binary==2.9.7" >> requirements/prod.txt
# 编译精确依赖
pip-compile requirements/base.txt
pip-compile requirements/prod.txt
# 安装依赖
pip install -r requirements/prod.txt
2.3 数据库配置准备
生产环境推荐使用PostgreSQL,配置要点:
# config/settings/prod.py 示例
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': 'myproject',
'USER': 'myprojectuser',
'PASSWORD': os.getenv('DB_PASSWORD'),
'HOST': 'localhost',
'PORT': '5432',
'OPTIONS': {
'sslmode': 'require', # 启用SSL
'connect_timeout': 5,
},
}
}
数据库初始化脚本:
sudo apt install -y postgresql postgresql-contrib
sudo -u postgres psql -c "CREATE USER myprojectuser WITH PASSWORD 'securepassword';"
sudo -u postgres psql -c "CREATE DATABASE myproject OWNER myprojectuser;"
sudo -u postgres psql -c "ALTER ROLE myprojectuser SET client_encoding TO 'utf8';"
sudo -u postgres psql -c "ALTER ROLE myprojectuser SET default_transaction_isolation TO 'read committed';"
sudo -u postgres psql -c "ALTER ROLE myprojectuser SET timezone TO 'UTC';"
三、uWSGI预配置:性能优化基础
3.1 uWSGI安装与基础配置
# 安装uWSGI(推荐Python版本)
pip install uwsgi
# 基础配置文件示例(config/uwsgi.ini)
[uwsgi]
# Django相关配置
chdir = /opt/myproject/src
module = myproject.wsgi:application
home = /home/deployuser/.pyenv/versions/3.11.6
# 进程管理
master = true
processes = 4
threads = 2
enable-threads = true
# 性能优化
max-requests = 5000
buffer-size = 32768
post-buffering = 4096
# 日志配置
logto = /opt/myproject/logs/uwsgi.log
log-reopen = true
3.2 Socket通信配置
推荐使用Unix socket而非TCP端口:
[uwsgi]
# Socket配置
socket = /opt/myproject/run/uwsgi.sock
chmod-socket = 666
vacuum = true
需要创建socket目录并设置权限:
sudo mkdir -p /opt/myproject/run
sudo chown deployuser:deployuser /opt/myproject/run
sudo chmod 755 /opt/myproject/run
四、Nginx预配置:静态资源与反向代理
4.1 Nginx安装与基础优化
# 安装Nginx
sudo apt install -y nginx
# 基础优化配置
echo "worker_processes auto;" | sudo tee -a /etc/nginx/nginx.conf
echo "worker_rlimit_nofile 65535;" | sudo tee -a /etc/nginx/nginx.conf
echo "events {" | sudo tee -a /etc/nginx/nginx.conf
echo " worker_connections 4096;" | sudo tee -a /etc/nginx/nginx.conf
echo "}" | sudo tee -a /etc/nginx/nginx.conf
4.2 虚拟主机配置模板
# config/nginx.conf 示例
server {
listen 80;
server_name example.com;
# 静态文件处理
location /static/ {
alias /opt/myproject/src/static/;
expires 30d;
access_log off;
add_header Cache-Control "public";
}
location /media/ {
alias /opt/myproject/src/media/;
expires 7d;
access_log off;
}
# uWSGI代理配置
location / {
include uwsgi_params;
uwsgi_pass unix:/opt/myproject/run/uwsgi.sock;
uwsgi_read_timeout 300s;
uwsgi_send_timeout 300s;
}
# 安全配置
client_max_body_size 10M;
keepalive_timeout 65;
server_tokens off;
# 错误页面
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
internal;
}
}
4.3 SSL证书预配置(Let’s Encrypt示例)
# 安装certbot
sudo apt install -y certbot python3-certbot-nginx
# 获取证书(测试用)
sudo certbot certonly --nginx --dry-run -d example.com
# 实际获取证书(移除--dry-run)
# sudo certbot certonly --nginx -d example.com
五、部署前检查清单
5.1 环境验证项
- Python版本验证:
python --version
- 依赖完整性检查:
pip check
- 数据库连接测试:
python manage.py check --database default
- 静态文件收集:
python manage.py collectstatic --noinput
- 迁移状态检查:
python manage.py showmigrations
5.2 权限配置检查
# 关键目录权限检查
ls -ld /opt/myproject/
ls -ld /opt/myproject/src/
ls -ld /opt/myproject/logs/
ls -ld /opt/myproject/run/
# 权限修复脚本(如需要)
sudo chown -R deployuser:deployuser /opt/myproject
sudo find /opt/myproject -type d -exec chmod 755 {} \;
sudo find /opt/myproject -type f -exec chmod 644 {} \;
5.3 服务依赖检查
# 验证服务端口占用
sudo netstat -tulnp | grep LISTEN
# 验证uWSGI配置
uwsgi --ini /opt/myproject/config/uwsgi.ini --dry-run
# 验证Nginx配置
sudo nginx -t
六、常见问题解决方案
6.1 静态文件403错误
可能原因及解决方案:
目录权限问题:
sudo chown -R www-data:www-data /opt/myproject/src/static/
sudo chmod -R 755 /opt/myproject/src/static/
Nginx配置错误:
检查alias
路径是否正确,确保以/
结尾收集静态文件失败:
运行python manage.py collectstatic --dry-run
验证
6.2 uWSGI连接失败
诊断步骤:
检查socket文件是否存在:
ls -l /opt/myproject/run/uwsgi.sock
验证uWSGI进程:
ps aux | grep uwsgi
检查日志:
tail -100f /opt/myproject/logs/uwsgi.log
6.3 数据库连接超时
优化建议:
调整PostgreSQL配置(/etc/postgresql/14/main/postgresql.conf):
max_connections = 100
shared_buffers = 256MB
effective_cache_size = 2GB
work_mem = 4MB
maintenance_work_mem = 512MB
添加连接池配置(Django设置):
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'CONN_MAX_AGE': 300, # 连接保持时间
# 其他配置...
}
}
通过以上系统化的准备工作,可以确保Django项目在uWSGI+Nginx环境下的稳定部署。实际部署时,建议先在测试环境完整验证所有配置,再逐步迁移到生产环境。每个部署阶段都应建立完善的监控机制,包括日志收集、性能指标监控和自动告警系统。
发表评论
登录后可评论,请前往 登录 或 注册