logo

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)

系统优化建议:

  1. # 更新系统并安装基础工具
  2. sudo apt update && sudo apt upgrade -y
  3. sudo apt install -y curl wget vim git htop
  4. # 调整文件描述符限制
  5. echo "* soft nofile 65535" | sudo tee -a /etc/security/limits.conf
  6. echo "* hard nofile 65535" | sudo tee -a /etc/security/limits.conf

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. # 配置环境变量
  8. echo 'export PATH="$HOME/.pyenv/bin:$PATH"' >> ~/.bashrc
  9. echo 'eval "$(pyenv init --path)"' >> ~/.bashrc
  10. echo 'eval "$(pyenv virtualenv-init -)"' >> ~/.bashrc
  11. source ~/.bashrc
  12. # 安装指定Python版本(以3.11为例)
  13. pyenv install 3.11.6
  14. pyenv global 3.11.6

二、Django项目准备:代码结构优化

2.1 项目目录标准化

推荐采用以下目录结构:

  1. /opt/myproject/
  2. ├── config/ # 配置文件目录
  3. ├── settings/ # 环境相关设置
  4. ├── base.py # 基础配置
  5. ├── dev.py # 开发环境
  6. └── prod.py # 生产环境
  7. ├── uwsgi.ini # uWSGI配置
  8. └── nginx.conf # Nginx配置模板
  9. ├── src/ # 主代码目录
  10. ├── myproject/ # Django项目目录
  11. ├── __init__.py
  12. ├── settings.py (链接到config/settings/prod.py)
  13. ├── urls.py
  14. └── wsgi.py # Django WSGI入口
  15. ├── apps/ # 应用目录
  16. ├── static/ # 静态文件
  17. └── templates/ # 模板文件
  18. ├── requirements/ # 依赖管理
  19. ├── base.txt # 基础依赖
  20. └── prod.txt # 生产环境额外依赖
  21. └── logs/ # 日志目录

2.2 依赖管理最佳实践

使用pip-tools进行精确依赖管理:

  1. # 安装pip-tools
  2. pip install pip-tools
  3. # 生成基础依赖文件
  4. pip freeze > requirements/base.txt
  5. # 生成生产环境依赖(示例)
  6. echo "gunicorn==21.2.0" >> requirements/prod.txt
  7. echo "psycopg2-binary==2.9.7" >> requirements/prod.txt
  8. # 编译精确依赖
  9. pip-compile requirements/base.txt
  10. pip-compile requirements/prod.txt
  11. # 安装依赖
  12. pip install -r requirements/prod.txt

2.3 数据库配置准备

生产环境推荐使用PostgreSQL,配置要点:

  1. # config/settings/prod.py 示例
  2. DATABASES = {
  3. 'default': {
  4. 'ENGINE': 'django.db.backends.postgresql',
  5. 'NAME': 'myproject',
  6. 'USER': 'myprojectuser',
  7. 'PASSWORD': os.getenv('DB_PASSWORD'),
  8. 'HOST': 'localhost',
  9. 'PORT': '5432',
  10. 'OPTIONS': {
  11. 'sslmode': 'require', # 启用SSL
  12. 'connect_timeout': 5,
  13. },
  14. }
  15. }

数据库初始化脚本:

  1. sudo apt install -y postgresql postgresql-contrib
  2. sudo -u postgres psql -c "CREATE USER myprojectuser WITH PASSWORD 'securepassword';"
  3. sudo -u postgres psql -c "CREATE DATABASE myproject OWNER myprojectuser;"
  4. sudo -u postgres psql -c "ALTER ROLE myprojectuser SET client_encoding TO 'utf8';"
  5. sudo -u postgres psql -c "ALTER ROLE myprojectuser SET default_transaction_isolation TO 'read committed';"
  6. sudo -u postgres psql -c "ALTER ROLE myprojectuser SET timezone TO 'UTC';"

三、uWSGI预配置:性能优化基础

3.1 uWSGI安装与基础配置

  1. # 安装uWSGI(推荐Python版本)
  2. pip install uwsgi
  3. # 基础配置文件示例(config/uwsgi.ini)
  4. [uwsgi]
  5. # Django相关配置
  6. chdir = /opt/myproject/src
  7. module = myproject.wsgi:application
  8. home = /home/deployuser/.pyenv/versions/3.11.6
  9. # 进程管理
  10. master = true
  11. processes = 4
  12. threads = 2
  13. enable-threads = true
  14. # 性能优化
  15. max-requests = 5000
  16. buffer-size = 32768
  17. post-buffering = 4096
  18. # 日志配置
  19. logto = /opt/myproject/logs/uwsgi.log
  20. log-reopen = true

3.2 Socket通信配置

推荐使用Unix socket而非TCP端口:

  1. [uwsgi]
  2. # Socket配置
  3. socket = /opt/myproject/run/uwsgi.sock
  4. chmod-socket = 666
  5. vacuum = true

需要创建socket目录并设置权限:

  1. sudo mkdir -p /opt/myproject/run
  2. sudo chown deployuser:deployuser /opt/myproject/run
  3. sudo chmod 755 /opt/myproject/run

四、Nginx预配置:静态资源与反向代理

4.1 Nginx安装与基础优化

  1. # 安装Nginx
  2. sudo apt install -y nginx
  3. # 基础优化配置
  4. echo "worker_processes auto;" | sudo tee -a /etc/nginx/nginx.conf
  5. echo "worker_rlimit_nofile 65535;" | sudo tee -a /etc/nginx/nginx.conf
  6. echo "events {" | sudo tee -a /etc/nginx/nginx.conf
  7. echo " worker_connections 4096;" | sudo tee -a /etc/nginx/nginx.conf
  8. echo "}" | sudo tee -a /etc/nginx/nginx.conf

4.2 虚拟主机配置模板

  1. # config/nginx.conf 示例
  2. server {
  3. listen 80;
  4. server_name example.com;
  5. # 静态文件处理
  6. location /static/ {
  7. alias /opt/myproject/src/static/;
  8. expires 30d;
  9. access_log off;
  10. add_header Cache-Control "public";
  11. }
  12. location /media/ {
  13. alias /opt/myproject/src/media/;
  14. expires 7d;
  15. access_log off;
  16. }
  17. # uWSGI代理配置
  18. location / {
  19. include uwsgi_params;
  20. uwsgi_pass unix:/opt/myproject/run/uwsgi.sock;
  21. uwsgi_read_timeout 300s;
  22. uwsgi_send_timeout 300s;
  23. }
  24. # 安全配置
  25. client_max_body_size 10M;
  26. keepalive_timeout 65;
  27. server_tokens off;
  28. # 错误页面
  29. error_page 500 502 503 504 /50x.html;
  30. location = /50x.html {
  31. root /usr/share/nginx/html;
  32. internal;
  33. }
  34. }

4.3 SSL证书预配置(Let’s Encrypt示例)

  1. # 安装certbot
  2. sudo apt install -y certbot python3-certbot-nginx
  3. # 获取证书(测试用)
  4. sudo certbot certonly --nginx --dry-run -d example.com
  5. # 实际获取证书(移除--dry-run)
  6. # 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 权限配置检查

  1. # 关键目录权限检查
  2. ls -ld /opt/myproject/
  3. ls -ld /opt/myproject/src/
  4. ls -ld /opt/myproject/logs/
  5. ls -ld /opt/myproject/run/
  6. # 权限修复脚本(如需要)
  7. sudo chown -R deployuser:deployuser /opt/myproject
  8. sudo find /opt/myproject -type d -exec chmod 755 {} \;
  9. sudo find /opt/myproject -type f -exec chmod 644 {} \;

5.3 服务依赖检查

  1. # 验证服务端口占用
  2. sudo netstat -tulnp | grep LISTEN
  3. # 验证uWSGI配置
  4. uwsgi --ini /opt/myproject/config/uwsgi.ini --dry-run
  5. # 验证Nginx配置
  6. sudo nginx -t

六、常见问题解决方案

6.1 静态文件403错误

可能原因及解决方案:

  1. 目录权限问题:

    1. sudo chown -R www-data:www-data /opt/myproject/src/static/
    2. sudo chmod -R 755 /opt/myproject/src/static/
  2. Nginx配置错误:
    检查alias路径是否正确,确保以/结尾

  3. 收集静态文件失败:
    运行python manage.py collectstatic --dry-run验证

6.2 uWSGI连接失败

诊断步骤:

  1. 检查socket文件是否存在:

    1. ls -l /opt/myproject/run/uwsgi.sock
  2. 验证uWSGI进程:

    1. ps aux | grep uwsgi
  3. 检查日志:

    1. tail -100f /opt/myproject/logs/uwsgi.log

6.3 数据库连接超时

优化建议:

  1. 调整PostgreSQL配置(/etc/postgresql/14/main/postgresql.conf):

    1. max_connections = 100
    2. shared_buffers = 256MB
    3. effective_cache_size = 2GB
    4. work_mem = 4MB
    5. maintenance_work_mem = 512MB
  2. 添加连接池配置(Django设置):

    1. DATABASES = {
    2. 'default': {
    3. 'ENGINE': 'django.db.backends.postgresql',
    4. 'CONN_MAX_AGE': 300, # 连接保持时间
    5. # 其他配置...
    6. }
    7. }

通过以上系统化的准备工作,可以确保Django项目在uWSGI+Nginx环境下的稳定部署。实际部署时,建议先在测试环境完整验证所有配置,再逐步迁移到生产环境。每个部署阶段都应建立完善的监控机制,包括日志收集、性能指标监控和自动告警系统。

相关文章推荐

发表评论