Rocky Linux 手动部署 Hermes Agent 与 Web UI 完整指南

发布时间:2026/9/5 13:37:02
Rocky Linux 手动部署 Hermes Agent 与 Web UI 完整指南 不想用 Docker想在 Rocky Linux 上把开源的 Agent 框架和配套 Web 界面从零手动部署一套网上的教程大多只讲了容器化方案或者直接跳过系统初始化。这篇文章我会从一台最小化安装的 Rocky Linux 9 开始完整走一遍 Hermes Agent 和 Hermes-Web-UI 的部署流程包括系统环境准备、Python 虚拟环境搭建、服务配置、Web 反向代理最后把会话丢失、端口不通这些高频问题一并讲清楚。内容同样适用于 8.x 版本关键差异我会标注出来。1. 整体设计与方案选型1.1 这套组合到底解决什么问题Hermes Agent 可以把它理解成一个负责“接任务、调工具、跑流程”的智能体运行时它本身不直接面向用户而是通过 API 或者消息队列接收指令再调用各类工具或模型来完成具体任务。Hermes-Web-UI 则是它的图形操作台解决“我看不到 Agent 在做什么、不知道会话挂哪了”的问题提供会话管理、对话历史、运行日志的查看入口。两者配合起来的典型用法是你在 Web 界面创建一个会话输入任务描述Hermes-Web-UI 把任务交给 AgentAgent 执行过程中把中间结果和日志写回UI 实时展示。整个过程相当于给“裸奔”的 Agent 套上了一层可交互、可追溯的操作界面。1.2 为什么不用 Docker 而选择手动部署Docker 部署确实快拉两个镜像、起几个容器就能跑但对 Rocky Linux 这类服务器场景手动部署有三个实打实的优势第一资源占用可控。Agent 运行时加 Web UI 常驻内存容器化后基础镜像、日志驱动、网络层都会额外吃掉一部分内存在 2G 内存的小机器上差别很明显。第二排障链路更短。容器部署遇到 Agent 连不上模型 API、UI 会话丢失这类问题排查时常常要进容器、看镜像内日志、检查容器网络链路多了一层。手动部署直接看 systemd 日志和进程状态问题定位快得多。第三与系统集成更自然。手动部署可以很好地接入 systemd 托管、日志轮转、cron 定时清理服务器重启后服务自动拉起走的是标准 Linux 运维姿势。手动部署并没有多复杂核心就是“装依赖 → 建虚拟环境 → 装 Agent → 装 UI → 配服务 → 反向代理”每一步都可以验证出了问题也容易回头查。1.3 网络拓扑与端口规划部署前先规划好各服务的通信关系我这次采用的拓扑如下Nginx 监听 80/443对外提供 Web 访问Hermes-Web-UI 监听 127.0.0.1:3000只接受来自本机 Nginx 的代理请求Hermes Agent 核心服务监听 127.0.0.1:8000供 UI 后端调用Agent 内部连接模型 APIOpenAI 兼容接口以及本地工具服务三个服务全部走本机回环地址只有 Nginx 对外暴露端口。这样的好处是安全组只需要放行 80/443Agent 和 UI 不直接暴露到外网降低被扫描攻击的风险。如果你是在云服务器上部署记得在安全组/防火墙规则里只放行 80HTTP和 443HTTPS3000、8000 这些端口不需要对外开除非你要做远程调试。2. 环境准备与系统初始化2.1 Rocky Linux 系统基础配置无论你是 Rocky Linux 9.x 还是 8.10装完最小化系统后先做三件事更新系统、配好主机名、确认时间同步。# 更新系统包 sudo dnf update -y # 设置主机名按自己的规范来 sudo hostnamectl set-hostname agent-server exec bash # 确认时间同步状态 timedatectl系统更新建议放在第一步后面要装的很多依赖包和 Python 构建工具在较新的源里兼容性更好。时间同步很多人会忽略但 Agent 在记录日志、判断会话有效期时依赖系统时间时间偏差大了会引来奇怪的问题比如 UI 会话莫名其妙过期。接着配置静态 IP这个在服务器上几乎是必须的操作。DHCP 分配的 IP 一旦变化Web 界面、API 回调地址全部要跟着改非常被动。# 查看网卡名称 ip addr show # 通常为 ens3、ens18、eth0 等以实际为准修改网卡配置文件/etc/NetworkManager/system-connections/ens3.nmconnectionNetworkManager 管理方式或者/etc/sysconfig/network-scripts/ifcfg-ens3填入静态 IP、网关和 DNS# 以 nmcli 方式配置更直观 sudo nmcli con mod ens3 ipv4.addresses 192.168.1.100/24 sudo nmcli con mod ens3 ipv4.gateway 192.168.1.1 sudo nmcli con mod ens3 ipv4.dns 223.5.5.5 8.8.8.8 sudo nmcli con mod ens3 ipv4.method manual sudo nmcli con up ens3配置完顺手测试连通性和 DNS 解析ping -c 3 223.5.5.5 ping -c 3 mirrors.aliyun.comDNS 那一步很多人会漏掉装源的时候能用 IP 访问但域名解析不了排查半天发现是/etc/resolv.conf里的 DNS 配置没生效或者是 NetworkManager 接管后覆盖了手工写的配置。2.2 配置 YUM 源与常用工具安装Rocky Linux 默认使用官方源在国内服务器上速度不稳定建议换成阿里云或清华的镜像源。Rocky 9 的仓库配置文件在/etc/yum.repos.d/下替换前先备份。# 备份官方源 sudo mkdir -p /etc/yum.repos.d/backup sudo mv /etc/yum.repos.d/Rocky*.repo /etc/yum.repos.d/backup/ # 获取阿里云源以 Rocky 9 为例 sudo curl -o /etc/yum.repos.d/Rocky-Base.repo https://mirrors.aliyun.com/repo/rocky-9.repo # 清理并重建缓存 sudo dnf clean all sudo dnf makecacheRocky 8 的源地址结构略有不同用https://mirrors.aliyun.com/repo/rocky-8.repo即可也可以直接用sed把mirrorlist.rockylinux.org替换成国内镜像域名原理相同不再展开。接着安装常用工具链包括编译工具、Git、Nginxsudo dnf install -y git curl wget vim sudo dnf install -y gcc gcc-c make openssl-devel sudo dnf install -y nginx sudo dnf install -y python3 python3-pip python3-develpython3-devel是很多 Python 包编译安装时的硬依赖少了它装uvloop、pydantic-core这类带 C 扩展的包会直接报错。所以环境准备阶段宁可一次装全也不要等到报错再折腾。2.3 创建专用运行用户给服务和 Agent 创建独立用户避免直接拿 root 跑服务。这一步对服务器安全至关重要Agent 要执行工具调用一旦被注入恶意指令运行用户权限越大破坏面越大。# 创建普通用户不带登录 shell仅用于跑服务 sudo useradd --create-home --shell /usr/sbin/nologin hermes # 或者如果你需要手动切到该用户调试用 bash sudo useradd --create-home --shell /bin/bash hermes我习惯先创建带 bash 的用户部署调试阶段方便su - hermes切过去手动跑命令调试完毕后再根据需要改成 nologin。后续所有安装操作尽量以这个用户身份执行或者用 root 安装、chown 到该用户保证服务的文件归属正确。3. Hermes Agent 核心组件部署3.1 Hermes Agent 架构与依赖拆解Hermes Agent 是通义实验室开源的智能体框架核心定位是让 Agent 能够自己“拆任务、选工具、执行动作”。它内部按模块划分主要包括核心引擎、工具插件、模型网关和交互通道几个部分核心引擎负责任务解析、规划决策、执行循环相当于 Agent 的“大脑”。工具插件把外部能力搜索、代码执行、API 调用等封装成 Agent 可以调用的工具相当于“手脚”。模型网关统一封装各类大模型 APIOpenAI 兼容协议、阿里百炼等让上层不用关心模型接口差异。交互通道支持 CLI、API、桌面端等方式与 Agent 交互Hermes-Web-UI 走的就是 API 通道。所以它本质上就是“大模型 任务分解 工具调用”的编排器依赖的重点不在系统层面的复杂组件而在于 Python 环境和 API 凭证的连通。3.2 用虚拟环境隔离 Python 运行空间强烈建议在部署 Hermes Agent 时使用独立虚拟环境不要直接往系统 Python 里装包。原因很实际系统 Python 被 dnf 包管理器盯着你往里装一堆 pip 包哪天系统升级或重装某个组件环境就乱了。而且 Agent 依赖的包版本通常比较新系统自带的python3-pip版本较旧直接装很容易失败。# 确认 Python 版本要求 3.9 及以上 python3 --version # 创建虚拟环境目录规划到 /opt/hermes 下 sudo mkdir -p /opt/hermes cd /opt/hermes sudo python3 -m venv venv sudo chown -R hermes:hermes /opt/hermes切换到你创建的 hermens 用户并激活虚拟环境sudo -u hermes bash -c source /opt/hermes/venv/bin/activate python -m pip install --upgrade pip3.3 Agent 安装与模型网关配置Hermes Agent 的安装方式在不同版本之间略有差异核心步骤是 clone 代码或通过 pip 安装。我这里以源码方式为例因为后续要改配置、看示例都比较方便。cd /opt/hermes sudo -u hermes git clone https://github.com/SymbioticLab/Hermes.git # 或使用内部镜像仓库 # sudo -u hermes git clone http://your-git-mirror/Hermes.git cd Hermes sudo -u hermes bash -c source /opt/hermes/venv/bin/activate pip install -e .安装过程中如果报Failed building wheel for xxx基本都是系统缺了对应的编译依赖回到 2.2 把gcc openssl-devel补齐再重试。装完验证一下sudo -u hermes bash -c source /opt/hermes/venv/bin/activate hermes --version接下来是配置模型网关。Agent 本身不包含大模型它需要调用外部模型 API。配置方式通常是通过环境变量或config.yaml文件指定 API Key 和模型端点。以 OpenAI 兼容接口为例在/opt/hermes/Hermes/.env中配置OPENAI_API_KEYsk-xxxxxxx OPENAI_API_BASEhttps://your-model-endpoint.example.com/v1 OPENAI_MODEL_NAMEqwen-max如果对接阿里百炼DashScope这类国内模型服务它同样提供 OpenAI 兼容模式只要把OPENAI_API_BASE指向百炼的兼容地址再把 Key 换成百炼的 SK 即可。关键在于你的模型网关地址必须能被服务器访问到内网环境要用内网的 endpoint公网环境要注意 DNS 解析和出口 IP 白名单。这里有一条经验API Key 这类敏感信息尽量走环境变量或.env文件不要硬编码进业务代码里。配合 systemd 的EnvironmentFile加载既方便维护也能避免密钥被写进日志或版本库。3.4 验证 Agent 是否真正连通配置完成后先跑一次简单的连通性测试确认 Agent 能从模型网关拿到回复。cd /opt/hermes/Hermes sudo -u hermes bash -c source /opt/hermes/venv/bin/activate hermes run --task 你好请简单介绍一下你自己如果返回正常的模型回复说明 Agent 核心链路没问题。常见失败场景有三类一是 API Key 配错或权限不足二是API_BASE地址写错比如少了/v1后缀三是网络不通防火墙、代理导致连接超时。先用curl直接测 API 端口连通性再逐层排查比盲目改配置高效得多。3.5 将 Agent 注册为 systemd 服务手动部署时终端挂着跑显然不现实必须交给 systemd 托管。创建一个 service 文件让 Agent 以守护进程方式常驻运行[Unit] DescriptionHermes Agent Service Afternetwork-online.target Wantsnetwork-online.target [Service] Typesimple Userhermes Grouphermes WorkingDirectory/opt/hermes/Hermes EnvironmentFile/opt/hermes/Hermes/.env ExecStart/opt/hermes/venv/bin/hermes serve --host 127.0.0.1 --port 8000 Restarton-failure RestartSec10 [Install] WantedBymulti-user.target写入/etc/systemd/system/hermes-agent.service然后重载并启动sudo systemctl daemon-reload sudo systemctl enable --now hermes-agent sudo systemctl status hermes-agentRestarton-failure是必须的Agent 进程被 OOM 干死、网络瞬断导致异常退出systemd 都能自动拉起来。生产环境还可以加上LimitNOFILE65535避免高并发时出现 “Too many open files” 的小众问题。4. Hermes-Web-UI 部署与会话持久化4.1 UI 组件结构介绍Hermes-Web-UI 是前后端分离的结构后端是一个 Node.js有时是 Python/FastAPIAPI 服务负责连接 Hermes Agent、管理会话记录前端是浏览器端资源负责渲染对话界面和展示任务状态。部署时重点把握两条线后端服务怎么跑起来、前端资源怎么被访问到。如果是纯静态资源加一个 API 后端那么 Nginx 可以直接托管静态资源再把/api/路径代理到后端服务。如果整个 UI 服务本身就是个 Node.js 或 Python 进程那就直接代理它的端口。4.2 前后端构建与配置以 Node.js 构建的 Hermes-Web-UI 为例先确认 Node.js 运行时。Rocky Linux 默认源里的 Node.js 版本较旧建议通过 NodeSource 或 nvm 安装较新版本。# 安装 Node.js 20.x curl -fsSL https://rpm.nodesource.com/setup_20.x | sudo bash - sudo dnf install -y nodejs node -v npm -v然后拉取 Hermes-Web-UI 源码并构建cd /opt/hermes sudo -u hermes git clone https://github.com/SymbioticLab/hermes-web-ui.git cd hermes-web-ui # 安装依赖 sudo -u hermes npm install # 构建前端资源 sudo -u hermes npm run build构建完成后后端服务的端口取决于项目配置。通常在.env或config.js里指定PORT3000 AGENT_API_URLhttp://127.0.0.1:8000 SESSION_STORElocal如果 UI 后端和 Agent 不在同一台机器AGENT_API_URL要改成 Agent 所在机器的实际地址同时确认中间防火墙放行对应端口。4.3 Nginx 反向代理配置Nginx 反向代理解决两个问题一是把 80/443 端口的请求转发到 UI 服务二是把 WebSocket 连接正确代理到后端。目标域名规划好之后Nginx 配置写法如下server { listen 80; server_name agent.example.com; # 前端资源目录如果是纯静态构建产物 root /opt/hermes/hermes-web-ui/dist; index index.html; location / { try_files $uri $uri/ /index.html; } # API 反向代理 location /api/ { proxy_pass http://127.0.0.1:3000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } # WebSocket 代理会话推送、实时日志用 location /ws/ { proxy_pass http://127.0.0.1:3000; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection upgrade; proxy_read_timeout 3600s; } }WebSocket 代理头里的Connection upgrade是最容易遗漏的漏掉后 UI 页面能打开但会话日志不实时刷新容易误判成 Agent 卡死。配置检查并重载sudo nginx -t sudo systemctl reload nginx4.4 会话持久化配置解决“会话老是丢失”痛点“Hermes-Web-UI 的会话老是丢失”是很多人在实践中踩到的坑。会话丢失通常不是玄学根源无非四大类第一存储方式选了内存型。UI 默认可能在内存里存会话记录服务一重启全部清空。解决办法是把SESSION_STORE切换为文件或数据库SQLite/PostgreSQL。文件存储适合单机数据库存储适合多实例。第二代理超时断开。Nginx 默认proxy_read_timeout是 60s长连接会话没有数据传输时会被 Nginx 掐断前端不知情看起来就是“会话丢失”。把超时调大到 3600s同时在 Nginx 层开启 WebSocket 升级就可以基本规避。第三浏览器存储被清理。如果前端把会话 ID 存在 localStorage用户清浏览器缓存或开启隐私模式旧会话 ID 找不回来UI 自然显示无历史会话。这不算后端丢失但排查时要先分清是前端丢还是后端丢。第四Agent 侧会话过期。Agent 内部对会话有生命周期管理过期后旧 session_id 不可用。检查 Agent 配置里的会话超时参数适当调长。以 SQLite 存储为例配置方式大致为# hermes-web-ui/.env PORT3000 SESSION_STOREsqlite SESSION_DB_PATH/opt/hermes/hermes-web-ui/data/session.db确保data目录存在并有写权限sudo chown -R hermes:hermes /opt/hermes/hermes-web-ui/data配置完成后重启 UI 服务创建几个测试会话再重启服务确认历史会话还在就可以收工。5. 服务编排、开机自启与全链路验证5.1 为 Web-UI 添加 systemd 服务Web-UI 同样交给 systemd 托管service 文件如下[Unit] DescriptionHermes Web UI Service Afternetwork-online.target hermes-agent.service Wantsnetwork-online.target [Service] Typesimple Userhermes Grouphermes WorkingDirectory/opt/hermes/hermes-web-ui EnvironmentFile/opt/hermes/hermes-web-ui/.env ExecStart/usr/bin/node /opt/hermes/hermes-web-ui/server.js Restarton-failure RestartSec10 [Install] WantedBymulti-user.target如果 UI 服务本身是 Python FastAPI 应用ExecStart 改成对应的uvicorn启动命令即可思路一致。执行sudo systemctl daemon-reload sudo systemctl enable --now hermes-web-ui sudo systemctl status hermes-web-ui如果 UI 依赖 Agent 启动完成后再初始化可以用Afterhermes-agent.service保证顺序同时在脚本里做重试连接避免 Agent 启动慢导致 UI 启动失败。5.2 防火墙与 SELinux 注意事项Rocky Linux 默认开启 firewalld 和 SELinux这是新手遇到“明明服务起来了外面就是访问不了”的头号原因。防火墙放行sudo firewall-cmd --permanent --add-servicehttp sudo firewall-cmd --permanent --add-servicehttps sudo firewall-cmd --reloadSELinux 方面如果 Nginx 代理访问本地端口遇到权限拒绝日志里会出现SELinux is preventing nginx from connecting之类的字样关闭强制模式再测试# 临时放行调试用 sudo setenforce 0 # 永久修改生产环境建议按需放行而不是整体关闭 sudo sed -i s/^SELINUXenforcing/SELINUXpermissive/ /etc/selinux/config实际生产环境不建议直接setenforce 0完事。可以用audit2allow生成针对性的 SELinux 策略模块让 Nginx 只获得连接本地高位的权限其余安全策略保持原样。这步对安全要求高的服务器非常重要。5.3 从浏览器到 Agent 的全链路测试全部服务启动后从浏览器访问http://agent.example.com按顺序走一遍全链路验证打开页面正常显示登录/会话界面新建会话输入“今天天气如何”等任务观察 WebSocket 连接是否建立浏览器 F12 → Network → WS看 Agent 日志确认任务被接收、工具被调用、模型有响应刷新页面确认会话历史存在重启 UI 服务再次刷新确认会话仍可恢复任何一个环节失败定位顺序建议浏览器 → Nginx → UI 服务 → Agent 服务 → 模型 API逐层用日志说话不要猜。6. 高频问题与避坑实录6.1 问题排查速查表这里把我实操中遇到频率最高的五类问题整理成一张表遇到问题先对照自查。现象可能原因排查/解决方式页面能打开任务无响应UI 无法连接 Agent API检查AGENT_API_URL、Agent 服务状态和 8000 端口监听会话日志不刷新WebSocket 代理失败检查 NginxConnection upgrade配置nginx -t测试重启后会话全丢存储为内存型切换SESSION_STORE为sqlite确保目录可写Agent 安装包编译报错缺少python3-devel或 gcc安装dnf install gcc gcc-c make openssl-devel python3-devel外部无法访问页面防火墙/SELinux 拦截firewall-cmd放行端口临时setenforce 0排查UI 正常但 Agent 报密钥错误环境变量未加载检查 systemd 的EnvironmentFile路径和.env文件内容443 访问不了云安全组未放行到云控制台安全组添加 443 入方向规则6.2 桌面版安装报错的场景化分析热搜词里有“Hermes Agent 桌面版安装报错”。如果你不是部署服务端而是在自己的工作站上装桌面版客户端报错的坑位通常不同一类是安装包与操作系统版本不匹配比如在较老的发行版上装为新版编译的.deb/.rpm依赖库版本不够。解决方式是从官方 release 页面下载对应发行版版本的文件不要随便下载“最新通用版”。另一类是权限问题桌面版安装时往/opt或/usr/lib写文件普通用户没有权限。这时不要拿sudo chmod 777硬来正确的做法是用包管理器正常安装安装写系统目录的事交给包管理器处理。还有一类是启动即崩通常是显卡驱动、Wayland/X11 兼容性问题排查时可以先用--disable-gpu之类参数临时启动确认是 GPU 相关崩溃后再针对性解决驱动。桌面版和服务器版的部署逻辑差异很大前者强调桌面环境兼容性后者强调守护进程和网络配置。如果你连的是远程无桌面的服务器不要考虑桌面版直接按本文的服务端方案走。6.3 安装流程中的一个冷门坑安装要登录网站搜热词里有一条“Hermes Agent 安装要登录网站怎么回事”。这通常不是你操作有误而是新版安装器开始接入在线账号体系安装时需要登录授权才能拉取插件或模型配置文件。这会在离线环境或内网环境卡住。解决办法是先在有公网访问的机器上完成登录授权和依赖下载把缓存目录整个拷贝到内网或者查看安装器是否支持离线模式环境变量比如HERMES_OFFLINE1部分版本可以直接跳过登录流程用已有账号凭据配置离线使用。即便是源码安装有些版本首次运行时也会自动调用某个远程接口做版本检查请求被墙或代理拦截可能会导致“卡在某个进度条”。抓一下出网请求把对应域名加白或配置代理问题就没了。安装类问题十有八九离不开网络连通性、依赖缺失、权限不足这三板斧按顺序排查不要上来就重装系统。6.4 让 Rocky Linux 也能跑进 Ubuntu 服务器场景热搜词里有一条“用一个升级包让 rocky linux 跑进 ubuntu 服务器”。这其实说的是用户态环境的兼容方案与今天的 Hermes 部署相关但方向不同。你完全没必要在 Ubuntu 上装 Rocky 内核直接在 Ubuntu 上分别安装 Hermes Agent 和 Hermes-Web-UI依赖差异只在系统包管理阶段部署完运行方式完全相同。跨发行版迁移真正要注意的点是 Python 和 Node.js 版本一致性。Rocky 9 自带 Python 3.9Ubuntu 22.04 自带 Python 3.10、Ubuntu 24.04 自带 3.12代码里如果用到了版本敏感的语法可能会出现“我在 Rocky 上跑得好好的迁到 Ubuntu 就报错”。这时候上虚拟环境并固定依赖版本问题即可解决。7. 长期运维配置建议服务能跑起来只是第一步稳定运行一个月才是真正的目标。以下几个运维细节非常值得提前配置。7.1 日志轮转Hermes Agent 和 Web-UI 的日志如果不做轮转几周就能撑爆磁盘。在/etc/logrotate.d/hermes下添加配置/opt/hermes/logs/*.log { daily rotate 14 compress delaycompress missingok notifempty copytruncate }copytruncate比较关键它允许在不重启服务的情况下完成日志分割因为服务进程一直持有文件句柄直接mv再新建同名文件会导致句柄丢失。7.2 定时健康检查用一个简单的 cron 脚本监控两个服务是否存活#!/bin/bash # /opt/hermes/scripts/healthcheck.sh AGENT_PORT8000 UI_PORT3000 curl -fsS http://127.0.0.1:${AGENT_PORT}/health /dev/null || systemctl restart hermes-agent curl -fsS http://127.0.0.1:${UI_PORT}/health /dev/null || systemctl restart hermes-web-ui配合crontab -e*/5 * * * * /bin/bash /opt/hermes/scripts/healthcheck.sh这个探活接口如果服务没实现可以用进程检测代替pgrep -f hermes serve /dev/null || systemctl restart hermes-agent7.3 配置备份Hermes 相关的配置、.env文件和数据目录建议纳入备份范围/opt/hermes/Hermes/.env /opt/hermes/hermes-web-ui/.env /opt/hermes/hermes-web-ui/data/可以用rsync同步到备份机也可以用tar打包后上传对象存储。重点是把.env里的密钥做加密备份明文上传对象存储等于泄露密钥。8. 个人实操体验这套部署流程我在 Rocky Linux 9.2 和 8.10 上都跑过一遍整体感觉就是安装本身不复杂坑大多出在系统初始化和网络环境上。最值得提的一点是部署前一定要把“模型 API 连通性”放在最前面验证。Agent 和 UI 装得再漂亮如果模型网关不通你在界面上点任何按钮都只会得到一堆超时报错很容易误判成 Agent 本身的问题。拿curl先测一下模型接口通过之后再进入 UI 联调整个流程会顺很多。另外关于会话丢失的问题我自己的经历是最开始开 Nginx 默认配置前端页面一会儿不操作就断连再加 WebSocket 升级头和超时调大之后断连问题就再没出现过。所以遇到“会话丢失”别急着改代码先倒一杯水把 Nginx、存储方式、浏览器清理这三件事从头到尾捋一遍大概率能找到根因。这里最后再分享一个小技巧在修改.env或配置文件后重启服务前先做一次语法校验Node 项目用node --checkPython 项目用python -m py_compilesystemd 文件用systemd-analyze verify。这几个命令能帮你拦截八成的手误省下大量排查时间。