WebApp/Weblogic

インストール

ドメイン名  :base_domain
管理サーバ  :admin
管理対象サーバ:srv1

-- 32bit OS ではDownLoadしたバイナリを実行すれば良い
WebLogic10.3.6-linux32.bin
を実行することで、GUIのインストーラーが起動する。64bitの場合は対応してない為、コンソールモードで起動する
-- 64bit OS で インストールするには Java JDK(HotSpot版/ OpenJDKはNG)から jarファイル(Generic WebLogic Server and Choherence installer)を実行する
rpm -ivh jdk-7u79-linux-x64.rpm
/usr/java/jdk1.7.0_79/jre/bin/java -d64 -jar fmw_12.1.3.0.0_wls.jar

以降の手順は 10.3.6 インストールした時の手順。(最新版も同じ感じでいける)

ディレクトリ構成

ディレクトリパス
BEA_HOME/u01/oracle
WLS_HOME/u01/oracle/wlserver_10.3
DOMAIN_HOME/u01/oracle/user_projects/domains/base_domain

ツール

ドメイン作成

/u01/oracle/wlserver_10.3/common/bin/config.sh [-mode=console]

管理サーバー起動

/u01/oracle/user_projects/domains/base_domain/startWebLogic.sh

管理対象サーバ起動

/u01/oracle/user_projects/domains/base_domain/bin/
startManagedWebLogic.sh srv1 t3://localhost:7001/

ノードマネージャ起動

/u01/oracle/wlserver_10.3/server/bin/startNodeManager.sh <LISTENアドレス> <LISTENポート>

アンインストール

/u01/oracle/utils/uninstall/uninstall.sh

起動時のパスワード入力をやめる

cd /u01/oracle/user_projects/domains/base_domain/servers/admin
mkdir security
cd security
touch boot.properties
-------------------
username=ユーザー名
password=パスワード
-------------------

WLDFコンソール拡張

以下の2つのファイルを $DOMAIN_HOME/console-ext ディレクトリにコピーすることで、管理コンソールの上部に「WLDFコンソール拡張」タブが表示される

  • $WL_HOME/console-ext/diagnostics-console-extension.jar
  • $WL_HOME/console-ext/diagnostics-console-extension-l10n.jar

WEBGUIログイン

http://<IPアドレス>:7001/console/login/LoginForm.jsp


 

デプロイのサンプル

アプリのデプロイ先は、/u01/oracle/user_projects/domains/base_domain/servers/管理対象サーバ名/stage ディレクトリ以下に格納される。

ファイル構成

mainWeb
mainWeb/WEB-INF
mainWeb/WEB-INF/web.xml
mainWeb/WEB-INF/classes
mainWeb/WEB-INF/classes/HelloWorld.java
mainWeb/WEB-INF/classes/HelloWorld.class

HelloWorld.class

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class HelloWorld extends HttpServlet{

    public void service(HttpServletRequest request,
        HttpServletResponse response)
        throws ServletException, IOException {

        response.setContentType("text/html");
        PrintWriter out = response.getWriter();

        out.println("<html>");
        out.println("<head>");
        out.println("<title>Hello World</title>");
        out.println("</head>");
        out.println("<body>");
        out.println("<h1>Hello World</h1>");
        out.println("</body>");
        out.println("</html>");

        out.close();
    }
}

web.xml

<web-app xmlns="http://java.sun.com/xml/ns/j2ee">
  <servlet>
    <servlet-name>hello</servlet-name>
    <servlet-class>HelloWorld</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>hello</servlet-name>
    <url-pattern>/HelloWorld</url-pattern>
  </servlet-mapping>
</web-app>

ブラウザからのアクセス

http://<IPアドレス>:<ポート番号>/mainWeb/HelloWorld


 

ノードマネージャ

ノードマネージャ管理者ガイド v10.3
http://otndnld.oracle.co.jp/document/products/wls/docs103/nodemgr/index.html

ノードマネージャ作成

  • 管理画面の [環境] - [マシン] から 新規に作成する
    タイプは「SSL」

  • 管理画面の [環境] - [サーバー] を表示
    [構成] - [全般]タブで「SSL」を有効化する。ポート番号は、既存と被らない番号にする

ノードマネージャ起動

/u01/oracle/wlserver_10.3/server/bin/startNodeManager.sh localhost 5556

[マシン] - [マシン名クリック] - [監視] - [ノード・マネージャのステータス] で ステータスが「アクセス可能」になってること

管理対象サーバーの設定

  • 管理画面の [環境] - [サーバー] を表示
    [構成] - [サーバー起動]タブに適切な値を入力する。
    設定例
    Javaホーム    :/u01/oracle/jdk160_29
    Javaベンダ    :Sun
    BEAホーム     :/u01/oracle
    クラス・パス   :起動スクリプト実行時の"CLASSPATH="で指定された値
    引数       :JAVA_OPTIONS= で指定した値(-Xmx=512mとか)を全て列挙する
    ポリシー・ファイル:起動スクリプト実行時の"-Djava.security.policy="で指定された値

設定ファイル/ログ

/u01/oracle/wlserver_10.3/common/nodemanager/

ファイル名説明
nodemanager.domainsノードマネージャによって管理されるドメイン名とドメインディレクトリのマッピング
※ドメイン構成ウィザードによって作成される
nodemanager.propertiesJavaベースのノードマネージャ設定ファイル
nodemanager.logノードマネージャのログ


 

JDBCデータソース

DBとのコネクションプールを作成しておくことが可能。

  • 左ペインから[サービス] - [JDBC] - [データ・ソース] を選択
  • [新規作成] - [汎用データ・ソース] を選択
  • データ・ソースの情報を入力し「次」へ
    項目内容設定例
    名前データ・ソース名(コンフィグのファイル名にもなる)JDBC_Data_Source-0
    JNDI名JNDIツリーへのバインド名jdbc/test
    データベースのタイプデータベースのタイプを選択Oracle
    データベースドライバデータベースドライバを選択*Oracle's Driver (Thin) for RAC Service-Instance connections; Versions:10 and later
  • トランザクションオプションを選択
  • データベース接続のプロパティを設定
  • 実行対象となるサーバを選択し「終了」
  • 左ペインの「変更のアクティブ化」を押下
  • 作成したデータ・ソースを選択し [監視] - [テスト]
  • サーバを選択し [データ・ソースのテスト] を押下し「テストは成功しました」と表示されること

コーディングサンプル

import java.io.IOException;
import java.io.PrintWriter;
import java.sql.*;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.sql.DataSource;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class DataSourceTest extends HttpServlet{
    private InitialContext ic;

    @Override
    public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        Connection conn = null;
        Statement  stmt = null;
        ResultSet  rset = null;
        response.setContentType("text/html");
        PrintWriter out = response.getWriter();
        out.println("<html>");
        out.println("<head></head>");
        out.println("<body>");

        try {
            this.ic = new InitialContext();
            String sql = "select empno, ename from emp";
            DataSource ds = (DataSource)ic.lookup("jdbc/test"); // データソースオブジェクト取得(JNDI名を指定)
            conn = ds.getConnection();               // コネクション取得
            stmt = conn.createStatement();            // Statementの作成
            rset = stmt.executeQuery(sql);            // 結果セットの取得

            // 結果セットの表示
            while ( rset.next() ) {
                out.println(rset.getInt(1) + "," + rset.getString(2) + "<br>");
            }
        } catch (NamingException ex) {
            Logger.getLogger(DataSourceTest.class.getName()).log(Level.SEVERE, null, ex);
        } catch (SQLException ex) {
            Logger.getLogger(DataSourceTest.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            try {
                if(rset != null){rset.close();}  // 結果セットクローズ処理
                if(stmt != null){stmt.close();}  // Statementクローズ処理
                if(conn != null){conn.close();}  // コネクションクローズ処理
            } catch (SQLException ex) {
                Logger.getLogger(DataSourceTest.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
        out.println("</body>");
        out.println("</html>");
        out.close();
    }
}


 

JRockit

サーバーサイドJavaアプリケーションを高速かつ安定して動作させることを目標としたSun Java VM と互換性が保証されたJava VM。
コンパイラ方式はJIT(Just-In-Time方式)を採用。(プログラム初期ロード時にネイティブコードにコンパイルし実行する)

 

GCログの取得

startWebLogic.sh などの起動スクリプト内にある JAVA_OPTIONS にオプションを追加する

JAVA_OPTIONS="${JAVA_OPTIONS} <オプション>"
オプション説明
-Xverbose:gcGCログを出力する
-XverboseTimeStampタイムスタンプを出力する
-XverboseLog:<ファイル名>ログの出力ファイル名(フルパス)
-XX:+HeapDumpOnOutOfMemoryErrorOutOfMemoryの際にヒープダンプを出力する
-XX:HeapDumpPath=<出力先ディレクトリ>ヒープダンプの出力先

jstatコマンド

ヒープサイズの使用率や、GC回数や、実行時間の確認。

$JROCKIT_HOME/bin/jstat -gc <PID> <間隔>s [回数]
ex) jstat -gc 12455 10s 60


 

jrcmdコマンド

$JROCKIT_HOME/bin/jrcmd <PID> [コマンド] [パラメータ]
$JROCKIT_HOME/bin/jrcmd <PID> help [コマンド]

引数なしで実行するとローカルマシンで動作している全てのPID表示
PIDに 0 を指定すると、動作している全てのPIDに対してコマンド送信する
診断コマンドの詳細はこちら

コマンド説明
print_threadsスレッドダンプ出力
print_object_summaryヒープ領域に存在するオブジェクトについて詳細な情報を出力(出力項目は左から、全体に占める割合、サイズ、インスタンス数、前回測定からの増減)
cutoff=パーセント数値で、指定したパーセント以上ヒープ占有してるオブジェクトのみ表示(0は全てのオブジェクトが表示される)
実行するとガーベジコレクション(OC)が実行される
print_memusageメモリサイズと利用状況を確認
set_filename各コマンドの出力結果を指定したファイルに出力
start_management_server管理ポートを開き、Jrockit Management Consoleなどの管理ツールを接続可能にする
kill_management_server管理ポートを閉じる
start_flightrecordingJFR(JRockit Flight Recorder)の記録開始。settingsパラメータで取得情報のテンプレート指定が可能
stop_flightrecordingJFR(JRockit Flight Recorder)の記録停止
check_flightrecording実行中のJFRをチェックする。id や name の確認が可能
dump_flightrecording実行中のJFRのDUMPを出力する
jrarecordingJRA(JRockit Runtime Analyzer)の記録開始
run_optfileポリシーファイルを読み込み、ポリシーファイルに基づいてコード最適化の制御
heap_diagnosticsヒープ診断ユーティリティ起動
hprofdumpヒープダンプを取得
print_class_summaryJRockitがロードしている全てのクラスを出力
verbosity冗長ログの出力設定を行う
help実行可能なコマンドの一覧を表示

スレッドダンプは取得した瞬間のスナップショット

ステータス説明
ACTIVEリクエスト実行中か、すぐに実行できる状態
STANDBYアクティブなスレッドプールから削除されていて、リクエストをすぐには処理できない状態
STUCKリクエストを実行中だが、600秒経過しても終了しないスレッド(サーバーログにBEA-000337が記録される)

start_flightrecording の settingsパラメータ

テンプレート名説明
code詳細なコンパイラ・ログを有効にするための追加の設定
default非常に低いパフォーマンス・オーバーヘッド用にチューニングされた、常時動作している本番の使用で推奨されるデフォルトの設定
freememメモリー不足および断片化の問題をデバッグする追加の設定
fullすべてのサブシステムのすべてのイベントの収集が有効となります。警告: パフォーマンス・オーバーヘッドが非常に高くなります
ioJava I/Oの詳細ログを有効にする追加の設定
leakメモリー・リークのデバッグ用の追加の設定
locks同期の詳細なログを有効にするための追加の設定
memoryGC/メモリー管理の詳細なログを有効にするための追加の設定
offすべてのサブシステムのすべてのイベントを無効にします
profileプロファイリング記録の作成に推奨される設定。情報の量とパフォーマンス・オーバーヘッドの最適なバランスを実現
sampleコードのホットスポット・サンプリングを有効にする追加の設定
semirefsjava.lang.ref.Reference objectsとそのサブクラスをデバッグするための追加の設定

実行例

  • メモリーテンプレートで5分間、JFR記録開始
    jrcmd <PID> start_flightrecording duration=5m settings=memory filename=`pwd`/`date +%H%M%S`.jfr
  • JFRの取得
     jrcmd <PID> dump_flightrecording recording="0" copy_to_file=`pwd`/`date +%H%M%S`.jfr
  • JFRの記録を停止
    jrcmd <PID> stop_flightrecording id="4"
  • 起動時にJFRのテンプレートを適用
    startWebLogic.sh 内の JAVA_OPTIONS に 以下のパラメータを追加(下記例では、デフォルトテンプレートと、メモリーテンプレートの両方を適用している)
    -XX:FlightRecorderOptions=defaultrecording=true,settings=default,settings=memory
    パラメータ説明
    -XX:[+-]FlightRecorderJFRの記録を有効(+)または無効(-)にする。デフォルトは有効
    -XX:FlightRecorderOptionsJFRのパラメータを指定する。,区切りで複数指定可能。JFRの記録が有効になっている必要がある
    JFRのパラメータ説明
    defaultrecordingバックグラウンドの記録、有効/無効
    diskJFRをDISKに書き込むか
    maxageDISKに記録する最大期間(分)、disk書き込みが有効になってる必要がある
    settingsJFRの記録ロケーション(default、memoryなど)を指定。記録ロケーションはsettingパラメータ参照

JFR

JRockit Mission Control

グラフィカルにJFRの解析を可能にするツール。
元々はJRockit用のツールだったが、 Java 7 Update 40 から、Mission ControlとFlight Recorder が同梱されるようになった。

-- 事前にヒープメモリを確保して起動する(容量大きいJFR読み込む場合は大量のヒープが必要な為)
jrmc.exe -J-Xmx4g -J-Xms4g
※ 起動したら、ファイルからJFRを読み込む。4g指定は、64bit版でしか指定できな

確認項目

左メニュー概要確認できるもの
全般概要メモリ使用率やCPU使用率など全体統計
システムJRockitやOSの環境情報
メモリ概要メモリ使用率の統計グラフ
GC全般GC処理の統計
GCグラフGC休止時間やGC理由など
割り当てメモリ割り当てが大きいクラスや、サイズ順にソートした情報
GC発生直前で急に増加したクラスがないか、同じ間隔だがサンプルカウントが急増してないかなどの観点で確認
ヒープ内容ヒープ使用量と断片化状況
オブジェクト統計クラスタにで格納されているオブジェクト数とメモリ使用量の増加
コード概要頻繁に呼ばれているメソッドに該当するクラスとパッケージ
ホット・メソッド頻繁に使用されているメソッド
例外発生した例外
コード生成JITコンパイルや指摘かのコンパイル対象となったメソッド
CPU/
スレッド数
概要CPU使用率とスレッド数の統計
競合ロック競合の統計
ホット・メソッド頻繁に使用されているメソッド
待機時間待機の種類とスタック
ロックプロファイリングJavaレベルのロック競合などの統計
イベント概要JFR記録で取得されたイベント
ログ各イベントの詳細情報
グラフスレッド単位でのイベント発生する時間をグラフ形式で表示
スレッドスレッド別のイベント数
トレースイベントが発生した処理スタック
ヒストグラム任意項目別でのイベント数
 

WLST(WebLogic Server Scripting Tool)

java -cp クラスパスを指定 weblogic.WLST
wls:/offline> プロンプトになるので各種コマンド実行


 

Webサーバープラグイン

モジュールのコピー

以下どちらかのpluginを、/etc/httpd/modules にコピーする

$WLS_HOME/server/plugin/linux/`uname -m`/mod_wl_22.so     ※通常強度の暗号化
$WLS_HOME/server/plugin/linux/`uname -m`/mod_wl128_22.so ※128bitでの暗号化

httpd.conf の書き換え

# モジュールを読み込む
LoadModule mod_wl_22.so modules/mod_wl_22.so
# 転送するWebLogicサーバの情報
<IfModule mod_weblogic.c>
  WebLogicHost wls.com
  WebLogicPort 7002
</IfModule>
# 転送するWebLogicサーバ(クラスターの場合)
<IfModule mod_weblogic.c>
  WebLogicCluster wls1.com:7002,wls2.com:7002,wls3.com:7002
</IfModule>
# URLパターンでの転送
<Location /weblogic>
  SetHandler weblogic-handler
  PathTrim /webapps
</Location>
# MIMEタイプでの転送
<IfModule mod_weblogic.c>
  WebLogicHost wls.com
  WebLogicPort 7002
  MatchExpression *.do
</IfModule>
# MIMEタイプでの転送(複数パターン)
<IfModule mod_weblogic.c>
  MatchExpression *.do WebLogicHost=wls1.com|ebLogicPort=7002
  MatchExpression *.jsp WebLogicHost=wls2.com|ebLogicPort=7002
  MatchExpression /webapps/*.do WebLogicHost=wls3.com|ebLogicPort=7002
  MatchExpression * WebLogicCluster=wls1.com:7002,wls2.com:7002,wls3.com:7002
</IfModule>
パラメータ説明
PathTrim指定したURL(正規表現可)を転送の時に削除する。http://192.168.11.16/webapps/hellohttp://192.168.11.16/hello
PathPrepend指定したURL(正規表現可)を転送の時に追加する。http://192.168.11.16/hellohttp://192.168.11.16/webapps/hello


 

サーバーのライフサイクル

状態説明
SHUTDOWNサーバー停止状態
STANDBY起動する為の初期化が完了し、起動するのを待ってる状態。LISTENポートは閉じられている為、リクエストは受け付けない
ADMIN管理ユーザーからのリクエストのみ受け付ける状態
管理権限を持つユーザの管理コンソール操作やアプリケーションを実行するリクエストのみ受け付ける
RUNNING状態の時に「中断」の操作で移行できる
RUNNING正常起動状態。ADMIN状態の時に「再開」の操作で移行できる
FAILED障害を検知した状態。自動的にADMINまたはSHUTDOWNになる


 

トラブルシューティング

ログ

$DOMAIN_HOME/<ドメイン名>/servers/<サーバ名>/logs/
/u01/oracle/user_projects/domains/base_domain/servers/admin/logs/
ログ説明
サーバーログ
<サーバ名>.log
Weblogicの動作ログ。各サーバーのログフォルダに存在する
[ドメイン構造] - [環境] - [サーバ] ⇒ 対象のサーバを選択。「ロギング」タブの「全般」で設定
ドメインログ
<ドメイン名>.log
管理サーバのログフォルダに存在し、ドメイン内のサーバログから重要なメッセージを抜粋した内容のログ
[ドメイン構造] - [ドメイン名]を選択。「ロギング」タブで設定
「ログ・フィルタ」タブでドメインログに転送するログをフィルタさせることが可能
コンソールログJavaVMが出力するログ。(Weblogicサーバを起動した時に標準出力されるログ)
ハングアップや、Out-of-Memoryなどの障害時に必要なログ。
$DOMAIN_HOME/<ドメイン名>/bin/配下の起動スクリプトで、WLS_REDIRECT_LOG 環境変数にログファイル名を記載する
export LOG_PATH="/u01/oracle/user_projects/domains/base_domain/servers/${SERVER_NAME}/logs"
export WLS_REDIRECT_LOG="${LOG_PATH}/console.log"
HTTPアクセスログ
access.log
Weblogicへのアクセスログ。
[ドメイン構造] - [環境] - [サーバ] ⇒ 対象のサーバを選択。「ロギング」タブの「HTTP」で設定
バッファ(8kb?)に溜め込んでから出力される。トランザクション処理時間を知りたい場合は拡張ロギングフォーマットに変更し time-taken フォーマットを追加すること
  • access.logをリアルタイム出力させる方法
    config.xml の <web-server-log>要素に <buffer-size-kb> を 0 に指定する
    <server>
      <name>srv1</name>
      <listen-port>7002</listen-port>
      <web-server>
        <web-server-log>
          <buffer-size-kb>0</buffer-size-kb> ★バッファーを利用しない設定を追加する
          <elf-fields>date time cs-method cs-uri sc-status time-taken</elf-fields>
          <log-file-format>extended</log-file-format>
        </web-server-log>
      </web-server>


CLASSPATH確認方法

java.lang.NoClassDefFoundError の後に出力されたクラスは、そのクラスへアクセスできないことを示している。
そのクラスへのパスが通っているか確認する必要がある為、CLASSPATHを確認する。
サーバーログ内のWebLogic起動時に出力される<BEA-141187> <Javaシステム・プロパティは〜 java.class.path = 〜 で確認可能。

 

トップ   編集 凍結解除 差分 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2017-02-18 (土) 19:50:37 (2617d)