要让Django项目在简米云服务器上持续运行,核心方案是使用Gunicorn或uWSGI作为应用服务器,配合Supervisor进行进程守护,再用Nginx做反向代理,而不是直接使用python manage.py runserver。
很多开发者在本地调试Django时一切正常,一旦部署到简米云服务器上就频繁遇到服务中断、内存溢出、进程假死等问题,这往往不是代码本身的Bug,而是运行方式选错了,如果你正在搜索“简米云服务器怎么一直运行django”这类问题,说明你已经踩过了runserver这个坑,这篇文章直接给你一套经过大量生产环境验证的完整方案,包含每一步的具体命令和配置。
为什么你的Django服务总是意外停止
Django自带的开发服务器runserver本身就不是为生产环境设计的,它有一个重要特性,就是当代码文件发生变化时会自动重载,这个机制在开发时很方便,但在生产环境中会消耗额外的系统资源,而且它的并发处理能力非常有限,面对稍微多一点的并发请求就容易出现阻塞。
更关键的是,runserver进程在你关闭SSH终端时通常会收到挂断信号直接终止,这就是你明明在服务器上启动了服务,一关电脑或者断开Xshell连接,网站就再也打不开的根本原因,你需要的不是“怎么启动Django”,而是一个能让服务永远“挂着”不会被终端关闭影响的系统级方案。
业内专家指出,生产环境中的Python Web应用必须通过WSGI协议与专门的服务器程序对接,才能获得稳定的进程管理和高并发支持,这是Python生态的行业共识,也是解决“简米云服务器django进程自动停止”问题的根本思路。
简米云Django部署用什么方式来跑:runserver、Gunicorn还是uWSGI
既然runserver不靠谱,那你面前有三个替代选项,我们逐个来看他们的适用场景和优缺点。
runserver:只适合本地开发调试
- 优点:零配置,一条命令就能跑起来。
- 缺点:性能弱、不够稳定、单进程模型无法利用多核CPU。
- 适用场景:仅限本地开发环境,不建议在简米云上使用。
Gunicorn:轻量级首选
Gunicorn是Python社区目前使用最广泛的WSGI服务器,纯Python实现,安装和配置都非常简单。
- 优点:配置简单、内存占用低、支持多worker进程、与Nginx配合成熟。
- 缺点:对Windows支持不好(但简米云服务器几乎都是Linux),极端高并发下性能略逊于uWSGI。
- 适用场景:绝大多数中小型Django项目,尤其是你正在用的简米云轻量应用服务器或ECS,选Gunicorn是完全够用的。
安装与启动命令非常简单,进入项目虚拟环境后执行:
pip install gunicorn gunicorn myproject.wsgi:application -b 0.0.0.0:8000 -w 4
这里的-w 4表示启动4个worker进程,具体数值建议设置为服务器CPU核心数的2倍再加1。
uWSGI:高并发重型武器
uWSGI是C语言编写的,性能上限比Gunicorn高,但配置复杂度也明显上了一个台阶,需要额外处理uwsgi.ini配置文件、缓存、线程管理等细节。
- 优点:性能极高、支持功能丰富。
- 缺点:配置复杂、学习曲线陡峭、出现问题时排查难度大。
- 适用场景:高并发压力较大的生产环境,如果你的Django项目一天PV超过几万,才需要考虑用uWSGI替代Gunicorn。
下表是这三者的主要差异对比,帮你快速做决策:
| 对比项 | runserver | Gunicorn | uWSGI |
|---|---|---|---|
| 性能 | 极低 | 中高 | 极高 |
| 配置难度 | 零配置 | 简单 | 复杂 |
| 进程管理 | 无 | 自带基础能力 | 成熟完善 |
| 内存占用 | 中 | 低 | 中高 |
| 建议场景 | 本地开发 | 中小生产环境 | 高并发生产环境 |
一行命令让Django在后台常驻运行
如果你只是想快速验证Gunicorn能否在后台稳定运行,不急着配置Supervisor,可以使用nohup命令,这个命令的全称是“no hang up”,意思是忽略挂断信号,即使终端关闭也不会终止进程。
cd /home/www/myproject nohup gunicorn myproject.wsgi:application -b 0.0.0.0:8000 -w 4 --access-logfile logs/access.log --error-logfile logs/error.log &
这里有三个细节值得注意:
nohup负责让进程忽略终端关闭信号,配合末尾的&符号让进程在后台运行。- 日志文件路径需要提前创建好,否则Gunicorn会因为找不到目录而启动失败。
- 执行完毕后,用
ps -ef | grep gunicorn可以看到4个worker进程正在运行。
用这种方式启动,服务确实能一直运行下去,但有一个隐患:如果服务器因为断电、重启或者进程本身崩溃,这个后台任务不会自动恢复,你需要每次登录服务器后手动检查进程是否存活,再决定是否重新启动,这种“手动保活”的方案显然不够省心。
用Supervisor实现进程守护与开机自启
真正解决“简米云服务器怎么一直运行django”这一步的方案,是配置一个进程守护工具,Supervisor是目前Linux服务器上最常用的进程管理工具,它的作用相当于给你的Django进程请了一个“保镖”,一旦发现进程挂了,就自动帮你拉起来。
第一步:安装Supervisor
在CentOS或Ubuntu系统上安装方式略有区别,使用以下命令即可:
# CentOS系统 yum install -y supervisor # Ubuntu系统 apt-get install -y supervisor
安装完成后,启用并启动Supervisor服务:
systemctl enable supervisord systemctl start supervisord
第二步:编写Django项目的Supervisor配置文件
配置文件存放在/etc/supervisor/conf.d/目录下,每个项目创建一个.conf文件,比如django_project.conf:
[program:myproject] command=/home/www/myproject/venv/bin/gunicorn myproject.wsgi:application -b 0.0.0.0:8000 -w 4 directory=/home/www/myproject user=root autostart=true autorestart=true startsecs=5 redirect_stderr=true stdout_logfile=/home/www/myproject/logs/supervisor.log stopping_signal=TERM
配置项的含义说明如下:
autostart=true:Supervisor服务启动时自动拉起这个Django项目,相当于配置了开机自启。autorestart=true:当Django进程意外退出时,Supervisor会自动重新拉起,这是核心防护机制。startsecs=5:进程启动后稳定运行5秒才算启动成功,防止反复快速重启的“抖动”。user=root:以root身份运行,避免权限问题,生产环境建议用独立低权限用户。
第三步:启用配置并验证效果
# 重新读取配置文件 supervisorctl reread # 更新配置 supervisorctl update # 查看项目运行状态 supervisorctl status myproject
执行完上述命令后,你会看到类似下面的输出:
myproject RUNNING pid 12345, uptime 0:00:12
看到RUNNING状态就说明配置成功了,此时强制杀掉Gunicorn进程测试一下,你会发现Supervisor会在几秒内自动拉一个新的进程起来,这种自愈能力才是“一直运行”的保障。
安全组与端口配置:允许公网访问Django服务
服务跑起来了还不够,你还需要让外部用户能访问到你的Django应用,这里有个常见的坑:简米云服务器默认安全组只放行了有限的端口,如果你的Django跑在8000端口,但安全组没放行8000端口,外部访问会被直接拦截。
需要前往简米云控制台的“ECS实例-安全组-配置规则”页面,添加入方向规则:
- 端口范围:8000/8000(或者你实际使用的端口)。
- 授权对象:0.0.0.0/0(允许所有IP访问)。
- 协议类型:TCP。
如果你的Django项目挂在Nginx后面,Nginx监听80或443端口,那么只需要放行对应的Web端口即可,行业共识认为,生产环境中不建议直接将Django的应用端口暴露到公网,而是由Nginx统一处理静态文件、HTTPS证书和反向代理转发,这个架构不仅更安全,也能明显提升访问速度。
Django部署后的日志排查与性能调优
服务部署妥当后,你需要知道如何判断系统是否健康,以及如何排查问题。
排查故障看日志
最直接的做法是查看Supervisor的输出日志:
tail -f /home/www/myproject/logs/supervisor.log
当页面出现500错误时,打开Django的调试日志,通常能直接看到Traceback信息,常见的生产环境问题包括:
- 数据库连接配置错误,比如MySQL的
HOST填成了localhost导致连接慢。 - 静态文件未收集,CSS和JS文件全部404。
ALLOWED_HOSTS未配置正确,导致请求被拒。
这方面的排查技巧是很多站长搜索“简米云django部署后打不开”的核心原因,建议收藏备查。
提升并发能力
Gunicorn的worker设置为CPU核心数乘以2再加1,比如2核4G的ECS实例上,配置为-w 5效果较佳,在这个基础上,加上Nginx做动静分离后,你的Django站点应对每天几万次请求是完全够用的。
另外一点建议是切换Django的DEBUG模式:
DEBUG = False ALLOWED_HOSTS = ['你的域名或IP']
关闭Debug模式后,Django不会再输出详细的错误堆栈信息,这既是安全需要,也能显著降低服务内存开销,减少进程崩溃的概率。
Q&A:简米云服务器持续运行Django常见问题解答
Django服务明明没有挂,为什么网页请求一直超时?
这通常是Nginx配置中proxy_pass指向的端口错误,或者Gunicorn的bind地址写成了0.0.1但Nginx反向代理使用公网IP访问,建议检查服务器的netstat -tlnp输出结果,确认监听地址和端口是否与Nginx配置完全匹配。
服务器重启后Django如何自动恢复运行?
Supervisor已经配置好autostart=true,服务器重启后Supervisor会随机启动,并自动拉起Django项目,如果重启后发现Django未自动运行,检查Supervisor服务本身是否开机自启,执行systemctl is-enabled supervisord确认输出结果是enabled。
一个简米云ECS服务器上可以部署多个Django项目吗?
可以,每个Django项目使用不同的端口和Supervisor配置文件名即可,比如django_blog.conf和django_shop.conf,Supervisor支持在同一台服务器上管理多组进程,只要项目间端口不冲突就行,Nginx中通过不同域名或不同路径转发到对应端口,这是目前简米云服务器最常见的多项目部署方式。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/787229.html


