提到国产中间件,东方通TongWeb绝对是Java开发者和运维同学绕不开的一套东西。头一回在一台Linux服务器上捣鼓它的人,十有八九会卡在启动脚本怎么执行、管理台从哪里登录、应用到底怎么部署这三件事上。这篇文章把TongWeb的安装及使用完整走一遍,从下载安装包、检查JDK环境,到启动服务、登录管理界面,再到部署war包和静态HTML项目,全部按实操顺序写清楚,适合第一次在国产化环境里部署应用的开发、测试和运维同学参考。
我实机操作使用的版本是TongWeb 7.0.x,安装环境是CentOS 7.9、JDK 1.8。后面写到的所有命令、路径和界面描述都按这套环境来,7.0以上的版本界面差异不大,6.0会有区别但整体思路一致。既然叫“图文详细版”,凡是界面会显示什么地方、日志里出现什么关键字,我都会标出来,你照着做基本就能跑起来。
1. 内容整体设计与思路拆解
1.1 TongWeb在技术栈里到底是什么定位
第一次听到TongWeb这个词的人,容易把它和Tomcat混为一谈。它俩确实长得很像,因为都是Java应用服务器,都能跑Servlet和JSP,但TongWeb是国内老牌中间件厂商东方通推出的企业级Java EE应用服务器,不是单纯的开源Servlet容器。它可以承载Servlet、JSP、EJB、JMS、WebService等完整的企业级应用规范,在政务、金融、能源、电信这些对软件来源和可控性要求都比较高的行业里,使用非常普遍。
换句话说,Tomcat能干的活TongWeb能干,Tomcat不擅长的企业级能力,比如统一管理控制台、数据源管理、集群会话复制、高可用部署,TongWeb基本开箱即用。它解决的核心问题很实在:你需要在指定的、合规的、可维护的Java中间件环境里,把业务系统稳定跑起来。很多内网系统招标文件里直接点名要TongWeb,所以项目交付同学不会装这套东西,会非常被动。
1.2 为什么放着Tomcat不用非要换成TongWeb
现实里很多开发同学心里其实有个疑问:我本地一直用Tomcat调得好好的,为什么项目交付的时候非要装一套TongWeb?这里面的原因不复杂。一是很多客户的招标技术要求和采购清单里明确写了必须使用国产中间件,Tomcat虽然开源免费,但在某些项目里不算数;二是TongWeb作为商业产品,有厂商提供技术支持、安全补丁和合规文档,出了问题可以提工单,这在政企项目里是硬需求。
从技术对比上看,TongWeb相比Tomcat有几个明显的差异点,我直接用表格列出来。
| 对比项 | Tomcat | 东方通TongWeb |
|---|---|---|
| 产品定位 | 开源的Servlet容器 | 企业级Java EE应用服务器 |
| 规范支持 | Servlet/JSP为主 | Servlet/JSP/EJB/JMS/WebService等 |
| 管理平台 | 无统一图形管理界面 | 自带Web控制台,可管理应用、数据源、线程池 |
| 技术支持 | 社区为主 | 商业支持、安全通告、合规文档 |
| 典型场景 | 互联网应用、开发调试 | 政务、金融、能源等内网业务系统 |
选择哪个不取决于谁的社区活跃度高,取决于项目的正式要求和甲方的技术认可范围。做交付的同学就别纠结“谁更先进”了,甲方的采购清单就是最高优先级。而作为运维或者开发,能做的就是把这套中间件的安装部署、配置调优、问题排查都吃透,这样无论什么环境都能接得住。
1.3 安装方案的整体规划与版本选择
操作之前先把版本理清楚。TongWeb有几个主要形态,标准版、企业版和嵌入式版本。标准版就是我们常说的独立安装包,安装后自己管理启动停止;企业版一般在标准版基础上增加了集群管理、集中管控等能力;嵌入式版本是给开发进程内嵌用的,适合深度定制。普通项目交付最常用的是标准版,这篇博文也以标准版为例展开。
安装方式有两类:图形化安装包和解压即用型安装包。图形化安装包适合第一次装、想一步步看到过程的场景,安装界面友好,但需要一个能显示图形界面的环境;解压即用型适合纯命令行服务器,生产环境基本都是这种。我后面会把两种方式都讲到,你可以根据自己的环境选。版本选择上,建议先看自己的JDK版本,TongWeb 7.0对JDK8支持最好,JDK11和JDK17也能跑但需要确认对应版本支持;如果是老系统还在用JDK1.7,那可能得找TongWeb 6或者更早的版本来匹配。安装前别急着动手,先和现有团队确认机器上有没有其他应用占用端口,这个信息比版本本身更能决定你后面顺利不顺利。
2. 安装环境准备与安装包选型
2.1 三分钟检查环境:JDK和系统架构别搞错
正式开始之前先做三件事:确认系统类型、确认JDK版本、预留磁盘和端口。用命令检查最快。
cat /etc/redhat-release java -version uname -m第一行看操作系统版本,第二行看JDK版本,第三行看CPU架构。这里注意一个细节:64位系统要装64位的TongWeb安装包,32位JDK和64位安装包混搭会在启动时报奇怪错误,排查半天都找不到原因。如果你手头只有32位JDK,那安装包也要找32位版本,平台信息在安装包命名上会体现。
如果机器上没有JDK,需要先装JDK1.8。离线环境建议提前下载jdk-8uXXX-linux-x64.tar.gz,解压到/usr/local/jdk1.8,然后配置环境变量。
tar -zxvf jdk-8uXXX-linux-x64.tar.gz -C /usr/local/ cat >> /etc/profile <<'EOF' export JAVA_HOME=/usr/local/jdk1.8 export PATH=$JAVA_HOME/bin:$PATH export CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib EOF source /etc/profile java -version装完以后重启会话或者source /etc/profile,一定要回到java -version能正常打出1.8的版本号再继续。TongWeb启动脚本会读取JAVA_HOME,这个变量不配好,后边每一步都别扭。遇到过不少同学前面的步骤都对了,唯独忘了配JAVA_HOME,启动脚本直接报“Unable to locate a Java Runtime”,一分钟能解决的问题卡了半小时。
2.2 安装包从哪里下载,目录结构长什么样
TongWeb属于商业软件,正规获取渠道一般是东方通官网申请试用版,或者联系销售获取正式版本。试用版一般有时间限制,正式授权会提供一个license文件,后面讲到授权的时候再细说。下载的时候注意安装包命名里的平台信息,比如Install_TW7.0.0.0_64_Linux.bin是Linux 64位版本,Windows版本一般是.exe结尾,千万别下错。
拿到安装包后先别急着执行,先把安装目录结构心知肚明。以解压后的TongWeb 7.0常规目录为例,主要目录如下。
| 目录/文件 | 作用 |
|---|---|
| bin | 启动停止脚本和运行时脚本所在目录 |
| conf | 核心配置文件,server.xml是端口和虚拟主机的关键配置 |
| deploy | 应用部署目录,war包或解压后的应用扔这里 |
| lib | 运行时依赖jar包,数据库驱动一般放这里 |
| license | 授权文件目录,试用和正式授权都放在这里 |
| logs | 运行日志,排查问题的第一现场 |
为什么要花时间看目录结构?因为后面90%的故障排查都在logs里找答案,90%的应用部署都和deploy有关,90%的端口修改都要改conf/server.xml。目录不熟,出了问题就是无头苍蝇,在服务器上输ls都不知道该看哪个文件夹。
2.3 图形化安装与命令行安装的实操记录
如果你拿到的是图形化安装包,Linux上有图形界面或通过Xmanager这类工具转发界面的情况下,直接执行:
chmod +x Install_TW7.0.0.0_64_Linux.bin ./Install_TW7.0.0.0_64_Linux.bin安装界面会依次询问安装路径、选择JDK目录、确认安装组件。安装路径一般建议/opt/tongweb,JDK目录选择刚才配置的/usr/local/jdk1.8,走完进度条后会看到完成页面,安装目录底下会出现上面列的那些文件夹。
纯命令行的服务器用图形安装包会报无法显示界面的错误,这时候有两个选择:一是看这个安装包是否支持静默安装,二是直接用解压版。解压版更简单,把tar包解压到目标目录即可:
mkdir -p /opt/tongweb tar -zxvf TongWeb7.0.tar.gz -C /opt/tongweb ls /opt/tongweb bin conf deploy lib license logs这里有个经验:生产服务器上我通常优先用解压版,原因很朴素——可以随时复制整个目录做多实例,也能通过tar包快速回滚,图形安装包反而会在系统里留一些多余的东西。不过第一次学习建议用图形安装包走一遍,能看到安装过程,对整体结构印象更深。
3. 服务启动、管理平台登录与基础配置实操
3.1 启动和停止:TongWeb到底怎么跑起来
安装完成以后进入bin目录,看下都有什么脚本:
cd /opt/tongweb/bin ls -l start.sh stop.sh setEnv.sh启动命令就一条:
./start.sh启动过程中终端会打印一些当前系统和JDK信息,看到类似TongWeb Server Start Success的输出时,启动基本成功。为了确认,建议看日志文件:
tail -f /opt/tongweb/logs/server.log日志里出现Server startup字样,说明TongWeb核心服务已经起来了。接下来验证http端口,默认情况下业务服务端口是8080,管理控制台端口是9060,不同版本可能不同。用curl扫一下再加一个端口检查:
curl -I http://127.0.0.1:8080 netstat -tlnp | grep -E '8080|9060'停止服务用./stop.sh。这里要特别提醒一句:不要为了图省事直接kill -9,除非进程完全卡死。直接强杀进程在极端情况下会造成数据源连接池未释放、配置写入不完整,重启后项目报错都不知道从哪查起。stop.sh会走正常的关闭流程,把该释放的资源都释放掉。
如果是Windows环境,双击bin目录下的start.bat启动,控制台会保留在窗口里,不要关窗口,关掉等于停服务。想要后台运行,可以注册Windows服务或用计划任务方式,但生产上TongWeb多数跑在Linux,Windows一般用于开发联调,不必花太多精力折腾。
3.2 首次登录管理平台:默认账号和密码怎么处理
TongWeb的管理平台是Web页面,在浏览器输入控制台地址:
http://服务器IP:9060/console浏览器打开后进入登录页,这个页面是TongWeb特有的图形化管理入口,Tomcat用户第一次看到会觉得挺新鲜。重点说一下默认账号,很多第一次用的人卡在这一步。常见默认账号是admin,密码是tongweb,但不同版本、不同安装方式可能不一样,有些版本在安装过程中允许你自己设置,有些版本会在日志或启动输出里打印初始密码。如果你手里的版本登录不进去,先去logs目录找初始化相关的记录,而不是一遍遍瞎试密码把账号锁了。
登录成功后,管理平台左侧一般能看到应用管理、部署管理、数据源、虚拟主机、JVM参数、线程池等功能模块。到这个界面,TongWeb和Tomcat的差距就出来了,Tomcat想管理数据源、看线程数得去翻配置文件或者用JMX工具,TongWeb在页面上点几下就能搞定,对不熟悉命令行的同学友好很多。
登录后的第一件事不是部署应用,而是去改密码。默认账号密码在所有TongWeb用户里其实是公开的,不第一时间改掉,和在自己家门口挂把钥匙没什么区别。改完密码最好把管理端口限制在内网访问,安全组和防火墙都配上白名单,别把9060端口对外暴漏。
3.3 端口、虚拟主机与JVM参数调整:改配置的前因后果
先讲端口。TongWeb有两类端口,一是对外提供HTTP服务的服务端口,二是管理控制台端口。这两个端口都可以在conf/server.xml里改。修改前记住一个原则:先备份再改。改动前先复制一份server.xml叫server.xml.bak,避免改坏了连启动都做不了。
cd /opt/tongweb/conf cp server.xml server.xml.bak vi server.xml在server.xml里找到Connector配置,常见长这样:
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443"/>把port改成你规划的业务端口,比如8088,保存后重启。改完别忘同步防火墙,否则外部还是访问不了:
firewall-cmd --permanent --add-port=8088/tcp firewall-cmd --reload再说JVM参数。部署应用经常出现内存不足,这不是程序问题,是JVM堆内存给得不够。TongWeb的启动脚本会加载setEnv.sh里的JAVA_OPTS,在这个文件里改内存参数最合适:
vi /opt/tongweb/bin/setEnv.sh JAVA_OPTS="-Xms1024m -Xmx2048m -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m"这里给新手解释一下为什么要关心JVM参数。默认堆内存往往只有256MB或512MB,如果项目的war包比较大、并发量稍微上来一点,Full GC频繁、应用假死这些毛病就全冒出来了。生产环境一般根据服务器物理内存来估,给JVM分配物理内存的1/2到2/3比较合适,同时-Xms和-Xmx设置成一样,避免运行时频繁扩容缩容。JDK8不需要PermSize,用MetaspaceSize控制元空间就够了。改完重启,再用jmap或控制台里看JVM参数是否生效,jps找到TongWeb进程号,然后jmap -heap PID查看当前堆配置。
4. 应用部署:从war包到静态项目的完整落地
4.1 war包部署的两种方式,哪种更省心
把Java应用部署到TongWeb上,最典型的就是打war包。部署方式有控制台部署和目录部署两种,我给对比一下。控制台部署适合第一次部署、不熟悉文件结构的场景;目录部署适合批量操作、自动化脚本场景。
控制台部署流程:登录管理平台,进入应用管理或部署管理,选择本地上传war包,填写应用名称,上传后点击部署,然后在应用列表里点启动。页面会明确显示当前应用是已停止还是已启动,看到“已启动”状态再开始访问验证。这种方式最大的好处是能选上下文路径,不用手动改配置,图形化界面一目了然。
目录部署则简单粗暴:把war包复制进deploy目录,重启TongWeb或触发自动部署。TongWeb默认会扫描deploy目录,发现新的war包会自动部署。这种方式适合批量上线,但要注意war包文件名会直接影响访问路径。比如app.war部署后的访问地址是http://IP:8080/app/,如果你想让它直接通过根路径访问,就得在管理台里把上下文路径设置为/,或者把应用部署成root应用。
个人经验:正式环境我更喜欢控制台部署,因为日志和状态在页面上都有,出问题能当场看到;只有批量机器才用目录部署加脚本。
4.2 静态HTML项目的部署,前端也要看这篇
TongWeb不仅能跑Java后端,也可以直接托管纯前端静态文件,很多项目的前后端分离部署里,前端dist包就放在TongWeb下。操作并不复杂:把前端构建出来的dist目录整个拷贝到TongWeb的webapps或deploy目录下,比如deploy/dist,然后访问http://IP:8080/dist/,能看到index.html就说明成功。
如果前端项目有点特殊,比如用的是单页应用,路由是history模式而不是hash模式,直接这样扔上去会出现一个问题:刷新页面就404,跳到其他路由后刷新是白屏。原因是路由没有对应的物理文件。解决办法是在server.xml里对相应虚拟主机配置错误页面映射,把404请求转发到index.html,或者让前端把路由改成hash模式。更简单的做法是让Nginx在前面兜一层,把静态资源请求交给Nginx处理,动态接口反向代理到TongWeb,这样对TongWeb的压力小,静态资源响应也更快。
静态资源还有一个容易踩的坑是访问路径大小写。Linux下路径区分大小写,dist目录里叫Index.html和index.html是两回事,Windows本地能跑、Linux服务器上404,多半就是这个原因。前端构建后注意目录名和文件名统一小写,能省掉很多莫名其妙的麻烦。
4.3 数据库连接池和驱动:一个容易忽略的配置点
部署完应用,很多人卡在最后一步:应用起来了一会又报错,一看日志是数据库连不上。这种情况十有八九是因为TongWeb里没有配数据源,或者数据库驱动jar包没有放到lib目录。
TongWeb管理平台里提供了数据源管理功能,可以在页面里配置数据源,指定驱动类、数据库URL、账号密码,然后在应用里通过JNDI名字引用这个数据源。这种方式的优点是连接复用、统一管理、能可视化看当前连接数,和直接在应用里用自己的连接池是两种路线。建议在正式项目里优先用TongWeb管理的数据源,出问题在页面上能直接看到状态,排查效率高很多。
忘记放驱动是另一个常见坑。Oracle驱动ojdbc、MySQL驱动mysql-connector-java这些jar包,要复制到TongWeb的lib目录下,然后重启服务才会生效。别丢错位置,丢到deploy目录不会被加载。如果你发现数据源配置页面里找不到对应数据库类型,先检查驱动jar包在不在,这是出现频率最高的问题。
5. 常见问题与排查技巧实录
5.1 启动类问题速查表
把TongWeb部署过程中最常见的启动问题整理一下,从日志关键字入手最有效。
| 现象 | 日志关键字 | 大概率原因 | 处理办法 |
|---|---|---|---|
| 启动脚本执行后无反应 | JAVA_HOME not found | 环境变量未配置 | 配置JAVA_HOME并source |
| 启动闪退 | OutOfMemoryError | 堆内存参数过大 | 降低-Xmx或增加物理内存 |
| 端口起不来 | Address already in use | 端口被占用 | netstat查占用进程,换端口或停掉占用 |
| 卡住不启动 | UnsupportedClassVersionError | JDK版本不兼容 | 换匹配的JDK版本 |
遇到启动问题第一反应不是反复重启,而是去看logs目录里最新的server.log或TongWeb.log,日志会告诉你真实原因。同样的错误提示在页面上和终端里往往看不全,日志文件里才是最完整的。netstat -tlnp | grep 8080这个命令在排查端口占用时最好用,能看到哪个进程占用了端口。如果发现被某个PID占用,ps -ef | grep PID看一眼是什么进程,再决定是停进程还是换端口,别上来就kill,容易误伤其他服务。
5.2 应用部署类问题:404、不生效、启动失败
应用部署最常见的三个现象是404、war包不生效、启动失败。404先确认三件事:应用状态是不是已启动、访问的上下文路径对不对、端口对不对。控制台里看应用状态最直观,状态是已启动再往下排查;上下文路径和war包名强相关,分清是/app还是/。还有一种情况是应用启动了但请求报404,这时去应用自身日志或者TongWeb的访问日志里看请求有没有进来,请求根本没进来就去查虚拟主机配置和端口。
war包不生效常见原因是上传的war包没有正常解压或者解压过程被中断。控制台部署有时候因为网络原因导致文件不完整,部署出去的应用启动时缺class文件。这种问题最省事的办法是把war包从管理台重新传一遍,或者手动解压到deploy目录下看目录完整性。war包是否完整可以用jar tf app.war快速看内容,缺失就到构建那边重新打包。
部署后启动失败,不要只盯控制台的报错,去logs目录看最近生成的日志文件。TongWeb对应用启动失败的日志一般会打印到独立的应用日志或者server.log中,关键字通常是Exception、Caused by。看到Caused by就往下翻,那个Caused by才是真正的原因头,前面那一大堆堆栈信息只是表象。很多同学看日志只看前五行就慌了,其实真正有用的信息在最后几行。
5.3 license过期和运行期诡异问题
TongWeb是商业软件,license文件过期会导致中间件服务被停止,这也是和Tomcat完全不同的体验。正式环境建议把license到期时间记在运维台账里,提前一个月找厂商续期。日志里出现license expired、platform expired这类关键字就是授权问题,别去改系统时间绕过,那样只会带来更多连锁故障。
运行期还有一个容易被人忽略的地方是系统时间和实际时间不一致。TongWeb在启动时对授权文件的校验依赖系统时间,系统时间被改成过去会造成授权校验混乱。服务器用NTP时间同步是基本操作,别觉得这事跟中间件没关系,等到证书、token莫名失效的时候就懂了。另外,TongWeb的线程池配置页面上有核心线程数、最大线程数这些参数,生产环境不要随意调到极大值,线程数不是越大越好,调得过大反而会增加上下文切换开销,垃圾回收也更频繁。
6. 生产落地:开机自启、多实例与几个实用经验
6.1 Linux开机自启:用systemd管理TongWeb
生产环境服务器重启是很正常的事,如果每次重启都要人肉登录去启动TongWeb,早晚有一天会漏。用systemd把TongWeb注册成服务,是最省心的方案。在/etc/systemd/system/目录下创建tongweb.service文件,内容参考如下:
[Unit] Description=TongWeb Application Server After=network.target [Service] Type=forking User=root ExecStart=/opt/tongweb/bin/start.sh ExecStop=/opt/tongweb/bin/stop.sh Restart=on-failure TimeoutStartSec=120 [Install] WantedBy=multi-user.target保存后执行systemctl daemon-reload,然后systemctl enable tongweb && systemctl start tongweb。注意TongWeb的start.sh默认会通过nohup的方式后台启动,所以Type建议用forking而不是simple,不然systemd可能认为服务一直没启动起来。不同版本启动脚本行为不一样,配置好后先手动跑一遍start.sh,看它是前台等待还是后台分离,再确认Type怎么写。
6.2 多实例部署:一个TongWeb跑多个项目
有多套系统要部署在同一台物理机时,开多个TongWeb实例比把所有应用塞进一个实例更稳。做法很简单:把整个安装目录复制一份,修改新实例的server.xml端口和管理控制台端口,指定不同的logs和deploy目录,然后单独启动。
cp -r /opt/tongweb /opt/tongweb_8081 cd /opt/tongweb_8081/conf vi server.xml把HTTP端口改成8081,控制台端口改成9061,logs和deploy目录保持各自独立,然后在/opt/tongweb_8081/bin下执行./start.sh,两个实例互不干扰。多实例的优点是故障隔离,一个项目把内存吃满,另一个实例最多受影响但不会直接挂;升级单个应用的时候也不会影响所有项目停机。缺点是占用的物理内存会成倍增加,每多一个实例就多一份JVM基础内存,机器内存不够时不要盲目开多实例。
6.3 几个只有生产环境才能验证的经验
最后说点踩坑踩出来的经验。
第一,任何配置改动前先备份,包括server.xml、setEnv.sh、虚拟主机配置,这些文件改了以后想回退,没有备份就得靠记忆重打。我习惯在相关文件边上放日期后缀的备份,改一次备一次,比如server.xml.bak-20250319。
第二,应用的日志和TongWeb的日志不要放在同一个系统盘上,日志增长会影响系统盘空间,而TongWeb日志满了以后中间件会表现出各种怪问题。部署前规划好一个单独挂载的日志目录最省心,这比临时清理日志靠谱得多。
第三,如果TongWeb前面还有Nginx,要注意两个层的超时时间。Nginx默认proxy_read_timeout比较短,而TongWeb对某些慢请求又确实没办法秒回,超时表现看着像中间件挂了,其实是网关先把连接断掉了。遇到这类问题先看Nginx的error.log,判断错误到底出在哪一层,别一上来就重启TongWeb。
第四,TongWeb虽然有学习成本,但只要你习惯先看日志、先备份、再改配置,它的稳定性完全不输同类产品。部署前先在本地用Tomcat把war包跑通,再放上TongWeb,遇到问题的时候就少了一个变量,排查速度会快很多。这个习惯帮我省了不少半夜临时发布的痛苦。
这篇TongWeb的安装及使用实操记录就写到这里。我自己的体会是,TongWeb的管理平台把很多Tomcat需要手动处理的活都接手了,初次配置稍微花点时间,一旦跑顺了,日常维护反而比纯命令行操作轻松不少。最后再分享一个小技巧:生产环境改任何一个配置之前,先在测试环境完整验证一遍,尤其是端口、JVM参数和数据源这类影响全局的配置,这样真正上线的时候你心里是有底的。