阿里云Linux云服务器使用Nginx+uWSGI部署Django项目全攻略
前言:为什么选择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 deploy3.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/activate4.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/simple4.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 migrateDjango项目默认使用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 = trueprocesses参数可根据实例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 django7.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配置文件中的processes和threads参数是否合理。
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核心数设置,建议为核心数×2threads:每个进程的线程数,建议设置为2-4buffer-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=true和autorestart=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。设置过少无法充分利用硬件资源,设置过多则可能导致上下文切换开销过大,反而降低性能。



