You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

退出CentOS-7远程服务器后Django-Rest-Framework API无法访问求助

解决退出远程SSH后Django+Eventlet API无法访问的问题

我来帮你拆解下这个问题的核心原因,以及对应的解决办法:

为什么进程还在但API不能访问?

当你退出远程SSH会话时,系统会给该会话下的所有进程发送SIGHUP(挂起信号)。虽然你的runserver进程没被杀死(从ps aux输出能看到),但它的标准输入/输出/错误已经和终端完全断开。Eventlet的WSGI服务器依赖终端的I/O关联,一旦失去这个关联,就无法正常处理新的网络请求,导致API看起来“死掉”了。

快速临时解决方案(测试环境用)

1. 用nohup后台启动进程

直接用nohup命令启动项目,它会让进程忽略SIGHUP信号,同时把输出重定向到nohup.out文件:

nohup python3 manage.py runserver &

退出SSH后,进程会继续后台运行,API也能正常访问。

2. 用screen/tmux维持会话

这俩工具可以创建一个持久化的终端会话,即使你退出SSH,会话里的进程依然在运行:

  • 先执行screen创建新会话
  • 在新会话里启动你的Django项目
  • 按Ctrl+A+D分离会话(回到原来的SSH终端)
  • 退出SSH后,进程会在screen会话里继续运行
  • 下次登录服务器,执行screen -r就能重新连接到之前的会话

更稳定的解决方案(生产/长期运行用)

推荐用systemd把你的API做成系统服务,这样进程完全脱离SSH会话,还能实现开机自启、异常自动重启:

步骤1:创建systemd服务配置文件

在/etc/systemd/system/目录下新建一个服务文件,比如drf-api.service:

[Unit]
Description=Django DRF API with Eventlet
After=network.target  # 确保网络启动后再启动服务

[Service]
User=lll  # 用你的项目运行用户lll
WorkingDirectory=/home/lll/repo/Qit  # 项目根目录
ExecStart=/home/lll/repo/Qit/venv_dist/bin/python3 manage.py runserver  # 虚拟环境下的python路径
Restart=always  # 进程异常退出时自动重启
Environment="PATH=/home/lll/repo/Qit/venv_dist/bin"  # 指定虚拟环境的PATH

[Install]
WantedBy=multi-user.target  # 多用户模式下自动启动

步骤2:启动并启用服务

执行以下命令让systemd加载配置并启动服务:

sudo systemctl daemon-reload
sudo systemctl start drf-api.service
sudo systemctl enable drf-api.service  # 设置开机自启

之后你可以用以下命令管理服务:

  • 查看状态:sudo systemctl status drf-api.service
  • 重启服务:sudo systemctl restart drf-api.service
  • 停止服务:sudo systemctl stop drf-api.service

补充说明

你当前的wsgi.py配置本身没问题(监听('',8000)是正确的,会监听所有网卡),问题出在进程的运行环境依赖SSH会话。改用上面的方法后,进程会独立于SSH会话运行,就不会出现退出服务器后API失效的情况了。

内容的提问来源于stack exchange,提问作者qg_java_17137

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:26:08