ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

统信UOS部署东方通TongWeb:从环境配置到生产落地的完整指南

统信UOS部署东方通TongWeb:从环境配置到生产落地的完整指南 这几年做国产化迁移的朋友应该都有体会“统信UOS 东方通TongWeb”这套组合几乎是在做Java业务系统迁移时绕不开的搭档。一边是国产操作系统的代表之一一边是国内主流的企业级Java中间件两者搭起来就是要在一个“从底层开始国产化”的环境里把原来跑在Windows或者国外Linux发行版上的Java Web应用稳定地接住、跑起来。这篇内容没什么高深理论就是一套可以直接照着操作的落地过程。我会把从环境准备、版本选择、安装部署、应用接入到开机自启、常见问题排查的完整链路拆开来讲。适合正在做信创适配的研发和运维同学也适合第一次接触TongWeb、想快速在UOS上搭一套可用环境的朋友参考。1. 装之前先想清楚环境匹配与版本选择1.1 先搞清楚这套组合的定位统信UOS本质上是基于Debian系的国产Linux发行版分桌面版和服务器版。做服务器中间件部署优先选服务器版因为内核裁剪、服务管理方式、系统资源占用都更贴近生产需求。桌面版不是不能跑但装图形环境、默认桌面服务占用高用起来总觉得别扭。东方通TongWeb则是国产的企业级Java应用服务器中间件类似大家熟悉的Tomcat、WebLogic或者WildFly。它提供Servlet容器、JSP引擎、EJB容器、JMS、数据源、集群、负载均衡这些能力目标就是承载Java EE应用。为什么要用它在国产化项目里很多客户或评测标准明确要求中间件也要自主可控这时候TongWeb就是一个高频选项。这个组合主要解决什么问题简单说把原来部署在Tomcat下的业务系统或者原来用WebLogic跑的传统Java EE应用平滑迁移到一个国产操作系统国产中间件的环境中对外提供稳定的HTTP服务、Java应用运行环境和集中式的管理控制台。1.2 版本匹配是第一步别跳过我见过不少第一次装的人拿到安装包就解压结果启动报错、控制台打不开折腾半天发现是JDK版本和TongWeb版本不匹配。这里先统一概念TongWeb 7.0系列核心适配JDK 1.8Java 8这也是目前大量存量业务系统最常用的JDK版本。TongWeb 8.0系列开始支持JDK 11甚至JDK 17适合新开发的系统或者要上更高版本JDK的项目。在统信UOS服务器版上默认可能已经预装OpenJDK但版本未必合适。建议先确认系统里有没有Java、版本是多少java -version如果没装或者版本不对先装对应版本的JDK。以JDK 8为例sudo apt update sudo apt install -y openjdk-8-jdk架构也要提前确认。统信UOS支持x86_64也支持ARM64兆芯、鲲鹏、飞腾这些平台很常见。不同架构用的安装包不同不能拿x86的包往ARM上装否则大概率直接启动失败。先看架构uname -m再看操作系统版本cat /etc/os-release拿到架构和系统版本之后去东方通官方或项目配套渠道下载对应架构的TongWeb安装包。这一步其实是在选型阶段就要定好的别等到现场再临时试。1.3 安装包和授权文件的准备TongWeb常见形态有两种安装版和免安装版压缩包。安装版一般是个InstallAnywhere或者其他GUI安装器解压后运行install脚本会引导你选择安装路径、JDK路径、端口这些。优点是交互清晰缺点是在服务器上如果没有图形界面还得用X11转发或者静默安装参数多一层麻烦。免安装版更像Tomcat拿到tar.gz压缩包解压就能用。生产环境我更喜欢这种因为可重复性强脚本化部署方便。后面文章都以免安装版为例展开。另外必须提前准备授权文件。TongWeb启动时会校验License通常是license.dat或者license.xml没有授权或者授权不匹配服务能起来但会受限或者直接拒绝启动。授权文件通常和硬件指纹绑定申请前要确认机器的CPU型号、网卡MAC、主机名这些信息发给中间件厂商申请对应授权。拿到授权文件后放到一个固定目录比如/opt/tongweb/license/然后在启动脚本里指定路径。这个细节后面实际配置时会单独讲。2. 解压、配置到首次启动完整走一遍2.1 创建专用用户和目录强烈建议不要用root直接跑TongWeb。倒不是说一定启动不起来而是中间件这类对外提供服务的进程一旦被利用root权限风险极高。另外后续部署应用、写日志、改配置如果用root创建了一堆文件后面切到普通用户管理时权限全是坑。推荐的做法是建一个专用用户sudo useradd -r -s /sbin/nologin tongweb sudo mkdir -p /opt/tongweb sudo chown -R tongweb:tongweb /opt/tongweb-r创建系统用户-s /sbin/nologin表示不分配登录shell这样就算进程被入侵也没法直接shell登录风险小很多。然后把安装包拷贝到/opt/tongweb下解压sudo tar -zxvf TongWeb-7.0.x.tar.gz -C /opt/tongweb解压后目录结构大致如下/opt/tongweb/ ├── bin/ # 启动、停止、版本查询脚本 ├── conf/ # server.xml、web.xml 等核心配置 ├── deploy/ # 应用部署目录 ├── lib/ # TongWeb 运行库 ├── logs/ # 运行日志 ├── common/ # 公共类库目录 ├── work/ # JSP编译等工作目录 └── license/ # 授权文件存放目录不同小版本目录命名会有差异但bin/、conf/、deploy/、logs/这些核心目录基本都在。2.2 配置JAVA_HOME和启动参数免安装版不会帮你设置JAVA_HOME启动脚本要从环境变量里找JAVA_HOME或者JRE_HOME。最简单的方式是编辑bin/setenv.sh这个文件是TongWeb预留的环境变量入口。先确认JDK路径dirname $(dirname $(readlink -f $(which java)))在我这边典型的OpenJDK 8路径是这样的export JAVA_HOME/usr/lib/jvm/java-8-openjdk-amd64 export JRE_HOME$JAVA_HOME/jresetenv.sh里还能放JVM调优参数。生产环境我一般会先给一个保守配置后面压测再调export JAVA_OPTS-Xms2048m -Xmx4096m -XX:MetaspaceSize256m -XX:MaxMetaspaceSize512m -Dfile.encodingUTF-8这里解释一下为什么是这几个参数-Xms表示JVM初始堆大小-Xmx表示最大堆大小两者相等可以避免运行期动态扩张堆带来的性能抖动但前提是机器内存足够。MetaspaceSize是JDK 8之后存放类元数据的区域Spring Boot这类加载类特别多的应用稍不留神就会撑爆所以提前给一个明确的初始值和上限。file.encoding是防止中文乱码的常用手段后面部署有页面表单提交的应用时尤其重要。2.3 配置授权文件路径TongWeb 7.0之后常见做法是读取环境变量LICENSE_HOME来定位授权文件。在setenv.sh里加上export LICENSE_HOME/opt/tongweb/license然后把申请的授权文件放进去确认文件名和路径都正确。如果你启动后控制台提示授权异常八成是这里没配好。2.4 首次启动与控制台访问先确认端口没被占用。默认情况下TongWeb的业务端口是8080控制台端口是9060。改端口后面再说首次启动先用默认值。启动sudo -u tongweb /opt/tongweb/bin/startserver.sh这里用sudo -u切到tongweb用户启动避免root生成日志文件。启动后看日志tail -f /opt/tongweb/logs/tongweb.log看到类似Server startup in xxx ms的日志就说明启动成功了。然后浏览器访问控制台http://服务器IP:9060/console不同版本初始账号密码不一样常见版本默认是admin/123456也有的版本是thanos/thanos123.com。具体以你拿到安装包附带的说明文档为准。首次登录后第一件事就是改密码这个不用我多说了。控制台能打开说明TongWeb已经跑起来了。但这才只是第一步真正关键的是把应用部署上去。3. 把业务应用部署上去数据源、虚拟主机、应用验证3.1 部署方式怎么选TongWeb部署应用的方式有三种控制台热部署、直接丢到deploy目录、通过管理脚本命令行部署。控制台热部署最直观登录9060控制台找到应用管理上传war包再点部署它自己完成解压和上下文路径配置。适合首次部署和临时更新缺点是依赖图形界面而且有些内网生产环境管控严格不允许随意打开9060端口。deploy目录最像Tomcat的webapps直接把war包或解压后的应用目录丢到/opt/tongweb/deploy/下TongWeb启动时自动扫描。适合批量交付和离线部署场景。我大部分生产实施都走这条路。命令行部署适合自动化脚本但不同版本命令语法有差异建议直接依赖官方API文档。对首次接触的人来说建议从deploy目录方式入手最少副作用。3.2 控制台里配置数据源Java Web应用部署到中间件最难处理的往往不是应用本身而是数据源。这里说几个关键点。TongWeb支持在控制台的数据源菜单里创建JDBC数据源需要填写的核心信息是数据源名称应用里jdbc/xxx绑定的名称JDBC驱动类比如com.mysql.cj.jdbc.Driver数据库URLjdbc:mysql://IP:3306/dbname?useUnicodetruecharacterEncodingutf8用户名、密码连接池参数初始连接数、最大连接数、连接超时时间连接池参数值得多说一句。很多业务系统上线后偶发连接超时、连接池耗尽往往就是初始配得太随意。一般建议的最小配置初始连接数: 5 最大连接数: 100 最小空闲连接数: 10 连接最大空闲时间: 300000ms注意最大连接数不是越大越好。每个连接都会占用数据库资源配得太大数据库先扛不住配得太小高峰请求一多应用就会卡在等待连接上。100是一个大多数中小系统够用的起点后续压测后根据QPS和数据库负载再调整。如果项目用的是国产数据库比如人大金仓、达梦、神通驱动类名和URL都不一样操作思路一样但驱动包要提前放到TongWeb的lib/目录下或者通过控制台的驱动管理上传否则数据源测试连接会直接报找不到类。3.3 应用部署后的验证清单应用部署完不是能打开首页就算完。我在生产环境里吃过亏后来总结了一份验证清单静态资源是否正常CSS、JS、图片能加载出来说明静态资源处理和Context路径没问题。动态页面是否正常JSP或者模板引擎渲染的页面重点看是否有模板缓存导致旧文件。登录和会话是否正常登录后刷新会话不丢失说明Session机制正常。接口响应是否正常用curl或者Postman调几个核心接口确认返回码和数据结构正确。数据库读写是否正常找一个真实的表单提交或者查询操作验证数据源和连接池真正可用。日志里有无WARN/ERROR特别是javax.naming、ClassNotFoundException这类中间件相关的报错。这里插一个经验很多应用迁移过来报404或者500最后发现是应用里硬编码了原来Tomcat的路径比如访问/app/index.jsp但部署后Context path变成了/或者/app/。这是应用本身的问题不是TongWeb的问题排查时要会区分。3.4 修改端口和虚拟主机如果机器上不只跑一个TongWeb默认8080端口肯定冲突。端口在conf/server.xml里改类似Tomcat的Connector配置Connector port8080 protocolHTTP/1.1 connectionTimeout20000 redirectPort8443 /把port8080改成你需要的端口比如8081。控制台端口在conf/tongweb.xml或控制台子服务的配置里具体路径和版本相关改之前先备份原文件。虚拟主机这个功能在部署多个域名但共用同一个TongWeb实例时很有用但说实话现在的架构很多已经改成独立端口独立实例部署虚拟主机用得没以前多了。如果确实需要在控制台的虚拟主机管理里新增Host配置一个域名指向一个部署目录就能实现在同一端口下用域名区分不同应用。需要注意设置Host name时一定要加域名匹配规则否则会拦截所有不匹配的请求。4. 生产级使用systemd服务化与开机自启4.1 写一个干净的tongweb.service手动执行startserver.sh启动SSH一断开进程可能还会在但这不是生产环境该有的方式。生产上要能做到开机自启、崩溃重启、统一日志就必须交给systemd管理。在/etc/systemd/system/tongweb.service新建一个服务文件[Unit] DescriptionTongWeb Application Server Afternetwork.target remote-fs.target [Service] Typeforking Usertongweb Grouptongweb EnvironmentJAVA_HOME/usr/lib/jvm/java-8-openjdk-amd64 EnvironmentLICENSE_HOME/opt/tongweb/license ExecStart/opt/tongweb/bin/startserver.sh ExecStop/opt/tongweb/bin/stopserver.sh ExecReload/opt/tongweb/bin/restartserver.sh Restarton-failure RestartSec5 LimitNOFILE65536 TimeoutStartSec120 [Install] WantedBymulti-user.target这里几个字段值得解释Typeforking因为startserver.sh启动进程后会返回真正的服务进程是它fork出来的子进程。如果不指定forkingsystemd会认为服务还没启动完导致状态判断错误。Afternetwork.target确保网络就绪后再启动中间件。否则TongWeb启动时绑定端口和主机名解析可能会失败。Restarton-failure进程崩溃时自动拉起这是守护进程的核心价值。LimitNOFILE65536提高文件描述符上限。Java Web应用尤其是连接数上来后默认1024的文件描述符很容易耗尽这个参数一定要加。写好后执行sudo systemctl daemon-reload sudo systemctl enable tongweb sudo systemctl start tongweb查看状态sudo systemctl status tongweb4.2 服务化部署的几个小细节第一ExecStop一定要用stopserver.sh而不是kill。TongWeb在停止时要执行优雅关闭流程停止接收新请求、等待处理中的请求完成、释放数据库连接池、清理临时文件。直接kill -9会导致数据源连接异常释放尤其是在有分布式事务的场景下很容易留下悬挂事务。第二权限保持一致。前面我们用tongweb用户启动那么war包部署、日志目录、临时目录的属主都必须是tongweb。否则应用部署后无法写入日志、无法生成临时文件会出现各种诡异问题。第三如果服务器上还跑了防火墙记得放行所需端口。统信UOS自带的是ufw还是firewalld取决于具体版本。以ufw为例sudo ufw allow 8080/tcp sudo ufw allow 9060/tcp端口不通的问题90%是防火墙不是服务本身的问题。5. 常见问题与排查技巧实录5.1 问题速查表把我在实际部署中踩过、以及群里朋友遇到过的典型问题整理成一个速查表按照现象、原因、处理方式排列。现象原因处理方式启动脚本提示找不到JavaJAVA_HOME未设置或指向错误在setenv.sh里显式设置JDK路径控制台无法访问9060端口未放行或未监听检查ss -lntp确认端口放行防火墙启动后自动退出授权文件缺失或与硬件不匹配确认LICENSE_HOME路径和license文件有效性应用部署后访问404Context path不对或deploy目录权限错误检查部署路径和应用的上下文配置测试数据源连接失败数据库驱动jar不在lib目录下上传驱动jar到lib目录并重启上传war包后更新不及时浏览器或应用缓存清缓存或用新war文件名部署后切上下文启动报端口被占用8080/8090被其他进程占用lsof -i:8080找到占用进程调整端口中文乱码应用编码与JVM编码不一致设置-Dfile.encodingUTF-8同时检查页面和数据库字符集系统重启后TongWeb没起来未配置systemd服务或enable失败按第4节创建服务并systemctl enableJDBC连接池耗尽报连接超时连接池上限过小或连接泄漏调大maxPoolSize排查应用未归还连接问题5.2 几个特别容易踩的坑再单独写几个容易被忽略的坑这些是常规文档里通常不会提到的。第一个坑直接用root启动后再用普通用户接管。TongWeb启动过程中会在work/、logs/等目录生成大量文件root创建的文件普通用户没权限改。后面应用要热部署控制台写不了文件各种报错都来了。最笨但最有效的办法是部署前就确定好专用用户所有目录、文件一次chown到位。第二个坑忽略common/lib和lib目录的区别。TongWeb的类加载机制决定了它分公用类库和实例类库。放在common/lib下的jar会被所有应用共享放在lib下的jar是中间件本身的依赖。如果你把应用的驱动或者公共依赖放错位置可能导致类冲突或者一个应用升级依赖后把另一个应用带崩。通常应用自己的jar不放到这两个目录里而是放进应用的WEB-INF/lib或者在控制台的应用级类库配置里单独指定。第三个坑JDK版本对但发行版不兼容。OpenJDK有多个实现统信UOS软件源里默认的OpenJDK未必和TongWeb官方测试过的完全一致。遇到启动报UnsupportedClassVersionError或者诡异崩溃可以下载一个在TongWeb上验证过的JDK版本手动安装不要局限于系统的apt源。第四个坑license绑定机器指纹。在虚拟机模板上申请了license然后克隆出多台机器结果license全部失效。因为license绑定的是网卡MAC和机器标识克隆出来的机器指纹已经变了。正确的做法是每台机器单独申请或者部署前改好主机标识后再申请别图省事。第五个坑数据源连接池里的validationQuery一定要配。TongWeb做连接池健康检查时如果数据库因为网络抖动断开了空闲连接连接池还拿着旧的坏连接不放应用去取连接时就会报连接已被关闭。配上一个轻量查询语句比如MySQL的SELECT 1中间件会定时验证连接是否可用不可用就剔除并重建。这个参数虽然小但在生产环境里能避免一大类偶发性报错。5.3 日志排查的正确姿势TongWeb日志体系比较清晰主要看这几种logs/tongweb.log主日志启动过程、部署过程、运行时错误都在这。排查问题先看这个。logs/access.log访问日志记录每一次HTTP请求的状态码和耗时。排查接口变慢、高延迟时很有用。logs/console.log控制台的操作审计日志。操作失误时查这个能还原谁改了配置。应用自身日志这在应用的WEB-INF/logs或者logs/app/下如果中间件日志没有报错但业务报错优先看应用日志。排查时我习惯先确认三个时间点启动时间、应用部署时间、第一个报错时间。把这三个时间点对齐就能快速把问题缩小到启动阶段、部署阶段还是运行阶段。6. 写在最后的几点体会按这套流程走下来统信UOS上装一个能稳定跑业务的TongWeb其实不复杂真正决定部署是否顺利的往往是前期那些不起眼的细节JDK版本选没选对、授权文件放没放对位置、端口有没有提前确认、日志有没有规划好目录权限。我自己的体会是中间件安装这个动作本身占整个实施工作量的比例很小大量时间其实花在环境梳理和应用适配上面。所以建议第一次做这个组合的团队先在测试环境完整跑一遍“操作系统、JDK、TongWeb、应用、数据源”的链路把端口、目录、用户、日志都规范化再往生产环境复制。这个过程走顺了后面批量交付就是复制粘贴的问题踩坑成本会低很多。如果后续要在这个环境上做性能压测、集群部署、容器化封装前面这些基础配置做得干净与否直接影响后面方案能不能走得通。先把最基础的这条路走顺比什么都管用。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进