1. 项目背景与需求解析
在Linux系统管理领域,基于Web的终端访问工具正逐渐成为运维人员的刚需。Wetty(Web + tty)作为一款开源的Web终端解决方案,允许用户通过浏览器直接访问服务器命令行界面,特别适合需要远程维护多台服务器的场景。本次我们在Rocky Linux 9上部署Wetty,主要解决以下痛点:
- 跨平台访问:运维人员无需安装额外SSH客户端,使用任意设备浏览器即可连接服务器
- 权限隔离:通过配置不同用户权限,实现团队协作时的安全隔离
- 审计追溯:所有操作记录可通过日志完整留存,符合企业合规要求
提示:Rocky Linux 9作为RHEL的替代发行版,其稳定性和安全性已得到企业级验证,但官方仓库未包含Wetty软件包,需要手动编译部署。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 环境准备与依赖安装
2.1 基础环境配置
首先确保系统为最新状态:
bash复制sudo dnf update -y && sudo dnf upgrade -y
安装必要的开发工具链:
bash复制sudo dnf groupinstall "Development Tools" -y
sudo dnf install epel-release -y
2.2 Node.js环境部署
Wetty基于Node.js开发,需要安装LTS版本:
bash复制curl -fsSL https://rpm.nodesource.com/setup_lts.x | sudo bash -
sudo dnf install nodejs -y
验证安装:
bash复制node -v # 应显示v18.x或更高
npm -v # 应显示9.x或更高
2.3 其他依赖项处理
安装libvips等图形库依赖:
bash复制sudo dnf install libvips libvips-devel -y
配置防火墙(如需外网访问):
bash复制sudo firewall-cmd --permanent --add-port=3000/tcp
sudo firewall-cmd --reload
3. Wetty部署与配置
3.1 源码获取与安装
创建专用运行用户(安全最佳实践):
bash复制sudo useradd -m -s /bin/bash wettyuser
sudo passwd wettyuser
切换用户并安装:
bash复制sudo -i -u wettyuser
git clone https://github.com/butlerx/wetty.git
cd wetty
npm install
3.2 关键配置调整
编辑config.json:
json复制{
"host": "0.0.0.0",
"port": 3000,
"ssh": {
"user": "wettyuser",
"host": "localhost",
"auth": "password",
"port": 22
},
"ssl": null
}
注意:生产环境务必配置SSL证书,可通过Let's Encrypt获取免费证书
3.3 服务化部署
创建systemd服务文件/etc/systemd/system/wetty.service:
ini复制[Unit]
Description=Wetty Web Terminal
After=network.target
[Service]
User=wettyuser
WorkingDirectory=/home/wettyuser/wetty
ExecStart=/usr/bin/node /home/wettyuser/wetty/app.js -p 3000
Restart=always
[Install]
WantedBy=multi-user.target
启动服务:
bash复制sudo systemctl daemon-reload
sudo systemctl enable --now wetty
4. 安全加固与优化
4.1 基础安全措施
- SSH密钥认证(推荐):
bash复制# 客户端生成密钥对
ssh-keygen -t ed25519
# 服务器端配置
mkdir -p ~/.ssh
chmod 700 ~/.ssh
vim ~/.ssh/authorized_keys # 粘贴公钥
chmod 600 ~/.ssh/authorized_keys
- Fail2Ban防护:
bash复制sudo dnf install fail2ban -y
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
4.2 性能调优参数
调整Node.js内存限制(在服务文件中):
ini复制Environment=NODE_OPTIONS=--max-old-space-size=2048
启用进程守护(防止崩溃):
bash复制sudo npm install pm2 -g
pm2 start app.js --name wetty
pm2 save
pm2 startup
5. 常见问题排查指南
5.1 连接故障排查表
| 现象 | 可能原因 | 解决方案 |
|---|---|---|
| 502 Bad Gateway | Node服务未运行 | systemctl status wetty检查服务状态 |
| 空白页面 | 端口冲突 | `netstat -tulnp |
| 认证失败 | SSH配置错误 | 检查/etc/ssh/sshd_config中PasswordAuthentication设置 |
| 页面卡顿 | 内存不足 | 增加Node内存限制或升级服务器配置 |
5.2 日志分析技巧
查看实时日志:
bash复制journalctl -u wetty -f
关键日志线索:
ECONNREFUSED:SSH服务未运行EACCES:权限配置错误ENOENT:路径不存在错误
6. 高级功能扩展
6.1 多用户隔离方案
通过Nginx反向代理实现:
nginx复制server {
listen 443 ssl;
server_name user1.example.com;
location / {
proxy_pass http://localhost:3001;
}
}
server {
listen 443 ssl;
server_name user2.example.com;
location / {
proxy_pass http://localhost:3002;
}
}
6.2 终端会话记录
启用操作审计:
bash复制sudo npm install wetty-logger --save
在配置中添加:
json复制"logger": {
"enabled": true,
"path": "/var/log/wetty"
}
定期日志轮转:
bash复制sudo logrotate -f /etc/logrotate.d/wetty
我在实际部署中发现,当终端长时间空闲时可能出现连接断开,这可以通过修改SSH客户端配置解决:
bash复制vim ~/.ssh/config
添加:
Host *
ServerAliveInterval 60
ServerAliveCountMax 5
