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
⚠️ 把
yourname和yourpassword换成你自己的内网云隧道账号密码;配置文件里是明文保存的密码,记得收紧权限:sudo chmod 600 /etc/supervisor/conf.d/nssh-tunnel.conf,别让无关账号读到。
2.2 参数说明
| 参数 | 值 | 人话翻译 |
|---|---|---|
[program:nssh-tunnel] | 服务名称 | Supervisor 内部标识,自己起个好认的名字 |
command | nssh 启动命令 | 跟你手动在终端敲的一模一样 |
autostart | true | Supervisor 启动时自动拉起这个隧道 |
autorestart | true | 隧道挂了自动重启(这才是 Supervisor 的核心价值 ) |
numprocs | 1 | 只跑 1 个实例(别重复拉起) |
killasgroup | true | 停止时杀掉整个进程组(nssh 可能有子进程) |
stopasgroup | true | 同上,停止时清理干净 |
stderr_logfile | 日志路径 | 错误日志,排查问题用 |
stdout_logfile | 日志路径 | 标准输出日志 |
💡
killasgroup和stopasgroup很重要! 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 对比
| 对比项 | Supervisor | crontab @reboot |
|---|---|---|
| 开机自启 | ✅ | ✅ |
| 挂了自动重启 | ✅ | ❌ |
| 日志管理 | ✅ 内置 | ❌ 手动 |
| 多隧道管理 | ✅ 一条命令 | ❌ 每个单独配 |
| 启停控制 | ✅ start/stop | ❌ 需要手动杀进程 |
| 安装成本 | 需要安装 | 系统自带 |
| 资源占用 | ~5MB | 几乎 0 |
💡 我的建议: 如果你只有 1 条隧道且不想装额外软件,用 crontab 就够了。如果有 2 条以上隧道,或者需要方便地启停/查日志,Supervisor 更省心。