WebLogic Server 12.2.1.4 这套环境,我从 2019 年那个版本刚放出来就开始搭,Windows 和 Linux 两条路都走过,前后不下二十次,踩过的坑能凑成一本薄薄的小册子。很多人以为"装个中间件而已",结果卡在 JDK 版本、静默安装参数、建域脚本这几个点上,一卡就是大半天。这篇文章就是把我这些年的搭建过程完整摊开讲一遍:准备什么、为什么这么准备、每一步的实际命令长什么样、报错了往哪查。
12.2.1.4 这个版本号在 12c 家族里有点特殊,它是 12.2.1 这条线上的第四个补丁集,发布时间在 2019 年下半年,属于长期支持分支。很多企业的核心系统还压在 12.1.3 或者更早的 10.3.6 上,升级时最终选的落脚点就是它——比 14c 更保守,比 12.2.1.3 更完整,JDK 8 和 JDK 11 都能跑。所以你会看到,招聘要求里写"熟悉 Weblogic 12c",九成指的是这个版本。
这篇文章适合三类人:第一次独立搭 WebLogic 环境的新人,按着步骤抄就能跑起来;从 Windows 开发机切到 Linux 服务器部署的老手,重点看第四章的系统参数和建域脚本;还有被各种诡异报错折磨过的同行,第五章的问题速查表可以直接收藏。我不会只给命令不给解释,每个参数为什么这么设、不这么设会出什么事,都会说清楚。
1. 为什么 12.2.1.4 现在还有人在认真搭
1.1 版本定位:它在 12c 家族里处于什么位置
WebLogic 的版本命名挺容易让人迷糊。12.2.1 是主版本,后面跟的第四个数字才是补丁集,所以 12.2.1.4 读作"12.2.1 的第 4 个补丁集",官方内部叫 12c Release 2 的第四次更新。它的上一个版本是 12.2.1.3,再下一个大版本直接跳到了 14.1.1(也就是俗称的 14c)。
真正值得说的地方在于:12.2.1.4 是 12.2.1 系列里第一个把 JDK 11 纳入支持范围的版本。之前 12.2.1.3 只认 JDK 8,很多想统一 JDK 版本栈的团队被卡住。12.2.1.4 之后这条路通了,你可以继续留在 JDK 8 上求稳,也可以试水 JDK 11。这个差异直接决定了你安装前要下哪个 JDK 包,后面第二章会展开。
另一个现实原因:14c 移除了一批老组件和旧 API,很多跑了十年的老应用直接部署不上去。升级评估做了一年,最后发现"能不动就不动,选 12.2.1.4 打补丁就行"——这是我在好几个客户现场听到的原话。
1.2 这套环境到底解决什么问题、给谁用
环境搭建这件事,听起来是纯体力活,其实分三层目标,很多人只盯着第一层,后面两层没做好,环境就是"能启动但不敢用"的状态。
- 第一层,跑起来:装完中间件、建好域、AdminServer 能起来、控制台能登进去。
- 第二层,跑得稳:内存参数合理、日志落到规范位置、Linux 系统参数调过、开机自启配好。
- 第三层,能交接:目录结构清晰、域配置有备份、新建受管服务器的流程别人拿到文档就能复现。
只做到第一层,环境就是个演示品。生产上线前会被 DBA、安全、运维三方轮流挑毛病,然后你返工重来。我建议从第一天就按三层目标建,多花的时间不到一小时,后面省的是好几天。
1.3 Windows 和 Linux 两条路线先想清楚再动手
不少人问:开发机是 Windows,服务器是 Linux,是不是两套完全不同的东西?不是。WebLogic 的核心安装器是同一个 Java 程序,域结构在两边也完全一样(都是 config.xml + servers 目录 + bin 脚本),真正的差异集中在四个地方。
| 对比项 | Windows | Linux |
|---|---|---|
| 安装器执行方式 | java -jar或双击 | java -jar,需图形库或静默模式 |
| 系统参数 | 基本不用调,靠默认值 | 必须调 ulimit 和内核参数 |
| 服务化方式 | installSvc.cmd 注册成 Windows 服务 | systemd 单元文件或启动脚本 |
| 典型坑位 | 路径含空格、中文、权限 | 熵池不足导致启动慢、账号权限错乱 |
所以我个人的建议是:Windows 用来做开发验证和学习,Linux 用来做准生产和生产。两边都按本文走一遍,大概各需要两到三小时,主要时间花在下载介质和等待安装器解压上。
2. 动手前的准备:JDK、介质、目录与系统参数
2.1 JDK 选型与验证,装错版本必踩的坑
这是整个搭建过程中最容易翻车的一步,而且翻车方式很隐蔽:装的时候不报错,启动的时候直接一句Unsupported major.minor version或者更晦涩的类加载异常。
先说结论:**12.2.1.4 稳妥的选择是 JDK 8 的较新小版本(8u 系列的后期更新),如果你确实需要 JDK 11,请先确认你要部署的应用、以及你手上的 12.2.1.4 补丁级别都支持它。**JDK 17 及以上不要碰,WebLogic 会直接起不来,这不是配置能绕过去的,是字节码版本不兼容。
具体到操作,JDK 装完先验证三件事,别急着装中间件:
# Linux 侧 java -version javac -version echo $JAVA_HOME # 关键:确认 java 到底是从哪来的,避免系统自带 JDK 抢路径 which java readlink -f $(which java)# Windows 侧(cmd) java -version echo %JAVA_HOME% where javawhere java或者which java这两条命令看起来多余,但我见过太多次"环境变量配的是新 JDK,实际跑的是系统自带的旧 JDK"。原因通常是 PATH 里/usr/bin排在$JAVA_HOME/bin前面,或者 Windows 上 Oracle 安装器往 PATH 头插了自己的路径。这个坑不解决,后面所有报错都会指向错误方向。
还有一个我强烈建议的做法:JDK 目录不要放在 WebLogic 的 Middleware 目录里面。装中间件时,安装器有一步会让你指定 JDK 路径(-jreLoc),很多人顺手选了个 Middleware 下的 jdk 目录,结果后面换 JDK 或者打补丁时目录关系变得很乱。独立放,比如 Linux 上/usr/java/jdk1.8.0_xxx,Windows 上D:\jdk\jdk1.8.0_xxx,清晰得多。
2.2 安装介质获取与校验,别省这一步
12.2.1.4 的安装器是通用安装包,文件名形如fmw_12.2.1.4.0_wls.jar,这个包同时包含 WebLogic Server 和 Coherence。还有一个体积更小的 Quick 版本,只装 WebLogic 本体,适合开发评估用。生产环境我一般用完整通用包的静默模式,Quick 包在功能裁剪上有时候会让人困惑(比如某些模板找不到),不差那点下载时间。
包下好之后,务必校验哈希。这个环节很多人跳过,然后在安装到 60% 的时候收到一个 "The installer has detected a corrupted file" 或者更莫名的解压错误,回头重下又要半小时。校验命令很简单:
# Linux sha256sum fmw_12.2.1.4.0_wls.jar# Windows PowerShell Get-FileHash .\fmw_12.2.1.4.0_wls.jar -Algorithm SHA256把结果和下载页面上给出的哈希值对一遍,字符完全一致再动手。另外提醒一句:这个 jar 包有 800MB 以上,用命令行java -jar启动时,确保你所在的终端会话不会因为 SSH 断线而中断,Linux 上建议挂个nohup或者用screen,否则安装器跑到一半进程被杀,清理残留比重新装还麻烦。
2.3 目录规划与 Linux 系统参数、账号准备
目录规划这件事,装之前花五分钟想清楚,能避免后面无数次的路径引用混乱。我常用的方案是:
ORACLE_BASE:Linux 上/u01/app/oracle,Windows 上D:\oracleORACLE_HOME(中间件主目录):$ORACLE_BASE/middleware/Oracle_Home或直接$ORACLE_BASE/product/12.2.1.4DOMAIN_HOME:/u01/app/oracle/domains/base_domain,和中间件目录分开- 日志、临时目录:
/u01/app/oracle/tmp,专门给安装器用
为什么中间件和域要分开?因为打补丁、升级中间件的时候,域目录通常要保留不动,如果两者嵌套在一起,操作时容易误删。这个习惯是从无数份运维规范文档里总结出来的,不是洁癖。
Linux 侧的系统参数是硬性要求,不调的话轻则报文件句柄不足,重则安装器直接告诉你"系统检查未通过"。以 oracle 用户为例,/etc/security/limits.conf里加:
oracle soft nofile 65535 oracle hard nofile 65535 oracle soft nproc 8192 oracle hard nproc 8192官方文档给出的下限要低一些,但生产上我建议直接给到 65535 和 8192,因为 WebLogic 在跑起来之后会开大量线程和套接字。改完记得重新登录验证:
ulimit -n ulimit -u内核参数(/etc/sysctl.conf)这块,WebLogic 官方给的建议值没有 Oracle 数据库那么激进,但按下面这组调一遍不会错:
fs.file-max = 6815744 net.ipv4.ip_local_port_range = 9000 65500 net.core.rmem_default = 262144 net.core.wmem_default = 262144 net.core.rmem_max = 4194304 net.core.wmem_max = 1048576 kernel.sem = 250 32000 100 128sysctl -p生效后,sysctl -a | grep file-max确认一下。这里有个经验:如果你所在的机器上还跑着其他中间件,改这些值之前跟负责这台机器的人确认一下,别因为调参把别人的服务搞出问题。
账号方面,Linux 上不要用 root 装 WebLogic,这条路能走通但后患无穷(域目录属主混乱、启动脚本权限错乱)。新建一个专用账号:
groupadd oinstall useradd -g oinstall -d /home/oracle oracle passwd oracle然后把/u01的属主给 oracle:chown -R oracle:oinstall /u01。Windows 侧相对简单,建议用管理员账号安装,但安装目录不要放在C:\Program Files下面,路径里的空格会在后续脚本里给你制造无穷的引号问题。
3. Windows 平台:从安装到能登录控制台
3.1 图形化安装的 6 个关键节点
Windows 上双击 jar 包或者用java -jar启动安装器,界面会依次问六类问题。我按顺序把需要你真正做决定的地方标出来,其他一路下一步即可。
第一个节点是库存目录(Inventory Directory)。这是 Oracle 通用安装器的机制,所有 Oracle 产品共用一个库存目录记录安装信息。第一次装会默认建在C:\Program Files\Oracle\Inventory,我建议改成短路径,比如D:\oracle\oraInventory,避免路径含空格。
第二个节点是安装类型。选择"典型安装"会一次性把 WebLogic Server 和 Coherence 都装上;"精简安装"只装 WebLogic。做开发环境选精简也行,但如果你的应用用到 Coherence 缓存,后面还得补装,不如一次装全。
第三个节点是中间件主目录。这里就是前面规划的ORACLE_HOME,填D:\oracle\middleware。注意这个路径一旦确定,后面建域脚本、补丁、启动脚本全都引用它,中途改名的成本很高。
第四个节点是JDK 选择。安装器会自动搜索注册表和常见路径里的 JDK,搜到的未必是你想要的那个。手动点浏览,指到D:\jdk\jdk1.8.0_xxx。
第五个节点是安全更新配置。做内网部署可以直接取消勾选"通过 My Oracle Support 接收安全更新",省掉一个必填的账号验证环节。
第六个节点是安装摘要页。这里别急着点安装,先截个图。截图这动作看着没什么技术含量,但当半年后你要复现这套环境、或者要写交接文档时,摘要页上的路径、JDK 版本、组件清单是最准确的记录,比回忆靠谱得多。
3.2 静默安装:response file 与 oraInst.loc
图形化适合第一次装,但如果你要给十台机器装,或者要从脚本一键拉起环境,就必须用静默模式。核心是两个文件:响应文件和库存指针文件。
响应文件wls.rsp的内容大致如下(Windows 路径要用双反斜杠转义):
[ENGINE] Response File Version=1.0.0.0.0 [GENERIC] ORACLE_HOME=D:\\oracle\\middleware INSTALL_TYPE=WebLogic Server DECLINE_SECURITY_UPDATES=true SECURITY_UPDATES_VIA_MYORACLESUPPORT=false库存指针文件oraInst.loc更短:
inventory_loc=D:\\oracle\\oraInventory inst_group=Windows 上inst_group留空,Linux 上填oinstall,这是两边的一个小差异。
然后执行:
java -jar fmw_12.2.1.4.0_wls.jar -silent -responseFile D:\setup\wls.rsp -invPtrLoc D:\setup\oraInst.loc -jreLoc D:\jdk\jdk1.8.0_xxx -logLevel info-logLevel info这个参数建议加上,静默安装默认输出很少,出错了只给你一行结果,加了之后能在控制台看到逐步进展。整个静默安装大概三到八分钟,取决于磁盘速度。安装完成后检查两个标志:
D:\oracle\middleware\wlserver\server\lib\weblogic.jar存在D:\oracle\middleware\OPatch目录存在
这两个都在,说明中间件本体没问题。
注意:静默安装失败的日志不在命令行里,而在
%ORACLE_HOME%\..\oraInventory\logs\下面,文件名形如installActions<时间戳>.log。这个日志动辄几万行,别硬看,直接搜SEVERE或者ERROR关键字。
3.3 WLST 离线建域并启动 AdminServer
域(Domain)是 WebLogic 的管理单元,一个域里有一个管理服务器(AdminServer)和若干个受管服务器。配置文件都在域目录里,所以"建域"这个动作本质上就是生成一套配置文件。
图形化的建域向导可以通过%ORACLE_HOME%\oracle_common\common\bin\config.cmd启动,但我强烈建议直接学 WLST 脚本建域,理由有三个:可重复、可版本管理、可参数化。图形向导点完之后你根本记不住自己选了哪些选项,出问题没法回溯。
WLST 是一个基于 Jython 的管理脚本环境,建域阶段用"离线模式"(不需要服务器在跑)。一个最小可用的建域脚本如下:
# create_domain.py readTemplate('/D:/oracle/middleware/wlserver/common/templates/wls/wls.jar') # 管理员账号密码 cd('/Security/base_domain/User/weblogic') cmo.setPassword('Welcome1_Change') # 生产模式:会要求输入管理员密码启动,更安全 setOption('ServerStartMode', 'prod') setOption('JavaHome', 'D:/jdk/jdk1.8.0_xxx') # 管理端口 cd('/') cd('Servers/AdminServer') set('ListenAddress', '') set('ListenPort', 7001) # 写域 writeDomain('D:/oracle/domains/base_domain') closeTemplate()执行方式:
# 先设置环境变量 D:\oracle\middleware\wlserver\server\bin\setWLSEnv.cmd # 然后跑 WLST java weblogic.WLST D:\setup\create_domain.py脚本里有三个地方值得说明。set('ListenAddress', '')留空表示监听所有网卡,本地开发方便,生产环境建议填具体 IP,减少暴露面。ServerStartMode设成prod的话,启动脚本会要求输入管理员密码,dev模式则会自动读取boot.properties免密启动——开发机用dev更省事,但生产必须用prod。JavaHome这个选项容易被漏掉,不设的话域会继承安装时的 JDK,将来换 JDK 就得手改配置文件。
建完域后启动:
cd D:\oracle\domains\base_domain\bin startWebLogic.cmd启动日志在D:\oracle\domains\base_domain\servers\AdminServer\logs\AdminServer.log。看到Server state changed to RUNNING就算成功。浏览器打开http://localhost:7001/console,用刚才设的账号密码登录。
3.4 注册成 Windows 服务与自启
开发机手动启动就够了,但如果有 Windows 服务器要对外提供服务,注册成服务会方便很多。WebLogic 自带脚本:
cd %ORACLE_HOME%\wlserver\server\bin set DOMAIN_NAME=base_domain set SERVER_NAME=AdminServer set USERDOMAIN_HOME=D:\oracle\domains\base_domain set PRODUCTION_MODE=true set WLS_USER=weblogic set WLS_PW=Welcome1_Change installSvc.cmd跑完之后在"服务"里能看到一个叫 beasvc base_domain_AdminServer 的服务。有两点必须提醒:一是把密码写进脚本或者环境变量存在安全风险,生产环境更推荐用boot.properties机制(放在域目录的servers/AdminServer/security/下,内容是两行用户名密码,改完权限收一下);二是服务默认启动类型是手动,需要到服务属性里改成自动并配置失败重启策略。
还有一个 Windows 专属的坑:如果服务器上装了杀毒软件或者主机防护类软件,WebLogic 服务启动时会因为端口监听、临时文件写入被拦截而超时失败。表现是"服务启动后立刻停止"。排查方法是到AdminServer.log里找Unable to bind或者超时相关记录,然后把 WebLogic 的安装目录、域目录、JDK 目录都加进白名单。
4. Linux 平台:静默安装 + 建域 + 受管服务器
4.1 静默安装的落地脚本
Linux 上如果没有图形界面,图形化安装器根本起不来(会报Can't connect to X11 window server),所以静默模式不是可选项而是唯一选项。好处是参数和 Windows 端几乎一致,只是路径风格不同。
响应文件wls.rsp:
[ENGINE] Response File Version=1.0.0.0.0 [GENERIC] ORACLE_HOME=/u01/app/oracle/middleware INSTALL_TYPE=WebLogic Server DECLINE_SECURITY_UPDATES=true SECURITY_UPDATES_VIA_MYORACLESUPPORT=false库存文件oraInst.loc:
inventory_loc=/u01/app/oracle/oraInventory inst_group=oinstall安装命令:
export TMP=/u01/app/oracle/tmp export TMPDIR=$TMP mkdir -p $TMP /u01/app/oracle/jdk1.8.0_xxx/bin/java \ -jar /u01/soft/fmw_12.2.1.4.0_wls.jar \ -silent \ -responseFile /u01/soft/wls.rsp \ -invPtrLoc /u01/soft/oraInst.loc \ -jreLoc /u01/app/oracle/jdk1.8.0_xxx \ -logLevel info这里TMP和TMPDIR两个环境变量必须提前设,而且要保证这个目录所在的分区有至少 1GB 空间。安装器会把 jar 包解压到临时目录,如果/tmp是个独立的小分区(有些系统只给 500MB),安装会在中途报一个含糊的"磁盘空间不足"错误。把临时目录指到/u01下面是最省事的做法。
另外,如果你的服务器是国产化发行版或者较新的内核,安装器启动时可能报系统检查不通过。这通常是安装器脚本里的内核版本判断逻辑太老导致的,可以用-ignoreSysPrereqs跳过检查。但要注意,跳过检查不等于问题不存在,装完之后要重点验证启动是否正常、有没有依赖库缺失的报错。
4.2 环境变量与启动脚本定制
Linux 上不需要像 Windows 那样注册系统服务,但要做得规范,需要处理三件事:环境变量、启动脚本、JVM 内存参数。
环境变量我习惯写在域目录的启动脚本里,而不是全局/etc/profile,原因是全局变量容易被其他应用干扰。在$DOMAIN_HOME/bin/setDomainEnv.sh前面加上:
export JAVA_HOME=/u01/app/oracle/jdk1.8.0_xxx export PATH=$JAVA_HOME/bin:$PATH export USER_MEM_ARGS="-Xms4096m -Xmx4096m -XX:MetaspaceSize=512m -XX:MaxMetaspaceSize=512m -Djava.security.egd=file:/dev/./urandom"重点说USER_MEM_ARGS里的几个参数,这是实际调优里最关键的部分。
-Xms和-Xmx设成一样大,是为了避免堆在运行时反复扩张收缩。WebLogic 默认的堆设置偏小(不同版本默认值在 256MB 到 512MB 之间),生产环境一定要改。具体给多少,我的算法是:先看这台机器上要跑几个受管服务器,把可用物理内存分成 N 份,每份再留出 30% 给系统页缓存和堆外内存。举个例子,16GB 内存的机器跑一个 AdminServer 加两个受管服务器,每个给 4GB 是合理的,剩下 4GB 留给操作系统。
-XX:MetaspaceSize和-XX:MaxMetaspaceSize是 JDK 8 之后的永久代替代品。WebLogic 会加载大量类和动态生成的代理类,不设上限的话,Metaspace 会慢慢涨到吃光物理内存。生产上给 512MB 起步比较稳。
-Djava.security.egd=file:/dev/./urandom这个参数是 Linux 上的经典优化点,路径里那个/./不是笔误,是绕过 JVM 内部对/dev/urandom的特殊处理路径。作用是让随机数生成不阻塞在熵池上。Linux 默认从/dev/random取随机数,熵不够时会阻塞等待,表现就是 WebLogic 启动卡在Starting WLS ...十分钟以上。这个坑我第一次遇到时以为是磁盘问题,查了很久。
启动:
cd /u01/app/oracle/domains/base_domain/bin nohup ./startWebLogic.sh > /u01/app/oracle/domains/base_domain/startup.out 2>&1 &用nohup加后台运行,避免 SSH 断开时把服务带走。日志除了 stdout 重定向,主日志依然在servers/AdminServer/logs/AdminServer.log。
4.3 WLST 建域脚本逐段拆解
Linux 上的建域脚本比 Windows 版多几个实用功能:建受管服务器、建集群、建机器(Machine)用于节点管理器托管。下面这份是我常用的模板,逐段说明。
# wlst_create_domain.py readTemplate('/u01/app/oracle/middleware/wlserver/common/templates/wls/wls.jar') # 1. 管理员账号 cd('/Security/base_domain/User/weblogic') cmo.setPassword('Welcome1_Change') setOption('ServerStartMode', 'prod') setOption('JavaHome', '/u01/app/oracle/jdk1.8.0_xxx') setOption('OverwriteDomain', 'true') # 2. 管理服务器端口 cd('/Servers/AdminServer') set('ListenAddress', '0.0.0.0') set('ListenPort', 7001) # 3. 建受管服务器 cd('/') create('app_server_1', 'Server') cd('/Servers/app_server_1') set('ListenAddress', '0.0.0.0') set('ListenPort', 8001') # 4. 建集群并把受管服务器加进去 cd('/') create('app_cluster', 'Cluster') cd('/Clusters/app_cluster') set('ClusterMessagingMode', 'unicast') cd('/Servers/app_server_1') set('Cluster', 'app_cluster') # 5. 写域 writeDomain('/u01/app/oracle/domains/base_domain') closeTemplate()逐个说关键点。set('ListenAddress', '0.0.0.0')在 Linux 上比留空更明确,避免某些发行版上 IPv6 优先导致的绑定困惑。受管服务器端口我习惯从 8001 开始编号,和 7001 形成规律,方便记忆和排查。
集群的ClusterMessagingMode设成unicast是 12c 之后的推荐做法,老版本默认用组播(multicast),而现在很多网络环境默认禁掉了组播,会导致集群内服务器互相发现不了,日志里出现大量Multicast socket相关的警告。改成单播就绕过了这个问题。
写域那一步,如果目标目录已存在,默认会报错退出,OverwriteDomain设成true会直接覆盖——这个选项方便脚本重复执行,但生产上一定要小心,覆盖意味着旧域的配置全丢。我一般把这一行注释掉,宁可手动删目录。
建完域之后,建议立刻做一件事:把$DOMAIN_HOME/config/config.xml复制一份存到域目录外面。这个文件是整个域配置的核心,服务器启动时读它,误改或者损坏都会导致启动失败。有了备份,恢复就是一条cp命令的事。
4.4 节点管理器与受管服务器
AdminServer 起来之后,受管服务器有两种启动方式。手动方式是直接调脚本:
cd $DOMAIN_HOME/bin ./startManagedWebLogic.sh app_server_1 http://127.0.0.1:7001这条命令要传两个参数:受管服务器名和管理服务器地址。启动过程中会提示输入 weblogic 的密码。手动方式适合调试,缺点是管理服务器重启后,受管服务器不知道,两边状态容易不一致。
规范做法是用节点管理器(Node Manager)托管。节点管理器是一个独立的小进程,跑在每台机器上,监听 5556 端口,负责按照管理服务器的指令启停本机的受管服务器。配置过程分三步。
第一步,启动节点管理器:
cd $DOMAIN_HOME/bin nohup ./startNodeManager.sh > nodemanager.out 2>&1 &第二步,在管理控制台里创建机器(Machine),填上主机名和节点管理器端口,然后做一次"测试节点管理器连接"。
第三步,把受管服务器指派到这台机器上,之后就可以在控制台里一键启停。
节点管理器的配置细节还有一层:它有自己的nodemanager.properties,里面有SecureListener、NodeManagerHome、日志路径等参数。默认配置下,节点管理器和管理服务器之间的通信是不加密的,内网可以接受,跨网段部署建议开启 SSL 并导入证书。这块展开讲能写一整篇,这里先记个印象。
提示:节点管理器启动失败最常见的原因是
nodemanager.properties里的ListenAddress和实际网卡不匹配,以及DomainsFile指向的域列表路径写错。日志在$DOMAIN_HOME/nodemanager/nodemanager.log,出错先看这个文件的前 30 行。
5. 踩坑实录:安装、建域、启动三类问题排查
5.1 安装阶段:从"没反应"到"装了一半退出"
安装阶段的问题有两个特点:报错信息含糊,日志藏在很深的地方。我把遇到频率最高的几个整理出来。
安装器启动后长时间无响应。先确认是不是在无图形界面的 Linux 上用了图形模式,检查echo $DISPLAY,为空就说明要用-silent。如果已经有DISPLAY但连不上,说明 X11 转发没配好。另外,中文环境下安装器界面可能因为字体缺失显示成方框,加个-Dfile.encoding=UTF-8有时能改善。
报 "There is not enough space on the disk"。除了目标目录空间,还要检查三点:临时目录/tmp的空间、库存目录所在分区空间、以及 inode 数量(df -i)。inode 耗尽同样会报空间不足,这个原因很隐蔽,我遇到过一台机器里的目录塞了几十万个小文件,实际空间还剩很多但 inode 满了。
静默安装走到一半退出,日志中看到 "The Java heap space"。安装器自身的 JVM 内存不够。解决方法是给安装器加参数:java -Xmx2048m -jar fmw_...jar ...。这个参数的位置有讲究,必须放在-jar之前,放在后面会被当成程序参数忽略。
装完之后weblogic.jar找不到。说明安装其实没走完,去oraInventory/logs里找最新的installActions日志,搜SEVERE。常见原因是响应文件里的ORACLE_HOME路径不存在或者权限不对,安装器会尝试创建父目录但有时会失败。
5.2 建域与启动阶段:启动卡住和状态异常
AdminServer 启动卡在某个阶段不动。第一章到第四章里提过熵池问题,Linux 上的第一嫌疑就是这个,加-Djava.security.egd=file:/dev/./urandom再看。如果不是熵池,看日志里最后一条输出,卡在Starting Security Services通常是证书或者密钥库问题;卡在Starting JMS多半是 JDBC 数据源连不上。
启动报 "address already in use"。端口被占了。查一下:
netstat -tunlp | grep 7001Linux 上常见的是上一次没正常关掉的进程还在(用ps -ef | grep java找),或者有别的服务用了同端口。Windows 上用netstat -ano | findstr 7001找到 PID,再去任务管理器对应。
控制台能登录,但受管服务器起不来。按顺序检查:管理服务器地址是否可达(telnet 管理IP 7001)、受管服务器的boot.properties或启动时输入的密码是否正确、节点管理器的连接测试是否通过、受管服务器自己的日志(在servers/app_server_1/logs/下)里有没有异常。
启动过程中抛 "Unsupported major.minor version"。JDK 版本不匹配,回头查第二章的 JDK 校验步骤,重点是which java和$JAVA_HOME是否一致。
日志里刷 "No space left on device" 但df看着还有空间。检查df -i的 inode,以及是不是有个日志文件被某个进程一直持有(lsof | grep deleted),空间已经被删掉但进程没释放句柄,这种情况重启服务才能回收。
5.3 网络、主机名与时间的三处隐蔽问题
有些问题不在 WebLogic 本身,但会让 WebLogic 表现得很不正常,而且排查时容易往错误方向找。
第一处是主机名解析。WebLogic 启动时会解析本机主机名,如果/etc/hosts里没有对应的记录,服务会尝试用 DNS 查询,超时之后可能绑定到错误地址。检查方式:hostname看主机名,然后ping $(hostname)看能不能解析到 127.0.0.1 或者本机实际 IP。解决办法是往/etc/hosts里加一行127.0.0.1 hostname。Windows 上对应的文件是C:\Windows\System32\drivers\etc\hosts。
第二处是时间同步。WebLogic 的会话、集群心跳、证书有效期校验都依赖时间。如果服务器时间偏差过大,会出现会话频繁失效、集群节点互相认为对方故障、证书校验失败等现象。Linux 上确认时间同步服务在跑,Windows 上确认与域控或者标准时间服务器同步正常。
第三处是防火墙。除了管理端口 7001 和受管服务器端口,集群之间、节点管理器、JMS 等组件还会用一批动态端口。如果网络策略比较严,建议把这个域的端口范围规划清楚并提前报备,而不是启动之后再一个个发现被拦。这一点在跨网段部署时特别重要,很多"偶尔连不上"的诡异现象最后都指向某个动态端口被间歇性拦截。
5.4 问题速查表
把上面这些整理成一张表,方便现场对着查。
| 现象 | 首要怀疑对象 | 快速验证方式 |
|---|---|---|
| 启动卡住不动 | 熵池、证书、数据源 | 日志最后一行 +cat /proc/sys/kernel/random/entropy_avail |
| 端口被占用 | 残留进程、其他服务 | `netstat -tunlp |
| 版本不兼容报错 | JDK 路径混乱 | which java与$JAVA_HOME比对 |
| 静默安装中途退出 | 临时目录空间、inode | df -h和df -i |
| 受管服务器连不上管理服务器 | 密码、主机名解析、端口 | telnet测试 + 双方日志 |
| 控制台页面打不开但服务是 RUNNING | 防火墙、ListenAddress 绑定 | curl -I http://ip:7001/console |
| Metaspace 持续增长最终 OOM | 未设 MaxMetaspaceSize | jstat -gcmetacapacity <pid> |
6. 交付前建议做的几件事
6.1 目录、日志与权限的规范化
环境能跑起来只是及格线。如果这套环境要交给别人维护,目录和权限的规范化程度决定了后面别人接手的痛苦程度。我的习惯是做一张目录对照表,贴在域的 README 里:中间件主目录在哪、JDK 在哪、域在哪、日志在哪、备份在哪。看着很基础,但真实场景里接手的人往往要花半小时在文件系统里翻找。
日志方面,WebLogic 的日志分好几个层级:服务器日志、HTTP 访问日志、数据源日志、JMS 日志,还有 JDK 自己的 GC 日志。GC 日志一定要单独配置输出,方式是往启动参数里加:
export USER_MEM_ARGS="$USER_MEM_ARGS -Xloggc:/u01/app/oracle/domains/base_domain/logs/gc.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps"出内存问题时,这份 GC 日志是第一手证据,没有它只能靠猜。同时建议配置日志轮转策略(按大小和时间双条件),不然一年之后日志目录能把磁盘吃满。
权限上有两个常见疏漏:域的security目录(存着boot.properties、密钥库)权限应该收紧到 700 或者 750,只允许运行账号访问;安装目录和域目录的属主必须是同一个运行账号,如果安装时用了 root、运行时用了 oracle,会出现"日志文件写不进去""临时文件创建失败"这类看着毫无道理的问题。
6.2 备份、版本记录与恢复演练
我见过太多人装完之后什么记录都不留,一年后要迁移或者重建时,完全靠猜——JDK 是哪个小版本、有没有打补丁、系统参数改过哪些。我的做法是装完之后立刻生成一份环境快照,内容至少包含:
- OS 版本和内核版本(
uname -a、cat /etc/os-release) - JDK 版本和路径(
java -version、readlink -f $(which java)) - WebLogic 版本(
java weblogic.version) - 已打补丁列表(
opatch lspatches) - 系统参数当前值(
ulimit -a、sysctl -a的关键项) - 域的目录结构和
config.xml
把这些存进一个文本文件放进域目录,往后每次变更都追加一行记录。这个习惯的价值在故障恢复时体现得特别明显。
config.xml之外,还建议定期备份整个$DOMAIN_HOME/config目录和security目录。前者是域配置,后者是密钥库和凭据,两者合起来才能完整恢复一个域。备份频率我一般设成每天一次,保留最近两周,配置变更后手动再备一次。
至于恢复演练,不用太复杂:找一台测试机,用备份的配置目录替换掉新建域的同名目录,然后启动,看能不能正常起来。走一遍这个流程,你会发现自己备份的东西到底缺不缺、路径写死在配置文件里的问题该怎么处理。这比任何文档都让人安心。
6.3 一份可以照着念的交接清单
交接的时候我一般把下面这份清单直接给对方,逐条确认,避免口头描述带来的信息损耗。
- 管理控制台地址、账号,以及生产模式下密码的获取方式
- 域的目录位置、受管服务器列表、端口分配表
- 节点管理器是否启用、端口、以及控制台里机器配置的对应关系
- 启动和停止的标准操作(含启动命令、日志位置、正常启动的标志)
- 已配置的数据源、JMS 资源清单及对应的后端连接信息(不写密码,指路)
- 系统参数和 JVM 参数的当前值,以及为什么这么设
- 备份位置、备份频率、恢复操作步骤
- 已知遗留问题(比如某个告警不影响使用、某个端口规划还没落地)
这份清单写下来大概两页纸,但能让接手的人从"摸索三天"变成"上手半天",也能让你自己少接十来个追问的电话。
我个人在实际操作中的体会是,WebLogic 环境搭建这件事,真正花时间的从来不是点下一步,而是把版本、参数、路径这三样东西理顺。12.2.1.4 这套东西本身足够成熟,官方文档也齐全,卡住你的大概率不是产品本身,而是机器上的环境细节——JDK 抢路径、熵池不够、临时目录没空间、主机名解析不到。把第二章和第五章的检查项在动手前一小时过一遍,后面基本就是一路平推。另外,别嫌记录麻烦,第一次装环境时顺手留的截图和版本快照,往往就是半年后救你一命的东西。下次如果你要把这套环境做成一键脚本,可以从静默安装的响应文件加 WLST 建域脚本这条路走,这两个文件参数化之后,整台机器从裸系统到能登录控制台,真的就是十几分钟的事。