Django+uWSGI+Nginx部署全流程:环境配置与优化准备指南
2025.09.18 12:10浏览量:5简介:本文详细解析Django项目部署前的准备工作,涵盖系统环境配置、依赖安装、目录结构优化等关键步骤,为后续uWSGI+Nginx部署奠定基础。
一、环境基础配置:构建稳定运行环境
1.1 操作系统选择与优化
推荐使用Ubuntu 22.04 LTS或CentOS 8作为基础系统,这两个版本均提供长期支持且社区资源丰富。系统安装时需注意:
- 磁盘分区方案:采用/(根目录)、/var(日志存储)、/opt(应用部署)独立分区
- 网络配置:静态IP地址设置,关闭不必要的网络服务
- 安全加固:禁用root远程登录,创建专用部署用户(如deployuser)
系统优化建议:
# 更新系统并安装基础工具sudo apt update && sudo apt upgrade -ysudo apt install -y curl wget vim git htop# 调整文件描述符限制echo "* soft nofile 65535" | sudo tee -a /etc/security/limits.confecho "* 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# 安装pyenvcurl https://pyenv.run | bash# 配置环境变量echo 'export PATH="$HOME/.pyenv/bin:$PATH"' >> ~/.bashrcecho 'eval "$(pyenv init --path)"' >> ~/.bashrcecho 'eval "$(pyenv virtualenv-init -)"' >> ~/.bashrcsource ~/.bashrc# 安装指定Python版本(以3.11为例)pyenv install 3.11.6pyenv 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-toolspip install pip-tools# 生成基础依赖文件pip freeze > requirements/base.txt# 生成生产环境依赖(示例)echo "gunicorn==21.2.0" >> requirements/prod.txtecho "psycopg2-binary==2.9.7" >> requirements/prod.txt# 编译精确依赖pip-compile requirements/base.txtpip-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-contribsudo -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/srcmodule = myproject.wsgi:applicationhome = /home/deployuser/.pyenv/versions/3.11.6# 进程管理master = trueprocesses = 4threads = 2enable-threads = true# 性能优化max-requests = 5000buffer-size = 32768post-buffering = 4096# 日志配置logto = /opt/myproject/logs/uwsgi.loglog-reopen = true
3.2 Socket通信配置
推荐使用Unix socket而非TCP端口:
[uwsgi]# Socket配置socket = /opt/myproject/run/uwsgi.sockchmod-socket = 666vacuum = true
需要创建socket目录并设置权限:
sudo mkdir -p /opt/myproject/runsudo chown deployuser:deployuser /opt/myproject/runsudo chmod 755 /opt/myproject/run
四、Nginx预配置:静态资源与反向代理
4.1 Nginx安装与基础优化
# 安装Nginxsudo apt install -y nginx# 基础优化配置echo "worker_processes auto;" | sudo tee -a /etc/nginx/nginx.confecho "worker_rlimit_nofile 65535;" | sudo tee -a /etc/nginx/nginx.confecho "events {" | sudo tee -a /etc/nginx/nginx.confecho " worker_connections 4096;" | sudo tee -a /etc/nginx/nginx.confecho "}" | 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示例)
# 安装certbotsudo 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/myprojectsudo 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 = 100shared_buffers = 256MBeffective_cache_size = 2GBwork_mem = 4MBmaintenance_work_mem = 512MB
添加连接池配置(Django设置):
DATABASES = {'default': {'ENGINE': 'django.db.backends.postgresql','CONN_MAX_AGE': 300, # 连接保持时间# 其他配置...}}
通过以上系统化的准备工作,可以确保Django项目在uWSGI+Nginx环境下的稳定部署。实际部署时,建议先在测试环境完整验证所有配置,再逐步迁移到生产环境。每个部署阶段都应建立完善的监控机制,包括日志收集、性能指标监控和自动告警系统。

发表评论
登录后可评论,请前往 登录 或 注册