Liberty 故障诊断提示

故障诊断信息描述常见问题的解决方案。

为帮助您确定并解决问题,本产品包括统一的记录组件。请参阅记录和跟踪

如果您收到异常消息,那么可以在消息中找到有关该消息的信息。

每个 Liberty API 的 Java™ API 文档均于在线 IBM® Knowledge Center 的编程接口 (Javadoc) 部分中详细说明,而且还可以在 ${wlp.install.dir}/dev 目录的某个 javadoc 子目录下的单独 .zip 文件中找到。

For distributed platforms下列两个主题中提供了使用 Liberty 时存在的主要已知限制的详细信息:

For IBM i platforms有关使用 Liberty 时存在的主要已知限制的详细信息,请参阅运行时环境已知问题和限制

检查 JDK 是否处于支持的级别

如果您遇到尚不具有现成解释的问题,请检查您正在使用的 JDK 是否符合 Java V7 或更高版本的标准,以及是否处于当前服务级别。请参阅支持的最低 Java 级别

安全性故障诊断

此部分描述了一些常见安全问题以及您可以选择的解决方案。

SESN0008E: 认证为匿名的用户尝试访问以下用户所拥有的会话:LdapRegistry/cn=steven,o=myCompany,c=US。
如果未认证的用户尝试访问由已认证的用户所创建的会话,那么会发生此错误。缺省情况下启用的会话安全性会阻止对会话进行未授权访问。仅创建会话的用户可以访问该会话。有关更多信息,请参阅会话安全性

如果使用 JSP(例如,login.jsp)进行表单登录,而且浏览器发送的 SSO 令牌到期,那么可能会发生此错误。因为 SSO 令牌到期,所以会提示用户使用针对表单登录而配置的 login.jsp 页面重新登录。缺省情况下,jsp 页面会尝试获取会话。此会话最初是由其令牌已到期的用户创建。因为令牌已到期并且用户未经认证,所以访问此会话时不会建立任何凭证,这将引起此错误。

要避免此错误,请重新启动那个启动新会话的浏览器,或者将 login.jsp 文件配置成缺省情况下不创建会话。如果选择更新 login.jsp 文件,请设置 <%@ page session="false" %>

CWWKS9104A: 对 {2} 调用 {1} 时,授权用户 {0} 失败。未向用户授予访问任何必需角色的权限:{3}。
如果您对应用程序所需的角色没有权限,那么会发生此错误。请确保用户或用户所属的组已至少映射到错误消息中所提及的其中一个角色。ibm-application-bnd.xmi/xml 文件中所定义的用户到角色映射优先于 server.xml 文件中所定义的映射。检查两个资源以确保定义了正确的映射。请参阅在 Liberty 中为应用程序配置授权
CWWKS9104A: 对用户 {0} 授权失败。
如果对同一上下文根指定了 applicationwebApplication,那么可能发生此错误。如果发生冲突,那么所定义的最新配置被忽略,并导致意外错误,例如,CWWKS9104A。
CWWKZ0013E: 无法启动名为 {0} 的两个应用程序,其后是异常安全行为和错误消息,例如 CWWKS9104A。
如果使用 application 元素在 server.xml 中和 dropins 文件夹中都指定您的应用程序,那么会发生此错误。因此,会尝试安装您的应用程序两次,这样 server.xml 文件中的安全性配置可能会生效,也可能不会生效。要修正此问题,必须将您的应用程序从 dropins 文件夹中移除,然后将其复制到另一个目录。如果必须将您的应用程序保留在 dropins 文件夹中,那么必须通过在 server.xml 文件中使用下列代码来禁用应用程序监视:
<applicationMonitor dropinsEnabled="false" />
未认证的用户可以访问我的 servlet 或 JSP。
如果认证失败或者您的 servlet 或 JSP 未受保护,那么将创建主体为 UNAUTHENTICATED 的用户(或 z/OS® 上的未认证 SAF 用户)。如果您未定义任何安全性约束或者您将 EVERYONE 特殊主体集映射到您的应用程序所需的角色,那么未认证的用户可以访问您的 servlet 或 JSP。复审 ibm-application-bnd.xmi/xmlserver.xml 文件中用户到角色的映射。采用下列其中一个选项:
  • 如果您的 servlet 或 JSP 未受保护,请在应用程序的部署描述符中添加安全性约束。请参阅认证
  • 如果不想任何未认证的用户访问您的应用程序,请将 EVERYONE 特殊主体集从该角色的映射中移除。请参阅在 Liberty 中为应用程序配置授权
  • 如果不能授权某一用户访问您的 servlet 或 JSP,请通过检查 ibm-application-bnd.xmi/xmlserver.xml 文件来复审映射到该角色的用户。您可以将角色映射到用户、组或特殊主体集。如果角色已映射到 EVERYONE 特殊主体集,那么会向所有用户授予访问权。如果角色已映射到 ALL_AUTHENTICATED 特殊主体集,那么会向所有已认证的用户授予访问权。如果要进一步限制可以访问您的 servlet 或 JSP 的用户,请移除这些特殊主体集。最后,检查用户所属的组。虽然用户可能没有显式访问权,但组可能已映射到该角色。在这种情况下,将用户从获授权的组中移除或者将组从角色映射中移除。请参阅在 Liberty 中为应用程序配置授权
单点登录 (SSO) 不起作用。
如果 SSO 不起作用,请确保不同的 Liberty 服务器(使用 webAppSecurity 元素的相同 LTPA 密钥、密码以及 ssoCookieName 属性)具有相同的世界时间 (UTC) 且共享同一个用户注册表。此外,如果令牌到期或者如果在以不一致的方式更改用户注册表(例如,修改域或移除 cookie 所表示的用户)后从 Web 浏览器发送 cookie,那么 SSO 会失败并且用户会收到重新输入凭证信息的提示。请参阅在 Liberty 中使用 LTPA Cookie 来定制 SSO 配置
调试安全性公用 API。
装入 WSSecurityHelperRegistryHelper,即使未启用安全性亦如此,例如,即使未指定安全性功能部件 - appSecurity-1.0appSecurity-2.0zosSecurity-1.0。如果未启用安全性,那么 WSSecurityHelper.isServerSecurityEnabled()WSSecurityHelper.isGlobalSecurityEnabled() 方法都返回 false,而 RegistryHelper.getUserRegistry() 方法返回空值。

如果未启用安全性,那么可能不会装入其他安全性公用 API 类。如果尝试访问这些类,并调用其中一个类上的方法,那么您可能会收到 java.lang.NoClassDefFoundError 异常。

要避免收到 java.lang.NoClassDefFoundError 异常,必须先通过调用 WSSecurityHelper.isServerSecurityEnabled()WSSecurityHelper.isGlobalSecurityEnabled() 类来测试以查看是否启用了安全性,然后只有在启用了安全性的情况下才调用其他安全性公用 API 类。有关此编码方法的示例,请参阅Liberty 中的安全性公用 API

注: 此行为与WebSphere Application Server 传统版不同。在WebSphere Application Server 传统版中,总是装入所有类,而无论是否启用了安全性。
无法认证使用 Unicode 字符的用户
如果要对名称中包含 Unicode 字符的用户进行认证,必须通过将以下 jvm 选项添加至服务器启动命令以将 Liberty 服务器使用的字符编码类型设置为 UTF-8:
-Dclient.encoding.override=UTF-8
还必须在登录页面中指定 charsetpageEncoding。以下是在登录 JSP 页面上指定这些参数的示例:
<%@page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
java.lang.annotation.AnnotationFormatError: java.lang.IllegalArgumentException:Wrong type at constant pool index at sun.reflect.annotation.AnnotationParser.parseAnnotations(AnnotationParser.java:87)
OpenID Connect 或 OAuth 提供者使用数据库存储器向某些版本的 JDK 7 注册客户机时,可能发生此错误。

为避免此问题,请升级至 JDK V7.1。

LDAP 故障诊断

此部分描述了一些常见 LDAP 问题以及您可以选择的解决方案。

FFDC1015I: 已创建 FFDC 事件:javax.naming.ServiceUnavailableException:myldapserver.mycompany.com:636;套接字已关闭 com.ibm.ws.security.registry.ldap.internal.LdapRegistry 298
messages.log 中的此消息指示无法访问所配置的 LDAP 服务器。请检查 LDAP 服务器以验证它是否处于运行状态,并验证它的 IP 地址是否可以从 Liberty 服务器进行访问。
javax.naming.CommunicationException:简单绑定失败:myldapserver.mycompany.com:636 [根异常是 javax.net.ssl.SSLHandshakeException:com.ibm.jsse2.util.g:PKIX 路径构建失败:java.security.cert.CertPathBuilderException:找不到所请求目标的有效认证路径]
如果在 LDAP 服务器上启用 SSL,而未将 LDAP 服务器的签署者复制到 LDAPSSLSettings 元素中所引用的信任库,那么与 LDAP 服务器的连接会失败,且产生 SSL 握手错误。请确保将 LDAP 服务器的签署者复制到信任库。
javax.naming.CommunicationException:myldapserver.mycompany.com:389 [根异常是 java.net.BindException:地址已在使用中:连接]
此消息可能出现在 FFDC 日志中,并指示本地服务器上的可用套接字已耗尽,这可能会导致无法连接至 LDAP 服务器。请确保套接字未使用,然后再试一次。
CWWKS1100A: 用户标识 xxxxx 认证失败。指定的用户标识或密码无效
即使消息中提及的用户在高负载的 LDAP 服务器上是有效的,服务器上也可能会发生此 FFDC 异常。借助 LDAP 配置,您可以使用开发者工具来添加 reuseConnection=false 属性或者将其禁用。要修正问题,请将此属性设置为缺省值 true

SSL 故障诊断

此部分描述了一些常见 SSL 问题以及您可以选择的解决方案。

CWWKS9105E: 无法确定用于自动重定向的 SSL 端口。
如果您尝试访问的应用程序会重定向至 SSL 端口,但 SSL 端口不可用,那么会发生此错误。该端口可能会由于缺少 SSL 配置或 SSL 配置定义发生某些错误而不可用。请在 server.xml 文件中检查 SSL 配置,以确保它存在并且是正确的。请参阅保护与 Liberty 的通信
FFDC1015I: 在 ffdc_12.04.18_16.09.42.0.log 中创建了 FFDC 事件:“java.lang.IllegalArgumentException:配置未知、不完整:缺少标识字段 com.ibm.ws.config.internal.cm.ManagedServiceFactoryTracker aSyncReadNupdate。尝试读取配置并更新 ManagedServiceFactory 时抛出异常。异常 = java.lang.IllegalArgumentException:配置未知、不完整:缺少标识字段”
如果配置中存在不含标识字段的 keystore 元素,那么会发生此错误。如果使用最低 SSL 配置,请将标识字段设置为 defaultKeyStore
如果使用启用了 SSL 的 LDAP 用户注册表,但未指定 sslRef 值,那么可能会收到异常。
例如,配置将 sslEnabled 设置为 true 但没有 sslRef 值,如以下示例中所示:
<ltldapRegistry id="ldap" realm="SampleLdapIDSRealm"
host="ccwin12.austin.ibm.com" port="636" ignoreCase="true"
baseDN="o=ibm,c=us"
bindDN="cn=root"
bindPassword="rootpwd"
ldapType="IBM Tivoli Directory Server"
idsFilters="ibm_dir_server"
sslEnabled="true"
searchTimeout="8m" />
必须输入 sslRef 值。如果使用的是类似如下的最低 SSL 配置:
<ltkeyStore id="defaultKeyStore" location="key.jks"
password="mypassword" />
sslRef 字段必须设置为 defaultSSLConfig

如果已设定定制 SSL 配置,那么必须将该配置的名称放入 sslRef 字段中。

如果从 WebSphere Application Server 中使用 JDK,并且在 Liberty 服务器上启用了 SSL,那么您可能会看到以下错误。
java.net.SocketException: java.lang.ClassNotFoundException: Cannot find the specified class com.ibm.websphere.ssl.protocol.SSLSocketFactory 
      at javax.net.ssl.DefaultSSLSocketFactory.a(SSLSocketFactory.java:11) 
      at javax.net.ssl.DefaultSSLSocketFactory.createSocket(SSLSocketFactory.java:6) 
      at com.ibm.net.ssl.www2.protocol.https.c.afterConnect(c.java:161) 
      at com.ibm.net.ssl.www2.protocol.https.d.connect(d.java:36) 
      at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1184) 
      at java.net.HttpURLConnection.getResponseCode(HttpURLConnection.java:390) 
      at com.ibm.net.ssl.www2.protocol.https.b.getResponseCode(b.java:75) 
      at com.ibm.ws.jmx.connector.client.rest.internal.RESTMBeanServerConnection.loadJMXServerInfo(RESTMBeanServerConnection.java:142) 
      at com.ibm.ws.jmx.connector.client.rest.internal.RESTMBeanServerConnection.<init>(RESTMBeanServerConnection.java:114) 
      at com.ibm.ws.jmx.connector.client.rest.internal.Connector.connect(Connector.java:315) 
      at com.ibm.ws.jmx.connector.client.rest.internal.Connector.connect(Connector.java:103) 
发生此错误是因为 Liberty 不支持 WebSphere Application Server SSL 套接字工厂。您可以通过执行下列步骤来解决此问题:
  • 创建带有以下两个空条目的文本文件(例如,my.java.security):
    ssl.SocketFactory.provider=
    ssl.ServerSocketFactory.provider=
  • Liberty 服务器创建 jvm.options 文件
  • 将以下属性添加至 jvm.options 文件,此属性包含指向您刚创建的文本文件的完整路径:
    -Djava.security.properties=fullPathTo/my.java.security
  • 如果要提高 my.java.security 文件的可复用性,请将此文件放在服务器目录中,然后您能够使用类似如下的相对路径:
    -Djava.security.properties=./my.java.security 

有关更多信息,请参阅定制 Liberty 环境

对 CORBA/IIOP 进行故障诊断

本节描述了一些常见 CORBA 问题以及您可以选择的解决方案。

如果从 WebSphere Application Server 使用 JDK,那么应用程序使用 CORBA/IIOP 通信时您可能会见到以下错误。
15:21:58.096 com.ibm.rmi.pi.InterceptorManager runPreInit:178 Init Process ORBRas [default]  java.lang.ClassNotFoundException:
com.ibm.ISecurityLocalObjectBaseL13Impl.CSIClientRI
        at com.ibm.CORBA.iiop.UtilDelegateImpl.loadClass(UtilDelegateImpl.java:685)
        at javax.rmi.CORBA.Util.loadClass(Util.java:246)
        at com.ibm.rmi.pi.InterceptorManager.runPreInit(InterceptorManager.java:172)
        at com.ibm.rmi.corba.ORB.initializeInterceptors(ORB.java:664)
        at com.ibm.CORBA.iiop.ORB.initializeInterceptors(ORB.java:1084)
        at com.ibm.rmi.corba.ORB.orbParameters(ORB.java:1359)
        at com.ibm.rmi.corba.ORB.set_parameters(ORB.java:1271)
        at com.ibm.CORBA.iiop.ORB.set_parameters(ORB.java:1694)
        at org.omg.CORBA.ORB.init(ORB.java:371) 
        ...

发生此错误是因为 Liberty 不支持 WebSphere Application Server 对象请求代理程序 (ORB) 拦截器。可通过从 JDK 编辑 orb.properties 文件以避免使用这些拦截器,从而解决此问题。此文件位于 WebSphere <JAVA_HOME>/jre/lib 目录中,尽管它可能已被用户的 <USER_HOME> 目录中的副本覆盖掉。以下示例显示 orb.properties 文件中必须注释掉的行:

# WS Interceptors
#org.omg.PortableInterceptor.ORBInitializerClass.com.ibm.ws.Transaction.JTS.TxInterceptorInitializer
#org.omg.PortableInterceptor.ORBInitializerClass.com.ibm.ejs.ras.RasContextSupport
#org.omg.PortableInterceptor.ORBInitializerClass.com.ibm.ISecurityLocalObjectBaseL13Impl.ClientRIWrapper
#org.omg.PortableInterceptor.ORBInitializerClass.com.ibm.ws.activity.remote.cos.ActivityServiceClientInterceptor
#org.omg.PortableInterceptor.ORBInitializerClass.com.ibm.ISecurityLocalObjectBaseL13Impl.CSIClientRI 
#org.omg.PortableInterceptor.ORBInitializerClass.com.ibm.debug.olt.ivbtrjrt.OLT_RI
#org.omg.PortableInterceptor.ORBInitializerClass.com.ibm.ws.wlm.client.WLMClientInitializer

# WS ORB & Plugins properties
#com.ibm.ws.orb.transport.ConnectionInterceptorName=com.ibm.ISecurityLocalObjectBaseL13Impl.SecurityConnectionInterceptor

对日志记录和跟踪进行故障诊断

本节描述了有关日志记录和跟踪的一些常见问题。

java.util.logging -- Java 日志记录编程接口。
Liberty 不支持使用 logging.properties 文件配置 java.util.logging。使用 Java 代码(例如,在部署的应用程序或用户功能部件中使用),来创建和添加 java.util.logging 处理程序、过滤器或格式化程序。
因为 Liberty 服务器根据日志记录配置元素的 traceSpecification 属性管理 java.util.logging 记录器级别,请避免使用 Logger.setLevel 方法。
For distributed platformsFor IBM i platforms

将修订包和临时修订套用到归档安装

如果您从归档文件(而不是使用 Installation Manager)安装 Liberty 运行时环境,那么在应用服务更新时必须采取特别措施。有关更多信息,请参阅将修订包应用于 Liberty Java 归档安装将临时修订应用于 Liberty 归档安装

诊断性能

本部分描述了一些常见性能问题以及您可以选择的解决方案。

应用程序监视器产生高 CPU 使用率。

如果应用程序监视器在 apps/ 目录下具有很多文件,且过度频繁地进行轮询,那么会发生此错误。

要避免此问题,可以更改一些设置。

  1. 增大 applicationMonitor 元素中 pollingRate 属性的值。
  2. 更新 server.xml 以将 applicationMonitor 元素包含在不是 polledupdateTrigger 中。
    server.xml
    <applicationMonitor updateTrigger="mbean" /> 
  3. 减少 apps/ 目录下的文件数。

有关 applicationMonitor 元素的更多信息,请参阅控制动态更新

对集合体进行故障诊断

此部分描述集合体具有的问题以及您必须应用的解决方案。

java.lang.IllegalArgumentException: CWWKX0219E: MBean“WebSphere:feature=collectiveController,type=CollectiveRepository,name=CollectiveRepository”没有名为“retrieveMemberRootCertificate”的操作
具有功能部件 collectiveMember-1.0(成员)的服务器无法向具有处于更低 Liberty 级别的功能部件 collectiveController-1.0(控制器)的服务器注册。例如,处于此 Liberty Beta 级别的成员无法向 V8.5.5.2 Liberty 中的控制器注册自身。

使用缺省日志记录时,成员的 FFDC 日志中会将此问题报告为首次故障数据捕获 (FFDC)。

要解决此问题,您必须将控制器移到等于或高于成员所处的 Liberty 级别。

对 SAML 进行故障诊断

此部分描述 SAML 具有的问题以及您必须应用的解决方案。

java.lang.ArrayIndexOutOfBoundsException: 数组下标超出范围:0
在未移除身份提供者令牌 (IdP) 的情况下,尝试通过来路不明的服务提供者 (SP) 发起的请求进行多次登录时,可能发生此异常。
为避免出现此问题,请在相关的来路不明的 server.xml 文件中添加 <httpSession invalidateOnUnauthorizedSessionRequestException="true" />
java.lang.IllegalStateException: CWWKS0010E: 获取调用者主体时,发现调用者主体集具有类型为 WSPrincipal 的多个主体。该主体集中只能有一个 WSPrincipal。WSPrincipal 的名称为:{0}
如果 SAML 用户先前直接登录本地用户注册表,那么可能发生此异常。为避免此问题,SAML 用户不得直接登录本地用户注册表。

对 REST API 发现进行故障诊断

如果远程调用 IBM REST API 发现资源管理器“试用”选项,且调用失败,返回响应代码 0,请确保向 IBM REST API 发现资源管理器中与 GET、PUT、POST 或 DELETE 操作关联的 Curl 和请求 URL 返回标准主机名或 IP 地址。如果标准主机名或 IP 地址不在 Curl 和请求 URL 中,请完成以下操作:

  1. server.xml 中添加变量元素,并指定标准主机名。以下是在 server.xml 文件中添加用于指定标准主机名的变量元素:
     <httpEndpoint host="*" httpPort="9080" httpsPort="9443" id="defaultHttpEndpoint"/>          
    <variable name="defaultHostName" value="developer.rtp.raleigh.ibm.com"/>
  2. For distributed platforms 将操作系统的完整计算机名称指定为标准主机名。
  3. 验证是否在 IBM REST API 发现资源管理器中与 GET、PUT、POST 或 DELETE 操作关联的 Curl 和请求 URL 中返回标准主机名。有关更多信息,请参阅设置 Liberty 服务器的缺省主机名,并阅读 IBM InfoSphere Information Server V11.3.1 产品文档中有关配置网络的信息。

用于指示主题类型的图标 参考主题

文件名:rwlp_trouble.html