跳到主要内容

SuperVisor 持久化部署内网云隧道

用 Supervisor 守护你的 nssh 隧道,开机自启、挂了自动重启,比 crontab 更可靠。


🤔 为什么需要 Supervisor?

你已经知道 nssh --daemon 可以后台运行隧道,但有两个问题:

问题说明
🔄 服务器重启后隧道没了--daemon 只是当前会话后台运行,重启就没了
💀 隧道断了没人管虽然 nssh 有自动重连,但极端情况下进程会退出

Supervisor 就是一个「进程管家」——它负责:

  • ✅ 开机自动拉起 nssh 隧道
  • ✅ 进程挂了自动重启
  • ✅ 统一管理多个隧道的启动/停止/日志

一、安装 Supervisor

# Debian / Ubuntu
apt-get update && apt-get install -y supervisor

# CentOS / RHEL
yum install -y supervisor

# 启动并设置开机自启
systemctl enable --now supervisor

验证安装:

supervisorctl status
# 输出 "no processes to running" 说明安装成功,还没有配置任何服务

💡 Supervisor 是什么? 简单说就是一个 Linux 进程管理工具。你在配置文件里写「我要运行这个命令」,Supervisor 就帮你跑起来,挂了还会自动重启。


二、配置 nssh 隧道

2.1 创建配置文件

cat > /etc/supervisor/conf.d/nssh-tunnel.conf << 'EOF'
[program:nssh-tunnel]
command=/usr/local/bin/nssh_client -R 80:127.0.0.1:8080 yourname@gz2.neiwangyun.net -p 22 --passwd yourpassword --daemon
autostart=true
autorestart=true
numprocs=1
killasgroup=true
stopasgroup=true
stderr_logfile=/var/log/nssh-tunnel-err.log
stdout_logfile=/var/log/nssh-tunnel-out.log
EOF

⚠️ 把 yournameyourpassword 换成你自己的内网云隧道账号密码。

2.2 参数说明

参数人话翻译
[program:nssh-tunnel]服务名称Supervisor 内部标识,自己起个好认的名字
commandnssh 启动命令跟你手动在终端敲的一模一样
autostarttrueSupervisor 启动时自动拉起这个隧道
autorestarttrue隧道挂了自动重启(这才是 Supervisor 的核心价值)
numprocs1只跑 1 个实例(别重复拉起)
killasgrouptrue停止时杀掉整个进程组(nssh 可能有子进程)
stopasgrouptrue同上,停止时清理干净
stderr_logfile日志路径错误日志,排查问题用
stdout_logfile日志路径标准输出日志

💡 killasgroupstopasgroup 很重要! nssh 的 --daemon 模式会 fork 子进程,如果不加这两个参数,Supervisor 停止时只杀父进程,子进程会变成僵尸进程继续占用端口。

2.3 如果你有多个隧道

每个隧道一个配置文件,名称必须唯一

# 隧道 1:JupyterLab
cat > /etc/supervisor/conf.d/nssh-jupyter.conf << 'EOF'
[program:nssh-jupyter]
command=/usr/local/bin/nssh_client -R 80:127.0.0.1:8888 yourname@gz2.neiwangyun.net -p 22 --passwd yourpassword --daemon
autostart=true
autorestart=true
numprocs=1
killasgroup=true
stopasgroup=true
stderr_logfile=/var/log/nssh-jupyter-err.log
stdout_logfile=/var/log/nssh-jupyter-out.log
EOF

# 隧道 2:图床
cat > /etc/supervisor/conf.d/nssh-lsky.conf << 'EOF'
[program:nssh-lsky]
command=/usr/local/bin/nssh_client -R 80:127.0.0.1:8080 yourname@gz2.neiwangyun.net -p 22 --passwd yourpassword --daemon
autostart=true
autorestart=true
numprocs=1
killasgroup=true
stopasgroup=true
stderr_logfile=/var/log/nssh-lsky-err.log
stdout_logfile=/var/log/nssh-lsky-out.log
EOF

⚠️ 每个 [program:xxx] 的名称必须唯一! 如果两个配置文件写了相同的 [program:nssh-tunnel],Supervisor 会报错。


三、启动和管理

3.1 加载配置并启动

# 让 Supervisor 重新加载配置文件
supervisorctl reread
supervisorctl update

# 启动隧道
supervisorctl start nssh-tunnel

3.2 日常管理命令

命令作用
supervisorctl status查看所有隧道的状态
supervisorctl status nssh-tunnel查看某个隧道的详细状态
supervisorctl start nssh-tunnel启动隧道
supervisorctl stop nssh-tunnel停止隧道
supervisorctl restart nssh-tunnel重启隧道
supervisorctl tail nssh-tunnel实时查看日志

3.3 验证隧道运行

# 查看状态
supervisorctl status nssh-tunnel
# 应该显示 RUNNING

# 查看隧道列表
nssh_client --list
# 应该看到隧道 status 为 online

# 检查日志
tail -f /var/log/nssh-tunnel-out.log

看到 INF Tunnel established successfully! 就说明隧道通了 ✅


四、Supervisor vs crontab 对比

对比项Supervisorcrontab @reboot
开机自启
挂了自动重启
日志管理✅ 内置❌ 手动
多隧道管理✅ 一条命令❌ 每个单独配
启停控制start/stop❌ 需要手动杀进程
安装成本需要安装系统自带
资源占用~5MB几乎 0

💡 我的建议: 如果你只有 1 条隧道且不想装额外软件,用 crontab 就够了。如果有 2 条以上隧道,或者需要方便地启停/查日志,Supervisor 更省心。


五、常见问题

Q: 配置改了怎么生效?

# 修改配置文件后,执行:
supervisorctl reread # 重新读取配置
supervisorctl update # 更新有变化的服务

Q: 隧道一直重启(Restarting)怎么办?

大概率是 nssh 命令有误,先手动跑一次确认能连上:

# 前台运行,看报什么错
/usr/local/bin/nssh_client -R 80:127.0.0.1:8080 yourname@gz2.neiwangyun.net -p 22 --passwd yourpassword

常见原因:

  • 密码错误 → 输出 authentication failed
  • 网络不通 → 输出 dial tcp: lookup ... no such host
  • 端口被占用 → 输出 bind: address already in use

Q: 怎么查看日志?

# 实时跟踪
supervisorctl tail -f nssh-tunnel

# 或者直接看文件
tail -f /var/log/nssh-tunnel-out.log

Q: 不想用 Supervisor 了怎么卸载?

# 先停掉所有服务
supervisorctl stop all

# 卸载
apt-get remove -y supervisor
# 配置文件还在 /etc/supervisor/,想清理就手动删

📚 参考资料


📝 本教程由内网云团队整理,如有问题欢迎反馈。