Socket.io能否在共享主机运行?关闭终端后服务停止是什么原因
问题原因
你关闭终端后服务停止是Linux/Unix系统的默认机制导致的:你在shell会话前台启动的Node进程会和当前会话绑定,当你关闭终端触发会话结束时,系统会向该会话关联的所有子进程发送SIGHUP信号,直接终止进程。这个问题和权限无关,不需要root权限也可以实现服务的持续后台运行。
共享主机下可直接使用的解决方案
以下方案都不需要root权限,按你主机的支持情况选择即可:
- 临时运行可直接用nohup命令
启动时执行命令:nohup node app.js &
nohup会让进程忽略SIGHUP信号,末尾的&会把进程放到后台运行,执行后可以直接关闭终端,进程默认会把运行日志写入当前目录的nohup.out文件。需要停止服务时,先执行ps aux | grep app.js查询对应的进程ID,再执行kill 进程ID即可终止。 - 长期稳定运行推荐用PM2进程管理工具
先执行命令安装PM2:npm install pm2 -g
安装完成后启动服务:pm2 start app.js
PM2会自动托管进程,不仅会在终端关闭后保持运行,还会在进程异常崩溃时自动重启。常用的管理命令包括:pm2 status查看运行状态、pm2 logs app.js查看运行日志、pm2 stop app.js停止服务。如果你的共享主机允许用户配置开机自启,还可以执行pm2 startup按照提示操作实现开机自动启动服务。 - 优先用cpanel自带的Node.js应用管理功能
多数带cpanel面板的共享主机都内置了Node.js应用部署入口,你可以直接在面板中上传你的项目代码,指定启动文件为app.js、配置对应的端口和运行目录,面板会自动维护进程的运行状态,不需要你手动执行命令维护后台进程,也不容易被主机商的进程巡检判定为违规后台进程清理。
代码适配提示
你当前的app.js代码不需要做特殊修改即可适配上述方案,若你的共享主机限制了3000端口的外部访问,可在cpanel的Node应用配置中按照面板要求填写监听端口,大部分cpanel面板会自动做端口映射,不需要修改代码中的httpServer.listen配置。
内容的提问来源于stack exchange,提问作者Cain Nuke
相关产品推荐
相关产品推荐

