logo

Django+uWSGI+Nginx部署全流程:从环境搭建到配置优化

作者:狼烟四起2025.09.26 21:39浏览量:0

简介:本文详细梳理Django+uWSGI+Nginx部署前的准备工作,涵盖环境配置、依赖安装、权限管理、项目结构优化等关键环节,为高效部署提供可复用的技术方案。

一、环境准备:基础系统与工具链配置

1.1 操作系统选择与优化

生产环境推荐使用Ubuntu 22.04 LTSCentOS 8,两者均提供长期支持且包管理完善。以Ubuntu为例,需执行以下基础优化:

  1. # 更新系统包并安装基础工具
  2. sudo apt update && sudo apt upgrade -y
  3. sudo apt install -y curl wget git vim htop
  4. # 配置系统时区(关键步骤)
  5. sudo timedatectl set-timezone Asia/Shanghai

关键点:时区配置错误会导致日志时间戳混乱,影响故障排查效率。

1.2 Python环境管理

建议使用pyenv进行多版本Python管理,避免系统Python冲突:

  1. # 安装依赖
  2. sudo apt install -y make build-essential libssl-dev zlib1g-dev \
  3. libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm \
  4. libncurses5-dev libncursesw5-dev xz-utils tk-dev libffi-dev liblzma-dev
  5. # 安装pyenv
  6. curl https://pyenv.run | bash
  7. echo 'export PATH="$HOME/.pyenv/bin:$PATH"' >> ~/.bashrc
  8. echo 'eval "$(pyenv init --path)"' >> ~/.bashrc
  9. source ~/.bashrc
  10. # 安装Python 3.10.12(Django官方推荐版本)
  11. pyenv install 3.10.12
  12. pyenv global 3.10.12

验证安装

  1. python --version # 应输出Python 3.10.12

二、Django项目结构优化

2.1 项目目录标准化

推荐采用以下结构:

  1. /myproject
  2. ├── config/ # 配置文件目录
  3. ├── settings/ # 环境相关设置
  4. ├── __init__.py
  5. ├── base.py # 基础配置
  6. ├── dev.py # 开发环境
  7. └── prod.py # 生产环境
  8. └── wsgi.py # uWSGI入口文件
  9. ├── myapp/ # 应用代码
  10. ├── static/ # 静态文件
  11. └── templates/ # 模板文件
  12. ├── manage.py
  13. └── requirements.txt

配置分离优势:通过from .base import *在环境配置中继承基础设置,避免重复代码。

2.2 依赖管理方案

使用pip-tools实现精准依赖控制:

  1. # 生成基础依赖
  2. pip install pip-tools
  3. pip freeze > requirements.in
  4. pip-compile requirements.in > requirements.txt
  5. # 生产环境建议添加
  6. echo "gunicorn==21.2.0" >> requirements.txt
  7. echo "uWSGI==2.0.23" >> requirements.txt

关键提示requirements.txt应包含精确版本号,避免部署时因依赖冲突导致服务异常。

三、uWSGI配置预处理

3.1 安装与基础测试

  1. pip install uwsgi
  2. # 基础测试命令
  3. uwsgi --http :8000 --module config.wsgi

成功标志:访问http://服务器IP:8000应显示Django默认页面。

3.2 配置文件模板

创建uwsgi.ini模板文件:

  1. [uwsgi]
  2. # 项目基础配置
  3. chdir = /path/to/myproject
  4. module = config.wsgi:application
  5. home = /path/to/venv # 虚拟环境路径
  6. # 进程管理
  7. master = true
  8. processes = 4
  9. threads = 2
  10. # 性能优化
  11. buffer-size = 32768
  12. post-buffering = 4096
  13. # 日志配置
  14. logto = /var/log/uwsgi/myproject.log
  15. log-format = %(addr) - %(user) [%(ltime)] "%(method) %(uri) %(proto)" %(status) %(size) "%(referer)" "%(uagent)"

关键参数说明

  • processes:根据CPU核心数设置(通常为2*核心数)
  • buffer-size:解决大文件上传时的缓冲区问题
  • log-format:自定义日志格式,便于ELK收集分析

四、Nginx部署前配置

4.1 安装与基础安全

  1. sudo apt install -y nginx
  2. # 删除默认配置(重要!)
  3. sudo rm /etc/nginx/sites-enabled/default
  4. # 创建专用用户组
  5. sudo groupadd nginx
  6. sudo useradd -g nginx -s /bin/false nginx

安全建议:禁止Nginx用户登录系统,仅赋予必要的文件读取权限。

4.2 反向代理配置模板

创建/etc/nginx/sites-available/myproject

  1. server {
  2. listen 80;
  3. server_name example.com;
  4. # 静态文件处理
  5. location /static/ {
  6. alias /path/to/myproject/static/;
  7. expires 30d;
  8. access_log off;
  9. }
  10. # 媒体文件处理
  11. location /media/ {
  12. alias /path/to/myproject/media/;
  13. expires 7d;
  14. }
  15. # 代理配置
  16. location / {
  17. include uwsgi_params;
  18. uwsgi_pass unix:/run/uwsgi/myproject.sock;
  19. client_max_body_size 50M;
  20. }
  21. # 安全头配置
  22. add_header X-Content-Type-Options "nosniff";
  23. add_header X-Frame-Options "SAMEORIGIN";
  24. }

关键优化点

  • client_max_body_size:根据业务需求调整(默认1M)
  • 静态文件设置expires头提升加载速度
  • 安全头防止点击劫持和MIME混淆攻击

五、系统级准备事项

5.1 防火墙配置

  1. sudo ufw allow 80/tcp
  2. sudo ufw allow 22/tcp # SSH端口
  3. sudo ufw enable

验证命令

  1. sudo ufw status # 应显示80/tcp和22/tcp为ALLOW状态

5.2 日志轮转配置

创建/etc/logrotate.d/nginx_uwsgi

  1. /var/log/nginx/*.log /var/log/uwsgi/*.log {
  2. daily
  3. missingok
  4. rotate 14
  5. compress
  6. delaycompress
  7. notifempty
  8. create 0640 www-data adm
  9. sharedscripts
  10. postrotate
  11. systemctl reload nginx >/dev/null 2>&1 || true
  12. systemctl reload uwsgi >/dev/null 2>&1 || true
  13. endscript
  14. }

作用说明:自动清理14天前的日志,节省磁盘空间。

六、验证清单

完成所有准备工作后,执行以下验证:

  1. Python环境

    1. python -c "import django; print(django.__version__)"

    应输出项目使用的Django版本

  2. 静态文件收集

    1. python manage.py collectstatic --dry-run

    确认无报错后再执行实际收集

  3. uWSGI测试

    1. uwsgi --ini uwsgi.ini --http :8000

    访问测试页面检查动态内容加载

  4. Nginx配置测试

    1. sudo nginx -t
    2. sudo systemctl restart nginx

    确认无语法错误后重启服务

七、常见问题解决方案

7.1 权限拒绝问题

现象:Nginx报错403 Forbidden
解决方案

  1. # 检查静态文件目录权限
  2. sudo chown -R www-data:www-data /path/to/static
  3. sudo chmod -R 755 /path/to/static

7.2 uWSGI连接失败

现象:Nginx日志显示502 Bad Gateway
排查步骤

  1. 检查socket文件是否存在:
    1. ls -l /run/uwsgi/myproject.sock
  2. 验证uWSGI进程:
    1. ps aux | grep uwsgi
  3. 检查SELinux状态(CentOS特有):
    1. sudo setenforce 0 # 临时关闭测试

7.3 静态文件404错误

解决方案

  1. 确认STATIC_ROOT配置正确
  2. 执行完整静态文件收集:
    1. python manage.py collectstatic
  3. 检查Nginx配置中的alias路径是否准确

八、进阶准备建议

  1. 监控集成

    • 安装Prometheus Node Exporter监控系统指标
    • 配置uWSGI的stats服务器供监控系统采集
  2. CI/CD预配置

    • 在Git仓库中添加.gitlab-ci.yml模板
    • 配置自动化测试环境与生产环境隔离
  3. 灾备方案

    • 配置定时备份脚本:
      1. #!/bin/bash
      2. tar -czf /backup/myproject_$(date +%Y%m%d).tar.gz /path/to/myproject
      3. find /backup/ -name "*.tar.gz" -mtime +30 -delete

通过系统化的准备工作,可显著降低Django+uWSGI+Nginx部署阶段的故障率。建议在实际部署前,在测试环境完整执行本文所述所有步骤,并记录各环节的基准性能指标(如请求响应时间、内存占用等),为后续优化提供数据支撑。

相关文章推荐

发表评论

活动