退出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
相关产品推荐
相关产品推荐

