麒麟系统部署TongWeb实战:国产化迁移从环境配置到问题排查

1. 项目概述:在麒麟操作系统上部署TongWeb应用服务器

最近在国产化替代的浪潮下,不少项目都要求将原有的应用从Windows或CentOS迁移到国产的麒麟操作系统上。我手头就有一个老项目,需要把运行在Tomcat上的Web应用,迁移到东方通的TongWeb应用服务器,并且部署在银河麒麟V10操作系统上。整个过程踩了不少坑,从环境准备、软件安装、配置调优到问题排查,几乎把能遇到的问题都遇了一遍。今天就把这次完整的部署实战经验整理出来,如果你也正在或即将进行类似的国产化环境迁移,这篇内容应该能帮你省下大量摸索的时间。

简单来说,TongWeb是一款国产的Java EE应用服务器,对标的是WebLogic、WebSphere这类商业中间件。而麒麟操作系统,无论是桌面版的银河麒麟还是服务器版的中标麒麟,都是基于Linux内核的国产操作系统。将两者结合,是构建自主可控信息系统基础设施的常见技术栈。这次部署的目标,就是在麒麟操作系统上成功安装TongWeb,并确保一个典型的Java Web应用能够稳定运行。接下来,我会从环境准备开始,一步步拆解安装、配置、部署和问题解决的全过程。

2. 环境准备与前置检查

在开始安装TongWeb之前,充分的准备工作是成功的一半。麒麟操作系统虽然源自Linux,但在软件源、内核模块、硬件驱动等方面有其特殊性,盲目操作很容易导致安装失败或后续运行异常。

2.1 操作系统确认与基础环境配置

首先,必须明确你使用的是哪个版本的麒麟操作系统。通过执行cat /etc/os-releaseuname -a命令可以查看系统详细信息。常见的版本有银河麒麟桌面版V10、中标麒麟服务器版V7/V10等。不同版本的内核、Glibc库版本可能不同,这直接关系到TongWeb所依赖的Java环境是否兼容。

注意:务必记录下操作系统的具体版本号和架构(如x86_64或aarch64)。TongWeb的安装包和后续的JDK都需要与系统架构严格匹配。从网络热词可以看到,阿里云的ARM架构麒麟系统(aarch64)就需要专门的软件包。

接下来,需要配置好系统的软件源。麒麟操作系统默认的软件源可能不全,建议根据官方文档配置合适的yum或apt源,确保能顺利安装后续所需的依赖包,如unziptelnet(用于管理端口测试)、net-tools等基础工具。

# 示例:检查系统信息 cat /etc/os-release uname -m # 查看系统架构 # 安装基础工具 sudo yum install -y unzip net-tools telnet wget # 适用于yum包管理器 # 或 sudo apt-get update && sudo apt-get install -y unzip net-tools telnet wget # 适用于apt包管理器

2.2 JDK环境准备与验证

TongWeb是纯Java应用服务器,因此一个正确安装且配置好的JDK是首要前提。强烈不建议使用麒麟系统自带的OpenJDK,因为其版本和兼容性可能无法满足TongWeb的要求。通常需要从Oracle或适合国产环境的JDK提供商(如龙芯、华为毕昇JDK等)获取指定版本的JDK。

  1. JDK版本选择:参考TongWeb官方文档的推荐版本。常见的要求是JDK 1.8或JDK 11。以JDK 1.8为例,应下载对应操作系统架构的tar.gz包。
  2. 安装与配置:将JDK解压到特定目录,如/usr/local/java/jdk1.8.0_301。然后配置环境变量。
    # 编辑/etc/profile文件 sudo vim /etc/profile # 在文件末尾添加 export JAVA_HOME=/usr/local/java/jdk1.8.0_301 export JRE_HOME=$JAVA_HOME/jre export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib export PATH=$JAVA_HOME/bin:$PATH # 使配置生效 source /etc/profile
  3. 验证安装:执行java -versionjavac -version,确保输出的版本号正确,并且JAVA_HOME环境变量指向无误。

实操心得:环境变量配置后,最好新开一个终端窗口再次验证。我曾遇到过在当前终端source后生效,但系统服务(如以后将TongWeb配置为服务)启动时读取不到正确JAVA_HOME的情况,问题根源就在于环境变量没有全局生效。稳妥的做法是配置在/etc/profile.d/目录下创建一个独立的脚本文件。

2.3 系统资源与权限规划

安装前,需要规划好TongWeb的安装目录、运行用户以及所需的系统资源。

  • 安装目录:选择一个有足够磁盘空间(建议至少20GB以上空闲空间)的路径。例如/opt/tongweb。避免安装在/home目录下,以免权限问题。
  • 运行用户切忌使用root用户直接运行TongWeb。应该创建一个专用的系统用户,例如tongweb
    sudo groupadd tongweb sudo useradd -g tongweb -s /bin/bash -d /home/tongweb tongweb sudo passwd tongweb # 设置密码
  • 资源限制:对于生产环境,可能需要调整tongweb用户的系统资源限制,如最大文件打开数(nofile)和最大进程数(nproc)。可以通过编辑/etc/security/limits.conf文件实现。
  • 防火墙与SELinux:提前规划好TongWeb需要监听的端口(默认是9060管理端口和8080应用端口)。如果系统防火墙(firewalld或iptables)开启,需要放行这些端口。对于麒麟服务器系统,SELinux也可能处于 enforcing 状态,可以先将其设置为 permissive 模式以排除干扰,待安装成功后再仔细配置安全策略。
    # 临时设置SELinux为permissive sudo setenforce 0 # 永久修改需编辑 /etc/selinux/config,将SELINUX=enforcing改为SELINUX=permissive,并重启。

3. TongWeb安装步骤详解

完成环境准备后,就可以开始安装TongWeb了。这里以常见的Linux版本安装包为例。

3.1 获取与上传安装包

从东方通官方渠道获取对应版本的TongWeb安装包。通常是一个以.bin结尾的可执行文件(如Install_TW6.1.0.0_Enterprise_Linux.bin)或一个.zip压缩包。将其上传到麒麟操作系统的临时目录,例如/tmp

确保上传后的安装包具有可执行权限:

sudo chmod +x /tmp/Install_TW6.1.0.0_Enterprise_Linux.bin

3.2 执行静默安装(推荐)

对于服务器环境,图形化安装往往不可行,静默安装是标准做法。这需要准备一个应答文件(response file),在安装过程中自动提供配置参数。

  1. 创建应答文件:在安装包同级目录下,创建一个文本文件,如installer.properties。内容示例如下:

    # TongWeb安装应答文件 INSTALLER_UI=silent INSTALLER_LOCALE=zh_CN USER_INSTALL_DIR=/opt/tongweb/tw6.1 DEPLOY_TYPE=full CREATE_SHORTCUT=false ACCEPT_LICENSE_AGREEMENT=true
    • USER_INSTALL_DIR:指定你的目标安装目录。
    • DEPLOY_TYPE:安装类型,full为完全安装。
    • ACCEPT_LICENSE_AGREEMENT:必须为true表示接受许可协议。
  2. 执行安装命令:切换到安装包所在目录,使用-f参数指定应答文件进行安装。

    cd /tmp sudo ./Install_TW6.1.0.0_Enterprise_Linux.bin -f installer.properties

    安装程序会在后台运行,并将日志输出到当前目录或/tmp下的某个文件。可以通过tail -f命令跟踪日志。

  3. 等待安装完成:静默安装过程没有进度条,需要耐心等待命令行提示符返回,或者查看日志文件中出现“安装成功”字样。

3.3 目录结构与权限修正

安装完成后,进入安装目录(如/opt/tongweb/tw6.1),查看生成的主要目录:

  • bin/:启动、停止脚本所在目录。
  • logs/:服务器运行日志目录。
  • conf/:配置文件目录。
  • webapps/:应用部署目录。
  • temp/,work/:临时文件和JSP编译工作目录。

关键一步:将整个TongWeb安装目录的所有者更改为之前创建的tongweb用户。

sudo chown -R tongweb:tongweb /opt/tongweb/tw6.1

这一步至关重要,确保后续以tongweb用户启动服务时,有足够的权限写入日志、临时文件等。

4. 核心配置与启动优化

安装完成只是第一步,合理的配置才能保证TongWeb稳定、高效地运行。

4.1 内存与JVM参数配置

TongWeb的性能很大程度上取决于JVM参数。配置文件位于/opt/tongweb/tw6.1/bin/startserver.sh(或startserver.bat,但这里是Linux)。

找到设置JAVA_OPTS(或类似)的行。对于生产环境,一个基础的配置示例如下:

# 在startserver.sh中找到JAVA_OPTS设置,修改为类似如下 JAVA_OPTS="-server -Xms4096m -Xmx4096m -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m -Xmn1500m -XX:+UseG1GC -XX:+DisableExplicitGC -Dfile.encoding=UTF-8"
  • -Xms-Xmx:设置JVM堆内存的初始大小和最大值。建议两者设为相同值,避免运行期堆内存震荡带来的性能开销。具体大小根据服务器物理内存和应用需求来定,一般建议为系统内存的1/4到1/2。
  • -XX:MetaspaceSize-XX:MaxMetaspaceSize:元空间(Java 8+)大小设置。
  • -Xmn:年轻代大小。G1收集器下此参数不敏感,如果使用Parallel Scavenge收集器则需要关注。
  • -XX:+UseG1GC:指定使用G1垃圾收集器,在大多数场景下比传统的CMS表现更均衡。
  • -Dfile.encoding=UTF-8:强制指定文件编码,避免中文乱码问题。

注意事项:JVM参数调优是一个复杂的过程,上述仅为通用起点。需要根据应用的实际内存使用模式(可通过jstat -gcutil观察)进行精细调整。盲目加大堆内存可能导致GC停顿时间过长。

4.2 服务器核心配置调整

主要配置文件是conf/server.xml。这里有几个关键点:

  1. 端口修改:默认的8080和9060端口可能与现有服务冲突。可以在<Service>标签下的<Connector>元素中修改port属性。
    <!-- 修改应用访问端口 --> <Connector port="8080" protocol="HTTP/1.1" ... /> <!-- 修改管理控制台端口 --> <Connector port="9060" protocol="AJP/1.3" ... redirectPort="9443" />
  2. 线程池配置:在<Executor><Connector>中调整maxThreads(最大工作线程数)、minSpareThreads(最小空闲线程数)等参数,以匹配应用的并发需求。
  3. URI编码:确保<Connector>中设置了URIEncoding="UTF-8",这是解决GET请求中文乱码的标配。
  4. 访问日志:在conf/server.xml中配置访问日志(Access Log)的格式和输出位置,便于后期排查问题。

4.3 启动与停止脚本封装

虽然安装目录下有startserver.shstopserver.sh,但为了管理方便,我们通常将其封装成系统服务。

  1. 创建启动脚本:以tongweb用户身份,创建一个简化的启动脚本/home/tongweb/start_tw.sh

    #!/bin/bash export JAVA_HOME=/usr/local/java/jdk1.8.0_301 export PATH=$JAVA_HOME/bin:$PATH cd /opt/tongweb/tw6.1/bin ./startserver.sh

    并赋予执行权限:chmod +x /home/tongweb/start_tw.sh

  2. 配置为Systemd服务(推荐):对于麒麟V10等使用systemd的系统,可以创建服务单元文件。

    sudo vim /etc/systemd/system/tongweb.service

    内容如下:

    [Unit] Description=TongWeb Application Server After=network.target [Service] Type=forking User=tongweb Group=tongweb Environment=JAVA_HOME=/usr/local/java/jdk1.8.0_301 Environment=PATH=$JAVA_HOME/bin:$PATH WorkingDirectory=/opt/tongweb/tw6.1/bin ExecStart=/opt/tongweb/tw6.1/bin/startserver.sh ExecStop=/opt/tongweb/tw6.1/bin/stopserver.sh Restart=on-failure RestartSec=10 [Install] WantedBy=multi-user.target

    然后执行:

    sudo systemctl daemon-reload sudo systemctl enable tongweb.service # 设置开机自启 sudo systemctl start tongweb.service # 启动服务 sudo systemctl status tongweb.service # 查看状态

    这种方式可以实现服务的优雅启动、停止、状态监控和自动重启,是生产环境的最佳实践。

5. 应用部署与基础验证

服务启动后,可以通过ps -ef | grep java查看进程是否存在,并通过netstat -tlnp | grep java确认监听端口(如8080, 9060)是否已打开。

  1. 访问管理控制台:在浏览器中输入http://服务器IP:9060/console。默认用户名和密码通常是admin/admin。首次登录会要求修改密码。成功登录控制台,是TongWeb安装成功的最直观标志。
  2. 部署测试应用:将你的Web应用WAR包,上传到webapps/目录下,TongWeb会自动解压部署。或者通过管理控制台的“应用部署”功能进行部署。
  3. 访问应用:在浏览器中输入http://服务器IP:8080/你的应用上下文路径,验证应用是否能正常访问。

6. 高频问题排查与解决实录

在实际部署中,几乎不可能一帆风顺。下面是我遇到和收集的几个典型问题及解决方法。

6.1 启动失败:java.lang.NoClassDefFoundErrorClassNotFoundException

这是最常见的问题之一,尤其是类似网络热词中提到的java.lang.NoClassDefFoundError: java/util/logging/LogRecord

  • 原因分析:根本原因是类加载器找不到指定的类。可能的原因有:
    1. JDK版本不兼容或损坏:TongWeb需要的某个类在当前JDK中不存在或版本不对。
    2. 应用依赖冲突:你的Web应用自带的JAR包与TongWeb或JDK中的库发生了冲突。
    3. TongWeb自身库文件缺失:安装不完整或某些JAR包损坏。
  • 解决步骤
    1. 首先检查JDK:确认java -version输出的是官方推荐版本。尝试将TongWeb的bin/setclasspath.sh(或类似脚本)中显式指定的JAVA_HOME指向一个全新的、干净的JDK安装。
    2. 检查应用依赖:如果错误是在部署特定应用后出现的,尝试将应用WEB-INF/lib下的JAR包逐一移除(特别是日志相关的jar,如log4j,slf4j,logback),看是否解决问题。这常常是第三方包与中间件内置日志框架冲突导致。
    3. 检查TongWeb的lib目录:对比正常环境的/opt/tongweb/tw6.1/lib目录,看是否有明显的JAR包缺失。可以尝试从安装包中重新解压覆盖。

6.2 管理控制台无法访问(端口9060无响应)

  • 原因分析
    1. 防火墙未放行:麒麟系统的防火墙(firewalld)可能阻止了9060端口。
    2. SELinux限制:SELinux策略禁止了httpd(TongWeb进程)监听非标准端口。
    3. TongWeb服务未成功启动:检查日志logs/catalina.outlogs/startup.log,看是否有启动错误。
    4. IP绑定问题server.xml<Connector>可能只绑定了127.0.0.1,需要改为0.0.0.0
  • 解决步骤
    1. 检查端口监听sudo netstat -tlnp | grep 9060。如果无输出,说明服务没起来或没监听。
    2. 检查防火墙sudo firewall-cmd --list-all。查看ports项是否包含9060/tcp。如果没有,添加并重载:sudo firewall-cmd --add-port=9060/tcp --permanent && sudo firewall-cmd --reload
    3. 临时禁用SELinux排查sudo setenforce 0,然后尝试访问。如果成功,说明是SELinux问题,需要配置相应的策略模块,而非永久关闭。
    4. 检查server.xml配置:确认<Connector port="9060" ... address="0.0.0.0" />

6.3 应用部署后中文乱码

  • 原因分析:GET请求参数、POST请求体、文件上传名称、数据库连接、JSP页面编码等多个环节的编码不一致。
  • 系统性解决方案
    1. TongWeb容器级:确保conf/server.xml中所有<Connector>都设置了URIEncoding="UTF-8"useBodyEncodingForURI="true"
    2. 应用级:在应用的web.xml中添加全局字符编码过滤器(CharacterEncodingFilter)。
    3. JSP页面级:每个JSP页面头部添加<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    4. 数据库连接级:在JDBC连接URL中指定字符集,如jdbc:mysql://...?useUnicode=true&characterEncoding=UTF-8
    5. 操作系统级:确保麒麟系统的默认语言环境(locale)支持UTF-8。可以通过locale命令查看。

6.4 性能问题:内存持续增长或CPU占用过高

  • 排查工具:首先使用top命令查看进程的CPU和内存占用。然后使用JDK自带工具进行深入分析。
  • 内存泄漏排查
    1. jps -l:列出Java进程PID。
    2. jmap -heap <pid>:查看堆内存概要。
    3. jmap -histo:live <pid> | head -20:查看存活对象实例数,排查是否有某个类异常增多。
    4. 生成堆转储文件进行离线分析:jmap -dump:live,format=b,file=heap.hprof <pid>,然后用Eclipse MAT或VisualVM分析。
  • CPU高占用排查
    1. top -Hp <pid>:查看该Java进程内各个线程的CPU占用。
    2. 将占用最高的线程PID转换为16进制:printf "%x\n" <线程PID>
    3. jstack <pid> > jstack.log:打印线程栈。
    4. jstack.log中搜索刚才转换的16进制线程ID,找到对应的线程栈信息,即可定位正在执行的代码。

6.5 麒麟系统特定问题:驱动与显示

从网络热词看,有用户遇到“麒麟v10操作系统不能调分辨率”或打印机驱动问题。这些问题虽然不直接关系TongWeb,但会影响服务器管理员的体验。

  • 分辨率问题:通常出现在虚拟机(如VMware)安装的麒麟桌面版。需要确保已安装VMware Tools或VirtualBox Guest Additions,并安装了正确的显卡驱动。
  • 打印机驱动:如“奔图m6556打印驱动”,需要前往打印机厂商官网或麒麟系统自带的“软件商店”查找并安装对应的国产操作系统驱动。
  • 网络助手工具:麒麟系统自带的网络配置工具如果遇到问题,可以尝试直接使用命令行nmcli或编辑网络配置文件/etc/sysconfig/network-scripts/ifcfg-eth0(可能因版本而异)进行配置。

7. 安全加固与生产环境建议

将TongWeb投入生产环境前,必须进行安全加固。

  1. 修改默认密码:首次登录管理控制台后,立即修改默认的admin密码,并创建具有不同权限的管理员账户,遵循最小权限原则。
  2. 禁用不必要的应用和管理接口:移除webapps目录下自带的、不用的示例应用(如docs, examples等)。如果不需要远程管理,可以考虑限制管理控制台(9060端口)的访问IP。
  3. 定期更新与漏洞扫描:关注东方通官方发布的补丁,及时更新TongWeb版本。对于网络热词中提到的“tongweb ejb反序列化漏洞扫描器可以发现嘛”这类问题,答案是肯定的。应定期使用专业的漏洞扫描工具(如Nessus, OpenVAS)或代码审计工具对部署的应用和中间件进行扫描,及时发现类似反序列化、SQL注入等安全漏洞。
  4. 日志审计与监控:配置日志轮转,避免日志文件无限增大占满磁盘。将logs目录下的访问日志、应用日志接入统一的日志分析平台(如ELK),便于审计和故障排查。同时,监控TongWeb进程的存活状态、JVM内存使用率、GC情况、线程池活跃度等关键指标。
  5. 备份关键配置:定期备份conf目录下的所有配置文件、以及应用的数据和代码。