日常问题:演示环境慢 / 卡 / 宕机(公网带宽打满 + 130/140 VMware 双机 crash)
生成日期:2026-08-12
场景:ruoyioffice.com演示站(公网182.92.106.252+ frp → 内网 130 后端 / 140 Jenkins)
关联技能:.cursor/skills/remote-env-troubleshoot/
对外 FAQ:kb/deployment/演示站很慢或不可用-分层排查.md
现象(可叠加)
- 慢:打开
https://ruoyioffice.com/web极慢、白屏转圈;文档站/也慢;小接口偶发还能通。 - 半挂:静态页 200,但
/admin-api404/连不上;公网:48080无监听。 - 全挂:
13022/14022SSH 也进不去;frpc 在公网frps日志里显示断开。
客户常误判为「后端挂了」。多数时候要先分清:公网带宽 / frp / 内网 guest / VMware 宿主机。
架构速记
text
浏览器
↓ HTTPS :443
公网 ECS 182.92.106.252(nginx 静态 + frps)
├─ /web /doc /app … → 本机静态(占公网上行)
└─ /admin-api → 本机 :48080(frp)→ 内网 130:48080(yudao-server)
内网 140 → Jenkins(frp :14022)两台内网机均为 VMware 虚拟机,历史上多次同秒/同时段重启。
一、站点极慢:主因是公网出口带宽打满(2026-08-12)
结论
主因是公网机上行顶满(约 4.5–5 Mbps),不是 130 应用卡顿。
静态大包与 API 共用同一条窄公网;/web 多 MB 图标 JS 一抢就爆。
分层实测(排除法)
| 层级 | 命令/观察 | 正常参考 | 当天结论 |
|---|---|---|---|
| 130 本机 API | curl -w '%{time_total}\n' http://127.0.0.1:48080/admin-api/... | 数 ms~十几 ms | 2–15ms,排除应用卡 |
| 130 健康 | 容器内 /actuator/health | UP | UP,CPU 空闲 |
| 公网 frp 小接口 | curl 公网 :48080 或经 HTTPS /admin-api 小包 | 150–300ms | 可接受,排除「穿透本身特别慢」 |
| HTTPS 大静态 | /web/js/material-symbols-*.js(~8MB)、mdi(~3MB) | 应秒级 | KB/s 级,卡在公网上行 |
公网 eth0 | 连续采样 TX | 远低于规格上限 | TX 持续 ~4.5–5.0 Mbps |
加剧因素
- 公网机规格弱:
ecs.e-c1m1.large(约 2C/2G),内存常告急。 /web图标相关单文件多 MB,首屏连续下载十几 MB。- SSH 扫描打
13022:当天 17 点时段frps中ssh130连接暴增(常见扫描源 IP 见下文),占用连接与带宽,加重「整站卡死」体感。
排查命令清单(公网机)
bash
# 5 秒带宽采样
RX1=$(awk '/eth0:/ {print $2}' /proc/net/dev); TX1=$(awk '/eth0:/ {print $10}' /proc/net/dev)
sleep 5
RX2=$(awk '/eth0:/ {print $2}' /proc/net/dev); TX2=$(awk '/eth0:/ {print $10}' /proc/net/dev)
awk -v rx=$((RX2-RX1)) -v tx=$((TX2-TX1)) 'BEGIN{printf "RX=%.2fMbps TX=%.2fMbps\n", rx/5/125000, tx/5/125000}'
# frp SSH 隧道扫描量
grep 'ssh130' /var/log/frps.log | tail -n 500 | wc -l
grep 'ssh130' /var/log/frps.log | tail -n 200 | awk '{print $NF}' | tr -d '[]' | awk -F: '{print $1}' | sort | uniq -c | sort -nr | head
# 大静态本机 vs 公网对比
curl -o /dev/null -w 'local total=%{time_total} speed=%{speed_download}\n' http://127.0.0.1/web/js/…大文件…
# 再从外网同 URL 对比;本机快、外网慢 → 公网带宽缓解方向
| 优先级 | 动作 |
|---|---|
| 高 | 调高公网 ECS 带宽 / 升配 |
| 高 | 继续用防火墙 + fail2ban + ip-guard 压扫描(见第三节) |
| 中 | 前端拆包/按需图标,减小首屏体积 |
| 低 | 静态资源 CDN/OSS(演示站可选) |
二、API 突然 404 / frpc 断开 / 130·140「宕机」
当天时间线(CST)
| 时间 | 现象 |
|---|---|
| ~17:20–17:25 | 130 仍有 syslog(含运维 SSH);公网 13022 扫描高峰 |
| 17:29 / 17:30 | 公网 frps:140、130 的 frpc 先后断开;:48080 消失 |
| 17:25 → 18:55 | 130 /var/log/messages 断档约 1.5h(无 OOM/panic/shutdown) |
| 18:55 | 130 与 140 同一秒 reboot;last -x 记为 crash(非 shutdown) |
| 之后 | frpc 恢复;130 上 Docker/yudao 需等容器起来,短暂可能 connection refused |
结论(guest 侧能坐实的部分)
- 不是「yudao 单进程把自己弄挂」的典型形态(双机同秒、无 OOM 痕迹)。
- 更像同一 VMware 宿主机/共享存储/电源,或 vSphere 上对两台做 Reset/硬重启。
- 17:29 起外网不可达,可能是 guest 冻住,直到 18:55 才被强制拉起(与
crash、日志断档一致)。 - SSH 扫描会加重外网侧症状,但解释不了两台 VM 齐 crash + 多年同步重启。
历史同步重启(旁证:同 ESXi / 同维护窗口)
不完全列举(last -x reboot,130≈140):
- 2026-04-25 19:09
- 2026-05-23 ~17:36
- 2026-06-10 19:26
- 2026-06-13 ~22:57
- 2026-07-15 ~22:30
- 2026-07-20 21:48
- 2026-08-12 18:55
guest 侧取证命令
bash
# 虚拟化
systemd-detect-virt; cat /sys/class/dmi/id/sys_vendor product_name
# 是否非正常关机
last -x | head -30 # 关注 crash vs shutdown,以及两台 reboot 是否同秒
# 宕机前最后一行(重启后看 messages)
# 若「某时刻后空白,直到新 boot」→ 冻住/掉电/硬重置,而非优雅关机
grep -E '^Aug 12' /var/log/messages | tail -50
# 当前 journal 是否只有本次启动(旧 crash 日志常丢)
journalctl --list-boots要坐实根因:必须看 ESXi / vSphere(guest 往往没有)
在 17:25–18:55 窗口查:
- 宿主机事件、HA、存储超时、UPS/电源
- 是否有人 Reset / Power Off 两台 VM
- 共享 datastore 告警
恢复检查顺序
- 公网:
frps进程、:48080/:13022/:14022监听 - 130:
docker ps、本机48080、/actuator/health - 140:Jenkins 进程/容器
- 外网:
https://ruoyioffice.com/admin-api/...(401 常表示反代已通)
三、当天已落地的安全加固(公网 252)
细节以机器上
/root/SECURITY-HARDENING-20260812.md为准;备份在/root/firewall-backup-*。
防火墙 / 安全组
- 保留公网:
22、80、443、7700(frp)、以及运维需要的33061、13022、14022。 - 可关:公网直暴
48080(站点走443 → nginx → 本机 48080即可)。 - 对活跃扫描 IP 做 DROP(当天观察源含
172.104.140.149、2.57.122.89、185.242.3.110等,以当时日志为准)。 - nginx
/admin-api反代改为走本机回环侧(如172.17.0.1:48080),避免多余公网绕一圈。
ip-guard(频率减半策略)
| 项 | 位置/规则 |
|---|---|
| 脚本 | /usr/local/ip-guard/ip-guard.py + config.env + whitelist.txt |
| HTTP/天 | >1000 → 临时封禁 |
SSH 隧道/天(13022 等) | >150 → 临时封禁 |
| 连续 3 天触发 | 永久封禁 |
| 临时解封 | 每日 00:05 |
| cron | 每 10 分钟 scan;00:05 daily |
| 状态/日志 | /var/lib/ip-guard/、/var/log/ip-guard.log |
fail2ban
sshd+frps-ssh:约 75 次 / 10 分钟 → 封 24h(以当时 jail 配置为准)。
四、下次类似问题:5 分钟决策树
text
1) 打开 /web 大静态是否极慢,而 130 本机 API 仍很快?
→ 公网带宽 / 扫描 / 静态体积(第一节)
2) 静态正常,仅 /admin-api 挂,frps 无 130 客户端?
→ frpc/130 进程或网络;先 SSH 13022
3) 13022 与 14022 同时不通,且 last 显示双机同秒 crash?
→ 优先查 VMware 宿主机,不要只重启 yudao(第二节)
4) 只有扫描 IP 狂连 13022?
→ 查 ip-guard / fail2ban / 安全组计数,勿误判为业务流量误判对照
| 误判 | 实际 |
|---|---|
| 「后端很慢」 | 130 本机 API 仍 ms 级,慢在公网上行 |
| 「frp 坏了」 | 小包仍 200ms,大文件挤爆带宽 |
| 「Java OOM」 | 无 OOM 记录 + 双机同秒 → 共享层 |
| 「只重启 Docker」 | guest 已冻/已 crash 时无效,需宿主机或硬重启 |
五、改进建议(中长期)
- 公网升带宽/升配,与静态大站匹配。
- ESXi 告警/UPS 巡检;双机同步重启要建事件台账。
- guest:
journald持久化、关键日志落盘,避免 crash 后无前因。 13022/14022:能 VPN/IP 白名单更佳;短期靠 fail2ban + ip-guard。- 排障入口继续用
remote-env-troubleshoot技能,避免连错机、用错密码。
附录:公网机磁盘/内存打满与 XXL-JOB(2026-08-12 晚)
| 项 | 结论 |
|---|---|
| 云盘 99% | 主因 xxl-job-admin Docker json.log ~23G(无 max-size);次因 nginx access ~3.9G |
| 内存 ~92% | 本机 mysql57 ~827MB + xxl-job-admin Java ~187MB,塞在 2G ECS |
| XXL 对外 | firewalld 已对 :9090 reject;Admin 日志持续 Access denied for root@182.92.106.252,调度实际已废 |
| 演示站依赖 | 130 yudao-server 近期日志无 xxl 注册;站点不依赖公网 XXL |
| 已做 | docker update --restart=no + stop xxl-job-admin;truncate 23G json.log;归档/压缩 nginx 与 xxl 文件日志;/etc/docker/daemon.json 加 max-size=50m/max-file=3(未重启 dockerd,仅影响之后新建容器) |
| 保留 | mysql57(:33061)未停——库内有多套历史库/ruoyi-office 等 |
| 效果 | 磁盘约 99%→26%(腾出 ~28G);内存 available 约 134M→341M |
| 备注 | 重启说明:/root/XXL-JOB-STOPPED-*.md;若再启应绑 127.0.0.1:9090 并先修好 DB 账号 |
修订记录
| 日期 | 修改 |
|---|---|
| 2026-08-12 | 初稿:慢站分层实测 + 双机 crash 时间线 + 安全加固摘要 |
| 2026-08-12 | 附录:XXL 日志撑盘、临时停用与 daemon 日志上限 |
