简介:本文详细介绍Django+uWSGI+Nginx部署前的环境准备工作,涵盖系统依赖、Python环境配置、虚拟环境创建及项目结构初始化,为开发者提供可操作的部署指南。
在Web开发领域,Django作为高效Python框架,uWSGI作为应用服务器,Nginx作为反向代理服务器,三者结合已成为生产环境部署的标准方案。这种架构通过Nginx处理静态资源、负载均衡和SSL终止,uWSGI负责Django应用的进程管理,实现高性能、高可用的Web服务。
准备工作是部署成功的基石。系统环境配置不当会导致服务不稳定,依赖缺失可能引发运行时错误,项目结构混乱则影响后续维护。本文将系统梳理从系统环境到项目初始化的完整流程,帮助开发者规避常见陷阱。
推荐使用Ubuntu 20.04 LTS或CentOS 8作为基础系统,这两个版本在稳定性、社区支持和软件包更新方面表现优异。安装时需注意:
通过系统包管理器安装核心依赖:
# Ubuntu示例sudo apt updatesudo apt install -y python3-dev python3-pip libpcre3 libpcre3-dev zlib1g zlib1g-dev libffi-dev libssl-dev build-essential# CentOS示例sudo yum install -y python3-devel gcc pcre-devel zlib-devel openssl-devel
这些包提供了Python开发、SSL支持和uWSGI编译所需的基础组件。
创建专用部署用户并配置sudo权限:
sudo adduser deployusersudo usermod -aG sudo deployuser
通过visudo限制sudo权限,仅允许必要命令执行,遵循最小权限原则。
使用venv模块创建隔离环境:
python3 -m venv /opt/django_envsource /opt/django_env/bin/activate
虚拟环境可避免项目间依赖冲突,建议将环境目录放在/opt下统一管理。
安装pip最新版本并配置国内镜像源:
pip install --upgrade pipmkdir ~/.pipcat > ~/.pip/pip.conf <<EOF[global]index-url = https://pypi.tuna.tsinghua.edu.cn/simpleEOF
使用requirements.txt管理依赖,示例内容:
Django>=3.2,<4.0uwsgi>=2.0.19,<2.1psycopg2-binary>=2.9
通过pip check验证依赖冲突,使用pipdeptree分析依赖树。特别注意Django与uWSGI的版本匹配,旧版uWSGI可能不支持Django 4.0的新特性。
遵循以下结构组织项目:
/opt/myproject/├── config/ # 配置文件│ ├── nginx/│ ├── uwsgi/│ └── settings/├── src/ # 应用代码│ ├── myproject/│ ├── manage.py│ └── requirements/├── static/ # 静态文件├── media/ # 用户上传文件└── logs/ # 日志文件
使用django-admin初始化项目:
django-admin startproject myproject src/cd src/python manage.py startapp core
配置settings.py时需注意:
ALLOWED_HOSTS为实际域名STATIC_ROOT = '/opt/myproject/static/'DEBUG = FalsePostgreSQL配置示例:
# settings.pyDATABASES = {'default': {'ENGINE': 'django.db.backends.postgresql','NAME': 'myproject','USER': 'dbuser','PASSWORD': 'securepassword','HOST': 'localhost','PORT': '5432',}}
创建数据库和用户:
CREATE DATABASE myproject;CREATE USER dbuser WITH PASSWORD 'securepassword';GRANT ALL PRIVILEGES ON DATABASE myproject TO dbuser;
通过pip安装uWSGI:
pip install uwsgi
验证安装:
uwsgi --version# 应输出类似2.0.19.1的版本号
创建/opt/myproject/config/uwsgi/myproject.ini:
[uwsgi]chdir = /opt/myproject/srcmodule = myproject.wsgi:applicationmaster = trueprocesses = 4socket = /opt/myproject/run/uwsgi.sockchmod-socket = 666vacuum = truedie-on-term = truelogto = /opt/myproject/logs/uwsgi.log
创建运行目录并设置权限:
sudo mkdir /opt/myproject/runsudo chown -R deployuser:www-data /opt/myproject/runsudo chmod 775 /opt/myproject/run
安装Nginx并验证服务:
sudo apt install nginxsudo systemctl start nginxcurl localhost# 应看到Nginx欢迎页面
创建/etc/nginx/sites-available/myproject:
server {listen 80;server_name example.com;location = /favicon.ico { access_log off; log_not_found off; }location /static/ {root /opt/myproject;}location / {include uwsgi_params;uwsgi_pass unix:/opt/myproject/run/uwsgi.sock;}error_page 500 502 503 504 /50x.html;location = /50x.html {root /usr/share/nginx/html;}}
启用配置并检查语法:
sudo ln -s /etc/nginx/sites-available/myproject /etc/nginx/sites-enabled/sudo nginx -tsudo systemctl reload nginx
在nginx.conf的http块中添加:
client_max_body_size 20M;keepalive_timeout 10;gzip on;gzip_types text/plain text/css application/json application/javascript text/xml;
fail2ban防止暴力破解在Django中启用:
# settings.pySECURE_SSL_REDIRECT = TrueSESSION_COOKIE_SECURE = TrueCSRF_COOKIE_SECURE = TrueSECURE_HSTS_SECONDS = 31536000SECURE_HSTS_INCLUDE_SUBDOMAINS = TrueSECURE_HSTS_PRELOAD = True
配置logrotate管理日志文件,示例配置:
/opt/myproject/logs/*.log {weeklymissingokrotate 4compressdelaycompressnotifemptycreate 640 deployuser admsharedscriptspostrotatesystemctl reload uwsgi >/dev/null 2>&1 || trueendscript}
当出现502错误时,检查:
确认:
STATIC_ROOT配置正确root指令指向包含static目录的父目录python manage.py collectstatic收集静态文件检查:
通过系统化的准备工作,开发者可以建立起稳定、高效的Django部署环境。本文介绍的每个步骤都经过生产环境验证,遵循这些实践可显著减少部署阶段的故障率。建议开发者在实施过程中记录每个配置项的修改原因,为后续维护提供参考。