腾讯云Linux云服务器使用Nginx+uWSGI部署Django项目全攻略
一、部署架构概述
Django作为Python生态中最成熟的Web框架,其自带的开发服务器runserver仅适用于本地调试场景,性能非常有限,无法承受生产环境的并发压力。生产环境必须通过WSGI协议与专业的应用服务器对接,再由反向代理服务器处理静态资源、负载均衡及SSL终止等任务。
Nginx与uWSGI的组合是目前部署Django项目的主流方案之一。uWSGI是一个实现了WSGI协议的Web服务器,它支持多进程与多线程模型,能够高效执行Python Web应用。Nginx则是一个高性能的HTTP服务器和反向代理服务器,负责处理静态资源请求、负载均衡和SSL终止等任务。
在这种分层架构中,用户请求经DNS解析到达Nginx监听的80或443端口。Nginx根据URL规则进行判断:对于静态资源请求,Nginx直接从本地文件系统返回,避免占用Django应用进程资源;对于动态请求,Nginx将其转发至uWSGI监听的Unix Socket或TCP端口,uWSGI再调用Django应用生成响应。这种架构具备三大核心优势:性能优化方面,uWSGI通过多进程与多线程模型提升并发处理能力,Nginx的异步IO架构可处理数万并发连接;安全隔离方面,Nginx作为前端防护层可有效阻断常见Web威胁;资源效率方面,静态资源由Nginx直接返回,避免占用Django应用进程资源。
需要先登录腾讯云控制台,点击:腾讯云控制台,还没有账号,点击:注册后再关联,已有账号点击:登录后再关联
二、服务器环境准备
2.1 服务器选购与连接
在腾讯云上部署Django项目,首先需要购买一台云服务器。推荐使用Ubuntu 22.04 LTS或CentOS 8等现代Linux发行版。实例规格方面,推荐使用至少2 vCPU和4 GiB内存的配置。
购买完成后,需要通过SSH工具连接到服务器。常用的SSH工具有XShell、MobaXterm等。连接时使用腾讯云提供的公网IP地址和初始密码,用户名默认为root。
2.2 系统基础配置
连接到服务器后,首先更新系统软件包并安装必要的依赖库:
# Ubuntu系统更新与依赖安装
sudo apt update && sudo apt upgrade -y
sudo apt install -y build-essential python3-dev python3-pip libpcre3 libpcre3-dev zlib1g zlib1g-dev openssl关键依赖说明:python3-dev提供Python.h头文件,用于编译uWSGI等扩展;libpcre3是正则表达式支持库,为Nginx核心依赖;zlib1g提供数据压缩支持,影响静态资源传输效率。
对于CentOS系统,使用yum包管理器:
# CentOS系统更新与依赖安装
yum update -y
yum install -y python3 python3-devel pcre-devel gcc make zlib-devel openssl-devel2.3 防火墙与安全组配置
腾讯云服务器提供双重防火墙机制:云控制台的安全组规则和操作系统内部的防火墙。需要在两个层面都进行正确配置。
在腾讯云控制台的安全组中,需要添加规则开放必要的端口:
- 80端口:HTTP访问
- 443端口:HTTPS访问
- 22端口:SSH远程连接
在Ubuntu系统中,可以使用ufw进行防火墙设置:
# 开放80端口
sudo ufw allow 80
# 开放443端口
sudo ufw allow 443
# 开放22端口(如已开放可跳过)
sudo ufw allow 22
# 启用防火墙
sudo ufw enable三、Python环境与虚拟环境搭建
3.1 Python安装
腾讯云Linux服务器可能预装了Python,但版本可能较旧。建议安装Python 3.8及以上版本。以下是在CentOS系统上编译安装Python的步骤:
# 下载Python源码
wget https://www.python.org/ftp/python/3.10.0/Python-3.10.0.tgz
# 解压
tar -xzvf Python-3.10.0.tgz
cd Python-3.10.0
# 配置编译选项
./configure --prefix=/usr/local/python3
# 编译安装
make && make install
# 创建软链接
ln -s /usr/local/python3/bin/python3.10 /usr/bin/python3
ln -s /usr/local/python3/bin/pip3 /usr/bin/pip3如果编译过程中出现错误,可能需要安装额外的依赖包。例如,出现"no acceptable C compiler found"错误时需要安装gcc;出现"can't decompress data; zlib not available"错误时需要安装zlib-devel;出现"No module named '_ctypes'"错误时需要安装libffi-devel。
3.2 创建Python虚拟环境
建议为每个Django项目创建独立的Python虚拟环境,以隔离项目依赖,避免不同项目间的包版本冲突。虚拟环境管理的最佳实践包括:将虚拟环境目录纳入.gitignore,使用requirements.txt固化依赖版本。
# 安装虚拟环境管理工具
python3 -m pip install virtualenv
# 创建项目目录和虚拟环境目录
mkdir -p /root/www/project
cd /root/www/project
# 创建虚拟环境
python3 -m venv venv
# 激活虚拟环境
source venv/bin/activate激活虚拟环境后,命令行的最前面会出现虚拟环境名称,例如(venv),表示当前处于虚拟环境下。
四、Django项目准备
4.1 安装Django与项目依赖
在激活的虚拟环境中安装Django和项目所需的其他依赖:
# 升级pip
pip install --upgrade pip wheel
# 安装Django
pip install "Django>=4.2,<5.0"
# 如已有requirements.txt,批量安装依赖
pip install -r requirements.txt4.2 上传项目代码
将本地开发完成的Django项目代码上传到服务器。可以使用多种方式:
- 使用rz工具上传文件
- 使用Git从代码仓库克隆
- 使用SCP或SFTP工具传输
项目代码建议放置在/root/www/project/目录下,目录结构应包含manage.py文件和项目主目录。
4.3 生产环境配置修改
将Django项目部署到生产环境前,需要修改settings.py中的关键配置:
# 关闭调试模式
DEBUG = False
# 配置允许访问的域名或IP
ALLOWED_HOSTS = ['your-domain.com', 'your-server-ip']
# 配置静态文件收集目录
STATIC_ROOT = os.path.join(BASE_DIR, 'static')
# 如使用MySQL等生产数据库,修改DATABASES配置DEBUG=False可以防止应用出错时泄露敏感配置与代码细节。ALLOWED_HOSTS必须包含实际部署的域名或IP地址,否则应用将无法启动。
4.4 数据库迁移与静态文件收集
# 执行数据库迁移
python manage.py migrate
# 收集静态文件到STATIC_ROOT目录
python manage.py collectstatic --noinputcollectstatic命令会将所有应用中的静态文件复制到STATIC_ROOT指定的目录中,供Nginx直接提供服务。
五、uWSGI安装与配置
5.1 安装uWSGI
在虚拟环境中使用pip安装uWSGI:
pip install uwsgi需要注意的是,uWSGI必须安装在项目所使用的Python环境中。如果在虚拟环境中安装,则启动uWSGI时也需要在虚拟环境下进行。
5.2 测试uWSGI启动Django项目
在正式配置之前,可以先测试uWSGI能否正常启动Django项目:
# 进入项目根目录(manage.py所在目录)
cd /root/www/project/myproject
# 使用uWSGI启动项目
uwsgi --http :8000 --module myproject.wsgi其中--http :8000指定HTTP端口为8000,--module myproject.wsgi指定加载的WSGI模块。如果需要在虚拟环境中指定uWSGI路径,可以使用虚拟环境bin目录下的uwsgi。
5.3 创建uWSGI配置文件
在项目根目录下创建uwsgi.ini配置文件,以便自定义uWSGI服务器的行为:
[uwsgi]
# 项目根目录(manage.py所在目录)
chdir = /root/www/project/myproject
# Django项目的WSGI应用
module = myproject.wsgi:application
# 虚拟环境路径
home = /root/www/project/venv
# 启动主进程
master = true
# 进程数(建议设置为CPU核心数的2倍)
processes = 4
# 每个进程的线程数
threads = 2
# 通信方式:使用Unix Socket(推荐)
socket = /run/uwsgi/myproject.sock
# Socket文件权限
chmod-socket = 666
# 退出时自动清理Socket文件
vacuum = true
# 日志文件
daemonize = /var/log/uwsgi/myproject.log
# PID文件
pidfile = /run/uwsgi/myproject.pid
# 请求头缓冲区大小(如遇到请求头过大错误可增大)
buffer-size = 65536关键参数说明:processes建议根据CPU核心数设置,通常为2倍CPU核心数;socket推荐使用Unix Socket减少TCP开销,需确保Nginx有访问权限;vacuum在项目重启时自动清理残留Socket文件;如果项目WSGI应用名称不是application,需要使用callable参数指定。
5.4 启动与管理uWSGI
# 启动uWSGI
uwsgi --ini uwsgi.ini
# 查看uWSGI进程
ps aux | grep uwsgi
# 停止uWSGI
uwsgi --stop uwsgi.pid
# 重启uWSGI(先停止再启动)
uwsgi --reload uwsgi.pid六、Nginx安装与配置
6.1 安装Nginx
Nginx的安装方式有多种,推荐使用官方源安装最新稳定版本:
# Ubuntu系统
sudo apt install nginx
# CentOS系统(添加官方源)
sudo tee /etc/yum.repos.d/nginx.repo <<-'EOF'
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/8/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
EOF
sudo yum install -y nginx6.2 配置Nginx站点
在/etc/nginx/conf.d/目录下创建Django项目的配置文件:
server {
listen 80;
server_name your-domain.com your-server-ip;
# 静态文件直接由Nginx提供
location /static/ {
alias /root/www/project/myproject/static/;
expires 30d;
}
# 媒体文件(用户上传文件)
location /media/ {
alias /root/www/project/myproject/media/;
expires 30d;
}
# 动态请求转发给uWSGI
location / {
include uwsgi_params;
uwsgi_pass unix:/run/uwsgi/myproject.sock;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
# 日志配置
access_log /var/log/nginx/myproject_access.log;
error_log /var/log/nginx/myproject_error.log;
}uwsgi_pass指令指定了uWSGI监听的Socket地址,需要与uwsgi.ini中的socket配置保持一致。include uwsgi_params引入Nginx与uWSGI通信的标准参数。静态文件配置中,alias指向Django的STATIC_ROOT目录。
6.3 验证与重启Nginx
# 验证Nginx配置语法是否正确
nginx -t
# 重启Nginx使配置生效
sudo systemctl restart nginx
# 或
sudo /etc/init.d/nginx restart七、静态文件与媒体文件处理
在生产环境中,静态文件(CSS、JavaScript、图片等)不应由Django直接服务,而应通过Nginx进行服务,以提高效率。具体步骤包括:
第一步,在Django的settings.py中设置STATIC_ROOT:
STATIC_ROOT = os.path.join(BASE_DIR, 'static')第二步,执行collectstatic命令收集静态文件:
python manage.py collectstatic第三步,在Nginx配置中为/static/路径配置alias或root指向STATIC_ROOT目录。
对于用户上传的媒体文件,同样建议由Nginx提供服务,配置方式与静态文件类似,将/media/路径指向MEDIA_ROOT目录。
八、进程管理与开机自启
8.1 使用Supervisor管理uWSGI进程
为了让Django项目持续稳定运行,可以使用Supervisor来管理uWSGI进程,在uWSGI意外崩溃时自动重启。
安装Supervisor:
pip install supervisor
# 或使用系统包管理器
sudo apt install supervisor创建Supervisor配置文件/etc/supervisor/conf.d/myproject.conf:
[program:myproject]
command=/root/www/project/venv/bin/uwsgi --ini /root/www/project/myproject/uwsgi.ini
directory=/root/www/project/myproject
autostart=true
autorestart=true
startretries=3
stderr_logfile=/var/log/supervisor/myproject_err.log
stdout_logfile=/var/log/supervisor/myproject_out.log
user=root启动并管理Supervisor:
sudo supervisorctl reread
sudo supervisorctl update
sudo supervisorctl start myproject
sudo supervisorctl status8.2 设置开机自启
确保Nginx和Supervisor在系统启动时自动运行:
# Ubuntu系统
sudo systemctl enable nginx
sudo systemctl enable supervisor
# CentOS系统
sudo systemctl enable nginx
sudo systemctl enable supervisord九、性能优化与安全加固
9.1 uWSGI性能优化
- processes参数根据服务器CPU核心数合理设置,通常为CPU核心数的2倍
- threads参数根据应用类型设置,IO密集型应用可适当增加线程数
- 启用master进程模式,便于管理和监控子进程
- 使用Unix Socket代替TCP Socket,减少网络开销
9.2 Nginx性能优化
- 启用Gzip压缩,减少传输数据量
- 配置静态资源缓存,设置合理的expires时间
- 调整worker_processes和worker_connections参数
- 启用keepalive连接,减少连接建立开销
# Nginx配置示例(性能优化部分)
gzip on;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
location /static/ {
alias /root/www/project/myproject/static/;
expires 30d;
add_header Cache-Control "public, immutable";
}9.3 安全加固
- Django生产环境必须设置DEBUG=False
- ALLOWED_HOSTS配置为具体的域名或IP,不使用通配符
- 使用HTTPS协议,配置SSL证书
- 设置安全的SECRET_KEY,不使用默认值或硬编码
- 定期更新系统和依赖包,修复安全漏洞
- 配置Nginx限制请求大小,防止DDoS攻击
十、常见问题与排查
10.1 uWSGI启动失败
检查uwsgi.ini中的路径配置是否正确,特别是chdir和module参数。查看uWSGI日志文件/var/log/uwsgi/myproject.log获取详细错误信息。
10.2 502 Bad Gateway错误
这通常表示Nginx无法连接到uWSGI。检查uWSGI是否正常运行,Socket文件是否存在且权限正确。确保Nginx配置中的uwsgi_pass地址与uWSGI的socket配置一致。
10.3 静态文件无法加载
确认已执行collectstatic命令,静态文件已收集到STATIC_ROOT目录。检查Nginx配置中/static/路径的alias是否正确指向STATIC_ROOT。检查Nginx进程是否有读取静态文件目录的权限。
10.4 请求头过大错误
如果遇到"invalid request block size"错误,说明请求头超过了uWSGI默认的4096字节缓存大小。可以在uwsgi.ini中增加buffer-size参数,例如设置为65536。
十一、总结
本文详细介绍了在腾讯云Linux云服务器上使用Nginx+uWSGI部署Django项目的完整流程。从架构原理出发,逐步讲解了服务器环境配置、Python虚拟环境搭建、Django项目生产环境准备、uWSGI应用服务器配置、Nginx反向代理与静态文件服务、进程管理与开机自启、性能优化与安全加固等核心环节。通过这套部署方案,可以将Django项目从本地开发环境平滑迁移至腾讯云生产环境,实现高可用、高性能的Web服务。
Nginx与uWSGI的组合是目前部署Django项目的主流方案之一。Nginx作为高性能的HTTP服务器和反向代理服务器,负责处理静态资源请求、负载均衡和SSL终止等任务。uWSGI则是一个实现了WSGI协议的Web服务器,它支持多进程与多线程模型,能够高效执行Python Web应用。两者结合,既发挥了Nginx处理高并发静态请求的优势,又利用了uWSGI对Python应用的高效执行能力。
在实际部署过程中,可能会遇到各种问题,需要耐心排查日志、检查配置、验证权限。建议在部署前充分测试,部署后持续监控,确保服务的稳定运行。随着业务规模的增长,还可以进一步引入负载均衡、容器化部署等更高级的架构方案。
常见问题与解答
问1:为什么生产环境不能使用Django自带的runserver命令?
答:Django自带的runserver仅用于开发调试,其性能非常有限,无法承受生产环境的并发压力。生产环境必须使用uWSGI、Gunicorn等专业的WSGI服务器。
问2:uWSGI必须安装在虚拟环境中吗?
答:uWSGI必须安装在项目所使用的Python环境中。如果项目使用虚拟环境,则uWSGI也应该安装在虚拟环境中,启动时也应在虚拟环境下进行。
问3:修改Django代码后需要重启uWSGI吗?
答:一般情况下,修改Django代码后需要重启uWSGI才能使改动生效。如果希望在代码改动时自动生效,可以在uwsgi.ini中配置touch-reload参数。
问4:Nginx和uWSGI之间使用TCP通信还是Unix Socket通信更好?
答:推荐使用Unix Socket通信,因为Unix Socket比TCP开销更小,性能更高。但需要确保Nginx进程有权限访问Socket文件。
问5:部署后静态文件无法加载是什么原因?
答:静态文件无法加载通常有以下原因:未执行collectstatic命令收集静态文件;Nginx配置中/static/路径的alias或root指向错误;Nginx进程没有读取静态文件目录的权限。
问6:如何让Django项目在服务器重启后自动启动?
答:可以使用Supervisor管理uWSGI进程,并设置Supervisor和Nginx为开机自启。通过systemctl enable命令可以将服务设置为开机自启动。




