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

apphuang2026年07月03日 09:29:306

前言:为什么选择Nginx+uWSGI部署Django

Django框架自带的开发服务器python manage.py runserver仅适用于开发和调试阶段,它性能有限、不具备并发处理能力,且存在安全风险。在生产环境中,需要将Django应用部署到专业的应用服务器上,并配合反向代理服务器实现动静分离、负载均衡和高并发处理。

Nginx与uWSGI的组合是目前部署Django项目的主流方案之一。Nginx作为高性能的HTTP服务器和反向代理服务器,负责处理静态资源请求、负载均衡和SSL终止等任务。uWSGI则是一个实现了WSGI协议的应用服务器,作为Nginx与Django应用之间的桥梁,负责运行Python代码并处理动态请求。这种分层架构能够充分发挥各自优势,提升服务的整体性能和稳定性。

需要先登录阿里云控制台,点击:阿里云控制台,进入ECS产品页面进行实例的购买与管理。

一、整体架构与工作原理

在开始动手之前,先理解整个架构的请求流转过程。

用户通过浏览器访问网站,请求到达服务器后,首先由Nginx接收。Nginx会判断请求类型:如果请求的是静态资源(如CSS样式表、JavaScript脚本、图片等),Nginx直接从服务器本地文件系统中读取并返回,这一过程不经过Django应用,因此响应速度极快。如果请求的是动态内容(如API接口、页面渲染等),Nginx则将请求通过uWSGI协议转发给uWSGI服务器。uWSGI接收到请求后,将其传递给Django应用进行处理——Django执行相应的业务逻辑(如数据库查询、模板渲染等),生成响应数据后返回给uWSGI,再由uWSGI回传给Nginx,最终由Nginx将响应返回给用户浏览器。

这一架构的核心优势在于“动静分离”。Nginx处理静态文件的能力极为出色,而Django只需专注于动态业务逻辑,两者各司其职,互不干扰,大大降低了Django应用的负载,提升了整体并发处理能力。

二、准备工作:创建阿里云ECS实例

2.1 购买ECS实例

实例配置方面,官方推荐至少选择2 vCPU和4 GiB内存的规格。如果项目规模较小或仅用于测试,1核2GB的配置也可运行,但生产环境建议不低于上述推荐配置。操作系统建议选择Alibaba Cloud Linux 3、CentOS 7.x或Ubuntu 20.04/22.04。本文以Alibaba Cloud Linux 3为例进行演示。

网络配置方面,需为实例分配公网IPv4地址。如果实例创建时未分配公网IP,后续也可绑定弹性公网IP(EIP)。

安全组方面,建议新建安全组并至少放行以下端口:22(SSH)、80(HTTP)、443(HTTPS,如需启用)。如果使用Unix Socket方式通信,则uWSGI与Nginx之间无需额外开放端口。

2.2 安全组配置要点

安全组是阿里云的重要网络安全隔离机制,相当于云服务器的“虚拟防火墙”。在ECS控制台→实例→安全组→配置规则中,可以添加入方向规则。安全建议:22端口(SSH远程登录)的来源建议设置为你的本地IP或公司IP段,避免暴露给全网;80端口(HTTP网站访问)来源设置为0.0.0.0/0;443端口(HTTPS加密访问)后续配置SSL证书后使用。

安全组配置遵循最小权限原则,只开放必要的端口和IP段。同时建议定期审计安全组规则,删除过期或冗余的规则。

三、连接服务器与环境初始化

3.1 SSH远程连接

获取ECS实例的公网IP地址后,使用SSH命令连接服务器:

ssh root@你的ECS公网IP

首次登录会提示修改密码或确认安全指纹。出于安全考虑,建议创建一个非root用户用于日常操作:

adduser deploy
usermod -aG sudo deploy

3.2 更新系统与安装基础工具

登录后首先更新系统包索引并安装基础开发工具:

sudo apt update
sudo apt upgrade -y
sudo apt install -y python3 python3-pip python3-venv nginx git curl

对于Alibaba Cloud Linux或CentOS系统,使用yum包管理器:

sudo yum update -y
sudo yum install -y python3.8 python38-devel pcre-devel gcc make nginx

默认源的Nginx版本过旧,有安全风险。建议添加Nginx官方源以安装最新的稳定版本:

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

四、部署Django应用

4.1 创建项目目录与虚拟环境

创建项目的目录结构:

sudo mkdir -p /srv/django-app/{logs,static,media}
sudo mkdir -p /run/uwsgi

推荐为项目创建Python虚拟环境,可以隔离项目依赖,避免不同项目间的包版本冲突。进入项目目录并创建虚拟环境:

cd /srv/django-app
python3 -m venv venv
source venv/bin/activate

4.2 安装Django与uWSGI

在虚拟环境中安装Django和uWSGI。使用阿里云镜像源可以加快下载速度:

pip install --upgrade pip wheel -i https://mirrors.aliyun.com/pypi/simple
pip install "Django>=4.2,<5.0" "uwsgi>=2.0.23" -i https://mirrors.aliyun.com/pypi/simple

4.3 创建Django项目

使用django-admin命令创建项目:

django-admin startproject myproject /srv/django-app/

4.4 生产环境配置

修改项目配置文件 /srv/django-app/myproject/settings.py,以满足生产环境的安全和性能要求。

设置DEBUG = False。此操作可防止应用出错时泄露敏感配置与代码细节。

设置ALLOWED_HOSTS属性为实例的公网IP地址或域名。如果此列表为空,应用将无法启动。这是Django的一项内置安全机制:

ALLOWED_HOSTS = ['你的ECS公网IP', '你的域名.com']

在文件末尾添加静态文件根目录配置:

STATIC_ROOT = BASE_DIR / 'static'

4.5 收集静态文件与数据库迁移

同步示例项目的静态文件至指定目录(STATIC_ROOT),以供Nginx直接访问:

python /srv/django-app/manage.py collectstatic --noinput

执行数据库迁移,在数据库中创建存储用户等应用数据所需的表结构:

python /srv/django-app/manage.py migrate

Django项目默认使用SQLite3数据库,该配置不适用于生产环境。建议修改myproject/settings.py文件中的DATABASES配置,改用PostgreSQL或MySQL等生产级数据库。

五、配置uWSGI服务

5.1 创建uWSGI配置文件

在项目根目录下创建uWSGI配置文件 /srv/django-app/uwsgi.ini

[uwsgi]
# 项目根目录
chdir = /srv/django-app
# Django项目的WSGI模块
module = myproject.wsgi:application
# 使用Unix Socket与Nginx通信
socket = /run/uwsgi/django.sock
# Socket文件的权限
chmod-socket = 666
# 进程与线程设置
processes = 4
threads = 2
# 主进程管理
master = true
# 日志文件
logto = /srv/django-app/logs/uwsgi.log
# 进程ID文件
pidfile = /run/uwsgi/uwsgi.pid
# 启用线程支持
enable-threads = true
# 优雅重启
vacuum = true

processes参数可根据实例CPU核心数进行调整,建议设置为核心数×2。建议使用非特权用户运行服务,即使服务被攻击,攻击者也无法获得服务器的最高权限。

5.2 测试uWSGI启动

使用配置文件启动uWSGI进行测试:

uwsgi --ini /srv/django-app/uwsgi.ini

如果启动成功,可以通过检查/run/uwsgi/django.sock文件是否存在来确认uWSGI是否正常运行。

六、配置Nginx反向代理

6.1 创建Nginx站点配置文件

/etc/nginx/conf.d//etc/nginx/sites-available/目录下创建Django项目的Nginx配置文件/etc/nginx/conf.d/django.conf

server {
    listen 80;
    server_name 你的ECS公网IP 你的域名.com;
    
    # 静态文件直接由Nginx提供
    location /static/ {
        alias /srv/django-app/static/;
        expires 30d;
    }
    
    # 媒体文件
    location /media/ {
        alias /srv/django-app/media/;
        expires 30d;
    }
    
    # 动态请求转发给uWSGI
    location / {
        include uwsgi_params;
        uwsgi_pass unix:/run/uwsgi/django.sock;
    }
    
    # 日志配置
    access_log /srv/django-app/logs/nginx_access.log;
    error_log /srv/django-app/logs/nginx_error.log;
}

6.2 测试与重启Nginx

测试Nginx配置文件语法是否正确:

nginx -t

如果测试通过,重启Nginx使配置生效:

systemctl restart nginx

对于使用systemd的系统,也可以使用:

systemctl enable nginx
systemctl start nginx

七、进程管理与开机自启

7.1 使用Supervisor管理uWSGI进程

在生产环境中,需要确保uWSGI进程在意外退出后能够自动重启。Supervisor是一个进程管理工具,非常适合用于管理uWSGI等应用进程。

安装Supervisor:

pip install supervisor

或使用系统包管理器:

sudo apt install supervisor   # Ubuntu/Debian
sudo yum install supervisor   # CentOS/Alibaba Cloud Linux

创建Supervisor配置文件 /etc/supervisor/conf.d/django.conf

[program:django]
command=/srv/django-app/venv/bin/uwsgi --ini /srv/django-app/uwsgi.ini
directory=/srv/django-app
user=root
autostart=true
autorestart=true
startretries=3
stdout_logfile=/srv/django-app/logs/supervisor.log
stderr_logfile=/srv/django-app/logs/supervisor_error.log
environment=LANG=en_US.UTF-8,LC_ALL=en_US.UTF-8

重新加载Supervisor配置:

supervisorctl reread
supervisorctl update
supervisorctl start django

7.2 检查进程状态

使用以下命令查看uWSGI进程状态:

supervisorctl status

或直接检查进程:

ps aux | grep uwsgi

八、域名绑定与SSL证书配置

8.1 域名解析

在阿里云域名控制台中,将域名解析到ECS实例的公网IP地址。添加A记录,将域名指向服务器IP。

8.2 申请SSL证书

购买阿里云服务器后,可以申请免费SSL证书。在阿里云SSL证书服务中申请DV免费证书,下载适用于Nginx的证书文件,通常包含.crt(或.pem)和.key两个文件。

8.3 配置Nginx支持HTTPS

修改Nginx配置文件,添加HTTPS相关配置:

server {
    listen 443 ssl http2;
    server_name 你的域名.com;
    
    ssl_certificate /path/to/your/domain.crt;
    ssl_certificate_key /path/to/your/domain.key;
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers HIGH:!aNULL:!MD5;
    
    location /static/ {
        alias /srv/django-app/static/;
        expires 30d;
    }
    
    location /media/ {
        alias /srv/django-app/media/;
        expires 30d;
    }
    
    location / {
        include uwsgi_params;
        uwsgi_pass unix:/run/uwsgi/django.sock;
    }
}

# HTTP自动跳转HTTPS
server {
    listen 80;
    server_name 你的域名.com;
    return 301 https://$server_name$request_uri;
}

配置完成后重启Nginx使配置生效。

九、常见问题排查与解决

9.1 502 Bad Gateway错误

502错误是最常见的部署问题之一。可能的原因包括:

  • uWSGI服务未启动或启动失败
  • uWSGI的socket文件路径与Nginx配置不一致
  • socket文件的权限问题
  • uWSGI进程崩溃或超时

排查步骤:

# 检查uWSGI是否运行
ps aux | grep uwsgi
# 检查socket文件是否存在
ls -la /run/uwsgi/django.sock
# 查看uWSGI日志
tail -f /srv/django-app/logs/uwsgi.log
# 查看Nginx错误日志
tail -f /srv/django-app/logs/nginx_error.log

如果uWSGI进程意外退出,Supervisor会自动重启。如果频繁崩溃,需要检查uWSGI配置文件中的processesthreads参数是否合理。

9.2 静态文件无法加载

如果静态文件无法加载,检查以下几点:

  • 确认已执行collectstatic命令
  • 检查Nginx配置中location /static/alias路径是否正确
  • 确认Nginx进程有权限读取静态文件目录

9.3 ALLOWED_HOSTS配置错误

如果Django启动后访问出现“Invalid HTTP_HOST”错误,检查settings.py中的ALLOWED_HOSTS是否包含了访问时使用的域名或IP地址。

十、性能优化建议

10.1 uWSGI参数优化

  • processes:根据CPU核心数设置,建议为核心数×2
  • threads:每个进程的线程数,建议设置为2-4
  • buffer-size:如果处理大请求,可以适当增大
  • harakiri:设置请求超时时间,防止长时间占用的请求阻塞

10.2 Nginx缓存优化

在Nginx配置中为静态资源设置缓存头:

location /static/ {
    alias /srv/django-app/static/;
    expires 30d;
    add_header Cache-Control "public, immutable";
}

10.3 数据库连接优化

在生产环境中使用PostgreSQL或MySQL替代SQLite,并配置连接池参数。对于高并发场景,可以考虑使用Redis作为缓存后端,减轻数据库压力。

总结

本文详细介绍了在阿里云Linux云服务器上使用Nginx+uWSGI部署Django项目的完整流程。从ECS实例创建、安全组配置、Python环境搭建,到Django项目部署、uWSGI与Nginx配置、进程管理以及域名SSL配置,涵盖了生产环境部署的各个环节。

Nginx与uWSGI的组合能够高效处理高并发请求、快速提供静态资源、确保运行稳定性、增强安全性以保护敏感数据,并支持灵活扩展以应对流量高峰,从而显著提升用户体验和业务连续性。

希望本文能够帮助开发者将Django应用从本地开发环境平滑迁移至阿里云生产环境,实现高可用、高性能的Web服务部署。在实际部署过程中如果遇到问题,建议仔细查看日志文件,多数问题都可以通过日志定位并解决。

常见问题问答

问1:部署后访问网站出现502 Bad Gateway错误,该如何排查?
答:502错误通常表示Nginx无法与uWSGI正常通信。首先检查uWSGI是否正在运行(ps aux | grep uwsgi),然后检查socket文件是否存在(ls -la /run/uwsgi/django.sock),最后查看uWSGI和Nginx的日志文件定位具体错误原因。

问2:静态文件无法加载,页面样式丢失怎么办?
答:首先确认是否执行了python manage.py collectstatic命令将静态文件收集到STATIC_ROOT目录。然后检查Nginx配置中location /static/alias路径是否指向正确的静态文件目录。最后确认Nginx进程是否有权限读取该目录。

问3:如何让uWSGI在服务器重启后自动启动?
答:推荐使用Supervisor进程管理工具。安装Supervisor后创建配置文件,设置autostart=trueautorestart=true,这样uWSGI进程就会在系统启动时自动启动,并在意外退出后自动重启。

问4:Django项目的DEBUG模式在生产环境应该关闭吗?
答:是的,生产环境必须将DEBUG = False。开启DEBUG模式会暴露敏感信息(如数据库配置、代码路径、错误堆栈等),存在严重的安全风险。同时需要正确配置ALLOWED_HOSTS,否则Django将拒绝服务。

问5:如何为Django项目配置HTTPS?
答:首先在阿里云SSL证书服务中申请免费DV证书,下载适用于Nginx的证书文件(.crt和.key)。然后在Nginx配置中添加443端口的server块,配置ssl_certificate和ssl_certificate_key指向证书文件路径,并添加HTTP自动跳转HTTPS的配置。

问6:uWSGI的processes参数应该设置为多少?
答:processes参数建议根据ECS实例的CPU核心数来设置,一般建议设置为CPU核心数的2倍。例如4核CPU建议设置为8。设置过少无法充分利用硬件资源,设置过多则可能导致上下文切换开销过大,反而降低性能。

相关文章

买阿里云服务器能便宜吗?十年代理揭秘 3 大省钱攻略!

买阿里云服务器能便宜吗?十年代理揭秘 3 大省钱攻略!

作为深耕阿里云代理领域 10 年的 “老司机”,经常被问到:“买阿里云服务器能便宜吗?有没有优惠价格?” 今天就用实打实的行业经验告诉你:不仅能便宜,选对渠道还能省一大笔! 这篇文章带你解锁阿里云服务…

做了 10 年腾讯云代理,我想跟你聊聊返佣那些事儿​

做了 10 年腾讯云代理,我想跟你聊聊返佣那些事儿​

最近总有朋友问我:“腾讯云有返点吗?腾讯云服务器能拿佣金不?返佣比例到底有多少?” 作为一个在腾讯云代理行业摸爬滚打了 10 年的 “老人”,今天就来跟大家好好…

阿里云代理商返佣机制深度解析:头部代理优势与企业合作策略

阿里云代理商返佣机制深度解析:头部代理优势与企业合作策略

阿里云代理商的核心价值定位1. 代理商的角色与职责阿里云代理商作为阿里云生态的核心合作伙伴,承担着双重核心职能:• 产品销售:负责推广销售阿里云全系列云产品,包括云服务器ECS、云数据库RDS、对象存…

阿里云代理商返佣机制深度解析:头部代理优势与企业合作策略

阿里云代理商返佣机制深度解析:头部代理优势与企业合作策略

01一、阿里云代理商的核心价值定位1. 代理商的角色与职责阿里云代理商作为阿里云生态的核心合作伙伴,承担着双重核心职能:• 产品销售:负责推广销售阿里云全系列云产品,包括云服务器ECS、云数据库RDS…

阿里云代理商有哪些?阿里云代理返点是真的么?

阿里云代理商有哪些?阿里云代理返点是真的么?

一,阿里云代理商基本介绍阿里云代理商通俗一点,就是指从事阿里云云服务器,云数据库等阿里云公有云产品销售的代理商,每销售一件阿里云公有云产品出去,阿里云给予该代理商一定比例的提成。在阿里云官方定义中,这…

2026阿里云代理商生态全解析:五级代理体系、返佣政策与企业上云指南

2026阿里云代理商生态全解析:五级代理体系、返佣政策与企业上云指南

一、阿里云五级代理体系:权益阶梯与合作价值1. 五级代理的核心权益差异阿里云构建了多层次的代理生态体系,涵盖全国总代理、区域核心代理、行业ISV(独立软件开发商)、金牌/银牌认证代理及标准代理五大核心…