疑難排解提示

Liberty 設定檔疑難排解要訣

為了協助您識別及解決問題,產品備有統一的記載元件。 請參閱 記載和追蹤。您也可以利用 ${wlp.install.dir}/bin 目錄中的 IBM® Support Assistant Data Collector (ISADC) 指令工具來快速收集日誌檔、配置檔之類的診斷檔案,或執行追蹤。

如果收到異常狀況訊息,訊息提供訊息的相關資訊。

每一個 Liberty 設定檔 API 的 Java™ API 文件都詳述於資訊中心的程式設計介面 (API) 區段,也以個別的 .zip 檔來提供(其位於 ${wlp.install.dir}/dev 目錄下的其中一個 javadoc 子目錄中)。

適用於分散式平台下列兩個主題提供使用 Liberty 設定檔時,適用的主要已知限制的詳細資料:

適用於 IBM i 平台如需使用 Liberty 設定檔時適用的主要已知限制的詳細資料,請參閱執行時期環境已知的問題和限制

確認您的 JDK 是支援的層次

如果您遇到難以理解的問題,請確認您在使用的 JDK 符合 Java 第 6 版或更新的版本,且是最新的服務水準。 請參閱 最低的 Java 支援層次

註: 當您利用 Java 第 6 版來使用 Oracle 型的 JVM 時,會發生死鎖。如果您是使用受影響的 JVM 或 JDK,下列設定可協助您避免發生死鎖:
  • 啟用下列 VM 選項:-XX:+UnlockDiagnosticVMOptions -XX:+UnsyncloadClass
  • 透過設定下列 Equinox 配置選項,設定 Equinox 架構選項以對類別載入使用類別名稱鎖定:-Dosgi.classloader.lock=classname
這些選項可以在啟動 Liberty 伺服器時,於 Java 內容檔(例如:jvm.options)中設定。

安全疑難排解

這節說明一些常見的安全問題及您可以選擇的解決方案。

SESN0008E: 鑑別為匿名的使用者試圖存取 user: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 設定檔上配置應用程式授權
CWWKZ0013E: 不可能啟動兩個稱為 {0} 的應用程式,後面會出現非預期的安全行為,以及 CWWKS9104A 之類的錯誤訊息。
當您既在 server.xml 中利用 application 元素來指定您的應用程式,也在 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 無法運作,請確定使用相同 LTPA 金鑰、密碼及 webAppSecurity 元素之 ssoCookieName 屬性的不同 Liberty 設定檔伺服器,其「世界標準時間」(UTC) 相同,且共用相同的使用者登錄。 另外,如果記號到期,或以不一致的方式變更使用者登錄(例如:修改網域範圍,或移除 Cookie 所代表的使用者)之後,從 Web 瀏覽器送出 Cookie,SSL 就會失敗,系統會提示使用者重新輸入認證資訊。請參閱 利用 LTPA Cookie 來自訂 Liberty 設定檔的 SSO 配置
進行安全公用 API 的除錯。
即使未啟用安全,例如,未指定安全特性(appSecurity-1.0appSecurity-2.0zosSecurity-1.0),也會載入 WSSecurityHelperRegistryHelper。 如果未啟用安全,WSSecurityHelper.isServerSecurityEnabled()WSSecurityHelper.isGlobalSecurityEnabled() 方法都會傳回 false,RegistryHelper.getUserRegistry() 方法會傳回 null。

如果未啟用安全,可能不會載入其他安全公用 API 類別。 如果您試圖存取這些類別,並呼叫其中一個類別的方法,可能會出現 java.lang.NoClassDefFoundError 異常狀況。

如果要避免出現 java.lang.NoClassDefFoundError 異常狀況,您必須先呼叫 WSSecurityHelper.isServerSecurityEnabled()WSSecurityHelper.isGlobalSecurityEnabled() 類別來進行測試,以瞭解是否啟用了安全,然後只在啟用安全之時,才呼叫其他安全公用 API 類別。 請參閱安全公用 API,以取得這個編碼技術的範例。

註: 這個行為與 完整設定檔 不同。在 完整設定檔 中,不論是否啟用安全,都一律會載入所有類別。
無法鑑別含有 Unicode 字元的使用者
為了鑑別名稱含有 Unicode 字元的使用者,您必須在伺服器 start 指令中新增下列 JVM 選項,將 Liberty 伺服器使用的字元編碼類型設為 UTF-8:
-Dclient.encoding.override=UTF-8
您也必須在登入頁面中指定 charsetpageEncoding。這裡的範例是在登入 JSP 頁面上指定下列參數:
<%@page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
Liberty 儲存庫[8.5.5.4 或更新版本]java.lang.annotation.AnnotationFormatError: java.lang.IllegalArgumentException:Wrong type at constant pool index at sun.reflect.annotation.AnnotationParser.parseAnnotations(AnnotationParser.java:87)
Liberty 儲存庫[8.5.5.4 或更新版本]當 OpenID Connect 或 OAuth 提供者使用「資料庫儲存庫」,來登錄使用某些 JDK 7 版本的用戶端時,便可能發生這個錯誤。

如果要避開這個問題,請升級至 JDK 7.1 版。

LDAP 疑難排解

這節說明一些常見的 LDAP 問題及您可以選擇的解決方案。

FFDC1015I: 已建立一個 FFDC 發生事件:javax.naming.ServiceUnavailableException: myldapserver.mycompany.com:636; socket closed com.ibm.ws.security.registry.ldap.internal.LdapRegistry 298
messages.log 中的這個訊息指出,無法呼叫到所配置的 LDAP 伺服器。 請檢查您的 LDAP 伺服器,確認它在執行中,且能夠從 Liberty 設定檔伺服器來存取它的 IP 位址。
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: 位址已在使用中: connect]
這個訊息可能會出現在 FFDC 日誌中,指出本端伺服器可用的 Socket 已用完,當連接到您的 LDAP 伺服器時,可能會導致失敗。 請確定未使用 Socket,然後再試一次。
CWWKS1100A: 使用者 ID xxxxx 的鑑別不成功。 指定了無效的使用者 ID 或密碼
在負載繁重時,即使訊息中提及的使用者是 LDAP 伺服器上的有效使用者,伺服器也可能發生這個 FFDC 異常狀況。當使用 LDAP 配置時,您可以利用開發人員工具來新增 reuseConnection=false 內容,或者停用它。如果要修正這個問題,請將這個內容設為預設值 true

SSL 疑難排解

這節說明一些常見的 SSL 問題及您可以選擇的解決方案。

CWWKS9105E: 無法判斷自動重新導向的 SSL 埠。
當您試圖存取重新導向到 SSL 埠的應用程式,但無法使用 SSL 埠時,會出現這個錯誤。 這個埠有可能因為遺漏 SSL 配置或 SSL 配置定義中的某些錯誤而無法使用。 請檢查 server.xml 檔中的 SSL 配置,以確定它存在,並且正確。 請參閱 利用 Liberty 設定檔來保護通訊安全
FFDC1015I: 已建立一個 FFDC 發生事件:「java.lang.IllegalArgumentException: 配置不明、不完整:遺漏 ID 欄位 com.ibm.ws.config.internal.cm.ManagedServiceFactoryTracker aSyncReadNupdate。當試圖讀取配置及更新 ManagedServiceFactory 時,擲出異常狀況。 異常狀況 = java.lang.IllegalArgumentException: 配置不明、不完整:遺漏 ID 欄位」,位於 ffdc_12.04.18_16.09.42.0.log
當配置中有 keystore 元素,但沒有 ID 欄位時,會發生這個錯誤。 如果您使用最低限的 SSL 配置,請將 ID 欄位設為 defaultKeyStore
如果使用設定了 sslEnabled,但未指定 sslRef 值的 LDAP 使用者登錄,可能會出現異常狀況。
比方說,如下列範例所示,配置的 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 Socket Factory。 您可以執行下列步驟,來避開此問題:
  • 建立含有下列兩個空項目的文字檔(例如,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 Object Request Broker (ORB) 攔截程式。如果要解決這個問題,您可以從 JDK 編輯 orb.properties 檔,使其不使用這些攔截程式。這個檔案通常可在 WebSphere <JAVA_HOME>/jre/lib directory 目錄中找到,不過,可能已被使用者 <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 方法。
適用於分散式平台適用於 IBM i 平台

將修正套件及臨時修正程式套用於保存檔安裝之中

如果您從保存檔安裝您的 Liberty 設定檔執行時期環境,而不是使用 Installation Manager 來安裝,當套用服務程式更新時,您必須採取特殊方法。 如需相關資訊,請參閱將修正套件套用至 Liberty 設定檔 Java 保存檔安裝架構將臨時修正程式套用於 Liberty 設定檔保存檔安裝架構

效能的疑難排解

本節說明一些常見的效能問題,以及您可以選擇的解決方案。

您的應用程式監視器使用高 CPU 使用率。

如果您的應用程式監視器在 apps/ 目錄底下有很多檔案,而且輪詢頻率太高,就會發生此錯誤。

如果要避免此問題,您可以做一些變更。

  1. 增加 pollingRate 屬性的值。
  2. 更新 server.xml,以併入 applicationMonitor 元素,使其含有非 polledupdateTrigger
    server.xml
    <applicationMonitor updateTrigger="mbean" /> 
  3. 減少 apps/ 目錄底下的檔案數目。

如需 applicationMonitor 元素的相關資訊,請參閱控制動態更新


指示主題類型的圖示 參照主題

資訊中心條款 | 意見


「時間戳記」圖示 前次更新: 2015 年 6 月 22 日
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=phil&product=was-libcore-mp&topic=rwlp_trouble
檔名:rwlp_trouble.html