上个月在某项目现场搭一套国产化应用环境,统信UOS的系统刚装完,就轮到中间件部署。项目里指定的应用服务器是东方通tongWeb,团队里没人摸过这个组合。第一次启动就卡了两个小时,图形安装器死活弹不出来,后来发现是桌面环境缺少底层图形库。折腾完回头看,整个过程并不复杂,只是网上的资料要么太旧、要么只讲Windows环境,真正针对统信UOS的完整步骤很少。所以我趁记忆还热乎,把这套部署流程和踩坑记录整理出来,给同样需要在统信UOS上装tongWeb的运维同学一个参考。
这篇文章适合三类人:第一次在统信UOS上部署中间件的新手、从Tomcat切到tongWeb的老运维、以及在无图形服务器上做交付的实施同事。我会从安装方式选择、JDK环境准备、启动前配置、应用部署验证和现场典型问题五个方面展开,尽量把“为什么这么做”也讲清楚,而不是只给一串命令。
1. 统信UOS和TongWeb的组合容易在哪几个环节翻车
1.1 统信UOS的发行版差异比你想象中大
统信UOS不是单一版本,它有基于Debian系的专业版/家庭版,也有基于欧拉系的服务器版本,往后还有各类整机厂商定制版。不同底座对安装包管理命令、系统库和内核特性的支持不完全一样,这意味着你在网上搜到的一个命令,没准只适用于某个特定版本。
我这次用的统信UOS是基于Debian系的桌面版,软件包管理是apt。同一条命令放在欧拉版上可能就变成yum或dnf。动手之前的第一件事,不是急着下载tongWeb,而是先确认底包类型:
cat /etc/os-release uname -m/etc/os-release里能看到系统名称和版本信息,uname -m确认架构是x86_64还是aarch64。这两个信息直接决定你后面下载什么JDK、安装哪个TongWeb安装包。很多部署失败的现场问题,其实都能追溯到版本选错了。
1.2 TongWeb的安装包不止一种形态
东方通tongWeb的交付形态并不是固定的。常见的有三种:在线图形安装包、静默安装响应文件包、直接解压可运行的tar包。有些渠道给的是一个带install脚本的目录,有些给的是单个tar.gz,还有一些OEM版本已经把tongWeb打包进了系统镜像。
我接触过最省心的就是解压版tar包,因为它绕过了图形安装器和X11依赖。如果拿到的是图形安装器,在统信UOS桌面版上一般能正常弹窗,但如果是远程SSH环境或精简版桌面,就很容易卡在图形库缺失上。后面我会专门说这个问题。
所以正式开始安装前,一定要先看安装包里的README或release notes,别凭经验直接跑install.sh。经验在中间件部署里是最不值钱的东西,每个版本都有自己的脾气。
1.3 我建议提前确认的三个信息
在动手之前,先花十分钟把这些信息列出来,省得后面反复折腾:
- 系统底包类型和CPU架构,拿到后写进交付文档。
- 当前用户对目标目录是否有写权限,建议所有操作尽量不用root,后面单独建账号。
- JDK版本和安装路径,TongWeb 7.0时代主流是JDK 8,新版可能要求JDK 11或17,务必先确认。
这三点确认完,安装过程就是体力活了。
2. 正式动手前,我建议先花十分钟搞定JDK和目录
2.1 先确认系统里有没有JDK
很多统信UOS系统出厂时不带JDK,或者只带了JRE。检查命令很简单:
java -version javac -version如果提示找不到命令,说明环境里没有可用的JDK。如果只有java没有javac,也要注意,那可能只装了JRE,tongWeb部署工具链需要完整的JDK来编译JSP。
我这次遇到的坑就是:系统里有一个旧版本的OpenJDK,java -version能正常输出,但版本号是11。项目里指定的TongWeb版本还是按7.0来的,用JDK 11启动时老出NoClassDefFoundError,折腾了一圈才发现是版本匹配问题。后来换上JDK 8就一切正常。
2.2 从系统软件源安装OpenJDK 8
在基于Debian系的统信UOS上,装OpenJDK很简单:
sudo apt update sudo apt install openjdk-8-jdk装完之后可以查一下JDK的真实路径,因为启动脚本里要写JAVA_HOME:
ls /usr/lib/jvm/常见路径是/usr/lib/jvm/java-8-openjdk-amd64。如果机器是ARM架构,后面可能是java-8-openjdk-arm64,别想当然复制。
如果你拿到的是欧拉版统信UOS,命令改成:
sudo yum install java-1.8.0-openjdk java-1.8.0-openjdk-develJDK版本选对齐TongWeb兼容列表的那个,不要追新。中间件又不是App,稳定压倒一切。
2.3 解压安装包并规划目录权限
我这次拿到的是tar.gz解压版,直接解压到/opt下:
sudo mkdir -p /opt/tongweb sudo tar -xzf TongWeb-7.0.tar.gz -C /opt/tongweb解压后目录里有bin、lib、config、deploy、logs、domain等常见子目录。建议不要把tongWeb放在用户家目录里,原因很简单:后续要建systemd服务,家目录权限和服务用户不一致很容易出问题。
然后创建一个专门运行中间件的账号,不要用root跑Java进程:
sudo useradd -r -s /bin/bash -d /opt/tongweb tongweb sudo chown -R tongweb:tongweb /opt/tongweb这件事在交付阶段尤其重要。用专用账号跑中间件,一是权限好收敛,二是后续排查时更清楚进程归属,三是避免误操作把配置改到别的用户目录。
3. 三条安装路径:图形安装兜底、静默安装和解压版直跑
3.1 图形安装器弹不出来的兜底方案
如果拿到的包是图形安装器,在统信UOS桌面版上正常双击或运行install.sh就能弹出向导。但如果你是在远程服务器上,没有图形界面,或者桌面环境缺依赖,可能双击没反应,在终端里跑还会报“Unable to open display”。
这种时候最快的兜底办法不是去研究图形库,而是先确认当前有没有DISPLAY变量:
echo $DISPLAY如果为空,说明当前SSH会话没有图形转发。最简单的处理是用ssh -X重新连接,或者直接改用静默安装/解压版。如果非要用图形安装器,也可以临时装一个VNC服务,但代价有点大,交付场景不推荐。
3.2 静默安装的响应文件套路
TongWeb的安装器普遍支持静默模式,一般通过响应文件控制安装参数。不同版本响应文件名可能不同,常见的是类似install.properties的文件,里面会写安装目录、是否创建桌面图标、是否启动服务等选项。
做法是先按模板填好文件,再执行安装器并指定响应文件:
./install.sh -s install.properties注意,具体参数各版本不一样,照抄网上的命令可能适得其反。我自己的习惯是:先跑一遍不带参数的install.sh --help或查看README,确认当前版本支持什么静默参数,再动手填响应文件。
如果响应文件里的配置项看得一头雾水,最简单的方案还是跳过安装器,直接用解压版。毕竟中间件最终跑起来靠的是目录里的jar包和启动脚本,安装器只负责帮你落目录,自己解压也一样。
3.3 解压版直跑的完整过程
解压版流程是三条路径里最干净的,不需要图形库,不依赖安装器交互。解压完成后,编辑启动脚本设置JAVA_HOME。
假设我使用的是bin/tongweb.sh,在里面加上环境变量:
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64 export PATH=$JAVA_HOME/bin:$PATH然后先试着在前台启动,方便直接看日志:
sudo -u tongweb /opt/tongweb/bin/tongweb.sh run如果脚本支持前台模式,运行后终端会刷出一堆日志,显示“TongWeb started successfully”之类才算完成。如果直接后台启动,可以去logs目录看输出。
前台启动能最直观地判断环境问题。如果这一步通过了,后面再切回后台托管就放心了。
4. 别急着启服务,先把端口、内存和开机自启配明白
4.1 端口规划:管理口、HTTP口和HTTPS口各管各的
TongWeb默认会开多个端口,常见的有HTTP的8080、HTTPS的8443、AJP的8009以及管理控制台的9060。具体端口以你装的版本和server.xml为准,但默认值通常就这几个。
在conf/server.xml里可以找到这些端口的配置。部署到现场时,我的建议是:
- 管理端口不要用默认值,改成难猜的高位端口,比如52906这类,减少被扫描的风险。
- HTTP端口按业务要求改,比如80或8080,如果前面有负载均衡,中间件端口可以保持高位。
- 不需要的AJP端口直接注释掉,别让无用的监听面暴露在网络上。
修改端口之后要重启服务才生效。不要以为配置改了就万事大吉,启动时再看一眼日志里实际监听的端口。
4.2 内存参数:别让默认堆内存拖垮业务
TongWeb作为Java中间件,默认堆内存一般比较保守,稍大一点的应用就容易被OOM打崩。启动脚本里可以找到JAVA_OPTS,示例配置:
export JAVA_OPTS="-Xms512m -Xmx2048m -XX:MaxMetaspaceSize=512m -Djava.awt.headless=true"-Xms是初始堆大小,-Xmx是最大堆大小,-XX:MaxMetaspaceSize限制元空间。这里有一个原则:初始堆和最大堆最好设成一样,避免运行中频繁扩容、收缩触发Full GC。如果宿主机内存只有4G,就别拍脑袋设成4G堆,要给操作系统和JVM自身留余量。
另外,在无图形界面的服务器上,一定要加-Djava.awt.headless=true,否则某些需要图像处理的功能可能会误判没有显示器而报错。
4.3 用systemd托管服务,方便开机自启
生产环境不要依赖人工登录后手动启动,用systemd托管是最省心的方案。我一般建一个/etc/systemd/system/tongweb.service:
[Unit] Description=TongWeb Application Server After=network-online.target [Service] Type=simple User=tongweb Group=tongweb Environment=JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64 Environment=LANG=zh_CN.UTF-8 WorkingDirectory=/opt/tongweb ExecStart=/opt/tongweb/bin/tongweb.sh run ExecStop=/opt/tongweb/bin/tongweb.sh stop Restart=on-failure LimitNOFILE=65535 [Install] WantedBy=multi-user.target写好后执行:
sudo systemctl daemon-reload sudo systemctl enable --now tongweb sudo systemctl status tongwebLimitNOFILE=65535这段很关键,中间件面对高并发时,文件描述符不够会直接报“Too many open files”,到时候再改进程级ulimit非常被动。
如果你的TongWeb脚本不支持run参数,就改成你验证过的Java启动命令。核心思路是保持前台驻留,让systemd接管进程生命周期,而不是把后台化任务交给脚本。
5. 部署一个Web应用并完成三重验证
5.1 通过管理控制台发布应用
服务启动后,浏览器访问管理控制台:
http://服务器IP:管理端口/admin登录后找到“应用部署”或“部署新应用”,选择war包,上传并指定发布虚拟主机。控制台会处理应用解压、部署和启动的整个过程。
这里的坑是:管理控制台第一次登录时默认密码通常需要查阅发行说明,很多默认密码是临时字符串。首次登录后应立刻改掉。我在现场见到过因为默认密码没改,后面扫描工具直接登上去的案例,很尴尬也很危险。
控制台部署适合单机调试,如果后面要做批量发布,还是建议走脚本或API,人工点控制台太容易漏。
5.2 更常用的手动发布方式:把war包丢进deploy目录
TongWeb支持把war包放到deploy目录后自动发布。实际操作时,我给项目组常用的发布流程是这样的:
- 把war包改成英文文件名,不要带空格,不要带中文。
- 用专用账号拷贝到
/opt/tongweb/deploy/目录下。 - 观察logs里是否有应用启动成功的记录。
- 确认没问题后再用curl验证。
如果你拿到的是一个已经解压的目录形式应用,也可以直接放到deploy目录下的同名目录里。这种方式最大的好处是简单,缺点是发布状态不直观,万一自动部署组件没开启,应用就不会加载。
5.3 日志、端口和进程三重验证
应用部署完成后,不要急着跟业务方说“好了”,先做三重验证:
第一重是日志验证,看logs/server.log或logs/domain.log里有没有deployed successfully之类记录,同时看有没有异常堆栈。
第二重是端口验证,确认应用对应的监听端口存在:
ss -lnp | grep -E "9060|8080"如果端口都不在,说明应用根本没起来。
第三重是HTTP验证,用curl确认页面真实可访问:
curl -I http://127.0.0.1:8080/你的应用如果只做了端口验证,没做HTTP验证,很可能出现“端口在但页面500”的情况。现场交付时,这三步缺一不可。
6. 现场问题复盘:我已经遇到并解决的四个典型问题
6.1 图形安装器弹不出来:缺X11图形库
第一次卡住就是这个问题。远程到统信UOS的图形桌面,双击install.sh没反应,终端运行提示缺库。看错误信息才知道系统里没装libX11相关依赖。
在基于Debian系的统信UOS上处理命令是:
sudo apt install libx11-6 libxtst6 libxrender1 libxi6 libgtk-3-0装完之后再运行图形安装器就正常了。但这次经历让我更倾向于直接要解压版,省时省力。如果你非要远程用图形安装器,还得保证DISPLAY变量指向正确的X服务,复杂度成倍增加。
6.2 控制台中文乱码:locale和文件编码两边都要查
第二次遇到的是管理控制台页面中文乱码。应用部署后访问页面,部分中文标题、日志信息显示成问号或方块。
一开始我以为是浏览器编码设置问题,折腾半天发现根因是JVM启动时的默认字符集不是UTF-8。统信UOS桌面版通常默认locale是zh_CN.UTF-8,但用systemd托管后,继承了systemd的宽松环境变量,可能丢了locale设置。
解决办法是在systemd unit里显式加上:
Environment=LANG=zh_CN.UTF-8 Environment=LC_ALL=zh_CN.UTF-8同时启动脚本里再加一条JVM参数:
-Dfile.encoding=UTF-8这两步做完,重启服务,中文显示就正常了。记住,凡是涉及Java中间件的中文问题,先怀疑file.encoding,再怀疑数据库连接串,最后才怀疑前端页面。
6.3 部署的war包读不到:自动部署开关和权限一起查
有次部署一个新应用,war包放到了deploy目录,但日志里一点动静都没有。我一开始怀疑脖子疼,“会不会是自动部署没打开”,后来发现war包的所有权是root,而TongWeb运行账号是tongweb,根本没有读权限。
再仔细查了下文档,TongWeb的deploy目录虽然叫deploy,但个别版本默认不会启动自动部署,需要在控制台或配置文件里开启。所以我后来在项目里定的规矩是:手动发布时先看配置文件里的自动部署开关,确认是true再丢包;丢包之前必须确认文件所有权和权限:
ls -l /opt/tongweb/deploy/这类问题看起来很小,但一次就能消耗半天,排查的时候我也提醒自己别只盯着一个方向。
6.4 启动特别慢:多半是主机名解析在拖后腿
最后一个是启动慢的问题。TongWeb在启动阶段会做主机名反向解析,如果DNS不通或监听地址配成了主机名,启动可能卡很久,最后才报超时。
当时检查日志,发现JVM起来后迟迟不进入服务启动环节。后来把hostname和/etc/hosts对齐,把本机IP映射加到hosts里:
echo "192.168.10.20 本机主机名" | sudo tee -a /etc/hosts再配合监听地址直接用IP而不是主机名,重启后启动时间从四分钟降到二十秒。这个优化在生产环境尤其明显,DNS一旦有波动,整个服务可能直接被拖到不可用。
另外,如果现场没有配DNS,又碰到启动慢,可以先在/etc/resolv.conf里看下是否有不可达的DNS条目,临时改成127.0.0.1或者注释掉,也能加速启动。
最后再分享一个我自己实际操作的体会
统信UOS上装TongWeb这件事,技术上并不难,难的是版本匹配和细节验证。JDK版本、系统底包、安装方式、运行账号、字符集、主机名解析,这些环节只要有一个不对,就会让整个服务变得不可预测。
我个人的建议是:所有配置改动都先记到交付文档里,不要只靠脑子记。服务跑起来之后,至少观察半小时日志,确认没有偶发报错再离开现场。中间件部署从来不是“跑起来就结束”,能稳定七天不出问题才算真的交付完成。
下次如果还有新的国产化环境要部署TongWeb,我会先问清楚三件事:系统底包是什么、JDK有没有、安装包是哪种形态。这三个答案,能省掉百分之八十的弯路。