腾讯云Linux云服务器使用Nginx+uWSGI部署Django项目全攻略

apphuang2026年07月14日 20:46:501

一、部署架构概述

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-devel

2.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.txt

4.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 --noinput

collectstatic命令会将所有应用中的静态文件复制到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 nginx

6.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 status

8.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命令可以将服务设置为开机自启动。

相关文章

腾讯云服务器购买优惠!3 个省钱攻略 + 1 个安全真相,新手必看!

腾讯云服务器购买优惠!3 个省钱攻略 + 1 个安全真相,新手必看!

最近后台总收到小伙伴私信:“腾讯云服务器看着挺好,但价格有点顶,学生党 / 小团队实在买不起咋办?” 别急!今天就来手把手教你 “花小钱办大事”,不光有省钱攻略,还会扒一扒大家最关心的安全问题,看完这…

After 10 Years as a Tencent Cloud Agent, Let Me Talk About Rebates

After 10 Years as a Tencent Cloud Agent, Let Me Talk About Rebates

Lately, I’ve been getting a lot of questions from friends: “Does Tencent offer rebates? Can you…

2026腾讯云代理商返利政策深度解析:头部代理合作指南与成本优化策略

2026腾讯云代理商返利政策深度解析:头部代理合作指南与成本优化策略

一、腾讯云代理商返利机制核心逻辑1. 行业背景与代理模式腾讯云作为国内公有云市场的第二大领导者(据IDC 2025年数据,占据国内27.6%的市场份额),采用渠道商代理模式拓展市场。代理商负…

2026腾讯云代理商返利政策深度解析:头部代理合作指南与成本优化策略

2026腾讯云代理商返利政策深度解析:头部代理合作指南与成本优化策略

一、腾讯云代理商返利机制核心逻辑1. 行业背景与代理模式腾讯云作为国内公有云市场的第二大领导者(据IDC 2025年数据,占据国内27.6%的市场份额),采用渠道商代理模式拓展市场。代理商负…

2026腾讯云代理商返佣政策全解析:五级代理体系与企业上云成本优化指南

2026腾讯云代理商返佣政策全解析:五级代理体系与企业上云成本优化指南

一、腾讯云五级代理体系:权益阶梯与合作价值1. 五级代理的核心权益差异腾讯云按规模、服务能力与合作深度,构建了从基础到顶级的五级代理体系,各级权益呈现显著阶梯差:•标准级代理:入门门槛最低,仅能提供基…

2026年腾讯云代理深度解析:从折扣体系到最优合作策略

2026年腾讯云代理深度解析:从折扣体系到最优合作策略

上海汪远信息科技有限公司作为腾讯云全国级殿堂级代理,凭借13年云服务经验与深厚的官方合作关系,为企业提供全方位的上云支持,可百度:上海汪远信息科技有限公司,微信:791201210一、腾讯云代理体系全…