2013年10月10日木曜日

WebSphere 8.5 の Windows Service 化

WebSphere8.5 Network Deployment を 完全 Windows Service 化

はじめに:

JBoss AS 7 を Windows Service 化 に続き、WebSphere 8.5 Network Deployment の Node Agent と Application Server を Windows Service 化 してみます
更に、Windows サービス化した後に、Windows の SC コマンドを使って、Application ServerサービスとNode Agentサービスとの間に依存性(Depend)の設定をし、Windows OSを起動した時に、自動的に正しい順番でNode AgentとApplication serverが起動してくるようにしたいと思います

前提条件:

  • Windows OSは、Windows 2008 Server R2 64-bit
    Websphere8.5は、D:\app\IBM\WebSphere\AppServerにインストールされている
  • Profileは、AppSrv01でセットアップされていて、AppSrv01のNode Agentはnodeagentという名前でセットアップ済み (D:\app\IBM\WebSphere\AppServer\profiles\AppSrv01)
  • このnodeagent配下でserver1, server2, server3という3のApplication Serverが稼働している

Websphere8.5 インストール フォルダ構成の概要:

D:\app\IBM\WebSphere\AppServer\
+---bin
|       WASService.exe     [*1]
|
+---profiles
    +---AppSrv01
    |   +---servers     [*2]
    |       +---nodeagent

    |       +---server1
    |       +---server2
    |       +---server3
    |
    +---Dmgr01
        +---servers
            +---dmgr     [*3]
[*1] Windowsサービス化に使用するWebsphereのコマンド
[*2] 今回Windowsサービス化する対象となる、ノードエージェント(nodeagent)とアプリケーションサーバーたち(server1, server2, server3) がインストールされている場所
[*3] Deployment manager(dmgr)のインストール場所 (Deployment ManagerはWebsphere 8.5をインストール時に自動的にWindowsサービス化されています)

A. Windowsサービス化の手順:

1. まずはコマンドプロンプトを開き、WASService.exe がある D:\app\IBM\WebSphere\AppServer\にcd
cd D:\app\IBM\WebSphere\AppServer
2. ノードエージェント(nodeagent) をWindowsサービス化
WASService.exe -add "Node Agent" -serverName nodeagent -profilePath D:\app\IBM\WebSphere\AppServer\profiles\AppSrv01 -wasHome D:\app\IBM\WebSphere\AppServer -logRoot D:\app\IBM\WebSphere\AppServer\logs\manageprofiles\AppSrv01 -logFile D:\app\IBM\WebSphere\AppServer\logs\manageprofiles\AppSrv01\nodeagent_startServer.log -restart true -startType automatic
[※ WASService.exe のオプションについて]
  • addオプションで指定した文字列に "IBMWAS85Service - " を付けたものが、登録されるWindows サービス名になります 
  • serverNameオプションはApplication Serverの名前を指定してください 
  • logRootとlogFileは、Windowsサービス登録時やサービス開始・停止時のログになりますログの場所はWebsphereのマニュアルの場所を踏襲して、今回はそれぞれ次のようにしました
logRootは、D:\app\IBM\WebSphere\AppServer\logs\manageprofiles\AppSrv01

logFileは、<Application Server名>__startServer.log 

3. Application Server(server1) をWindowsサービス化
WASService.exe -add "Server1" -serverName server1 -profilePath D:\app\IBM\WebSphere\AppServer\profiles\AppSrv01 -wasHome D:\app\IBM\WebSphere\AppServer -logRoot D:\app\IBM\WebSphere\AppServer\logs\manageprofiles\AppSrv01 -logFile D:\app\IBM\WebSphere\AppServer\logs\manageprofiles\AppSrv01\server1_startServer.log -restart true -startType automatic
4. 残り2つのApplication Server(server2, server3) をWindowsサービス化
WASService.exe -add "Server2" -serverName server2 -profilePath D:\app\IBM\WebSphere\AppServer\profiles\AppSrv01 -wasHome D:\app\IBM\WebSphere\AppServer -logRoot D:\app\IBM\WebSphere\AppServer\logs\manageprofiles\AppSrv01 -logFile D:\app\IBM\WebSphere\AppServer\logs\manageprofiles\AppSrv01\server2_startServer.log -restart true -startType automatic
WASService.exe -add "Server3" -serverName server3 -profilePath D:\app\IBM\WebSphere\AppServer\profiles\AppSrv01 -wasHome D:\app\IBM\WebSphere\AppServer -logRoot D:\app\IBM\WebSphere\AppServer\logs\manageprofiles\AppSrv01 -logFile D:\app\IBM\WebSphere\AppServer\logs\manageprofiles\AppSrv01\server3_startServer.log -restart true -startType automatic

 この結果、4つのWindowsサービスが登録されていることが確認できれば成功です
IBMWAS85Service - Node Agent
IBMWAS85Service - Server1
IBMWAS85Service - Server2
IBMWAS85Service - Server3
Windowsサービスのリストから確認する場合は、それぞれ次のようにDisplay Nameでリストに表示されていると思います
IBM WebSphere Application Server V8.5 - Node Agent
IBM WebSphere Application Server V8.5 - Server1
IBM WebSphere Application Server V8.5 - Server2
IBM WebSphere Application Server V8.5 - Server3

 

B. Windowsサービス起動順の設定: 

Windows サービスへの登録が確認できたら、サービスの起動順を設定します。
Node Agentを先に起動してからApplication Serverを起動してくるように起動順序を設定します。
起動順を設定しておかないと、OS再起動時にNode AgentとApplication Serverのサービス起動がが同時に開始されてしまっては、Application Serverが正常に起動してきませんね。


1. コマンドプロンプトを開きます(カレントディレクトリはどこでもOKです)
2. Windowsのsc.exeコマンドから、server1のWindowsサービスをnodeagentのWindowsサービスに依存させる
SC config "IBMWAS85Service - Server1" depend= "IBMWAS85Service - Node Agent"
※ depend=の後には、スペースを入れる必要がありますのでご注意を!

3. server2、server3のWindowsサービスも同様に、nodeagentのWindowsサービスに依存させる
SC config "IBMWAS85Service - Server2" depend= "IBMWAS85Service - Node Agent"
SC config "IBMWAS85Service - Server3" depend= "IBMWAS85Service - Node Agent"


※ もう一回、depend=の後には、スペースを入れる必要がありますのでご注意を!

依存関係の設定が完了したらサービスプロパティで確認しましょう

  • IBMWAS85Service - Server1のプロパティ
Server1はNode Agentに依存している(Server1を起動するためには、Node AgentのWindowsサービスが起動している必要がある)ことを確認できます。
Server2、Server3のプロパティも同様に確認してみましょう


  • IBMWAS85Service - Node Agentのプロパティ





反対にNode Agentのプロパティでは、Node AgentがServer1, Server2、Server3を起動するための前提条件となっていることが確認できます。

稼働確認項目: 

最後に稼働確認して、完了です。
  • IBMWAS85Service - Node Agent が起動できること
  • IBMWAS85Service - Server1 が起動できること (この時Node Agentサービスが停止している場合、Node Agentサービスを起動してから、Server1サービスが起動してくること)
  • IBMWAS85Service - Server2 が起動できること (この時Node Agentサービスが停止している場合、Node Agentサービスを起動してから、Server2サービスが起動してくること)
  • IBMWAS85Service - Server3 が起動できること (この時Node Agentサービスが停止している場合、Node Agentサービスを起動してから、Server3サービスが起動してくること)
  • IBMWAS85Service - Node Agent を停止できること (このときServer1, 2, 3のサービスが起動している場合、これらのサービスを停止した後にNode Agentサービスが停止すること)
  • OSを再起動してNode Agent、Server1, 2, 3のサービスがすべて自動的に開始される

お疲れ様でしたー



2013年10月4日金曜日

Oracle Enterprise Manager (OracleDBConsole) がアクセスできない!? 原因解明編



あれから半年:

Oracle Enterprise Manager (OracleDBConsole) がアクセスできない!?
え?IEだと見れない? じゃあFireFoxでアクセスするかね

という 3時間を無駄にした日 から約半年。。。



理由が分かった:

Windowsの更新プログラムによりセキュリティ強化が図られたことが理由だった。

1024 ビット未満の暗号キーをブロックする更新プログラム(起源KB: 2661254) を適用すると、Windows レジストリにEnableWeakSignatureFlags が付与され、これが1024 ビット未満のRSA鍵を利用した証明書を無効としていたことが判明しました。
一方で私の環境はと言えば、、、OEMはテストDBということもあり、証明書のファイルサイズはデフォルトである 512bit のままであった。 よって無効な証明書として、間違いなく通信をブロックされてしまっていた。


FireFoxで問題なく閲覧できていたのは、おそらくこのレジストリの設定を使用していないためだったのでしょう。

で、やったこと:

暫定的な回避策としては、クライアント(つまりIEでOEMにアクセスしたいマシン上)でcertutil -setreg コマンドを実行し、EnableWeakSignatureFlagsのレジストリを変更
コマンドプロンプトから普通に実行した例:
c:\> certutil -setreg chain\EnableWeakSignatureFlags 8
c:\>certutil -setreg chain\EnableWeakSignatureFlags 8
Software\Microsoft\Cryptography\OID\EncodingType 0\CertDllCreateCertificateChainEngine\Config\EnableWeakSignatureFlags:

新しい値:
  EnableWeakSignatureFlags REG_DWORD = 8
CertUtil: -setreg コマンドは正常に完了しました。
変更を有効にするには、CertSvc サービスを再起動しなければなりません。
実行後、IEを再起動してください


でもほんとうは。。。:

今回の方法は、本当の意味での解決ではないですね
証明書をもっとセキュアにするのが良いでしょうね




参考URL:

Microsoft Support: セキュリティアドバイザリ
TechNet:




2013年9月20日金曜日

Eclipse IDE for JBoss AS 7 - Hello world Quick Start

Eclipse IDE for JBoss AS 7 - Hello world Quick Start

 

目的:

EclipseでJBoss AS 7用のJavaEE開発環境を構築する

ついでにhello worldサンプルプロジェクトをDeployしてみる

 

準備するもの:

  • JDK (JDK 7) 

    http://www.oracle.com/technetwork/java/javase/downloads/index.html
  • JBoss (AS 7.1.1 Final) 

    http://www.jboss.org/jbossas/downloads/
  • Eclipse IDE for Java EE Developers (Kepler) 

    http://www.eclipse.org/downloads/index-developer.php
  • Determination (断固たる決意)

 

手順:

 1. 開発環境の構築

 ※今回はすべてを一つのマシンに入れています


  1-1. JDK1.7 をインストール

C:\Program Files\Java\jdk1.7.0_25

  1-2. JBoss7.1.1 をインストール

C:\jboss-as-7.1.1.Final

  1-3. Eclipse Kepler をインストール

C:\eclipse-jee-kepler-R-win32-x86_64\eclipse

  1-4. Eclipseを起動

  • Workspace は、C:\eclipse-jee-kepler-R-win32-x86_64\eclipse\workspace としています
  • JBOSS Tools (Kepler) をEclipse Marketplace...からインストールします
    • Eclipse Marketplaceにアクセス (Help --> Eclipse Marketplace...)
 

    •  Eclipse Marketplace から JBoss Tools (Kepler) をインストール
Eclipse MarketplaceウィンドウのSearchタブから "JBoss Tools"を検索します。
※ 検索条件の3つのBoxには、左のものから、それぞれ下記の通り指定すると見つけやすいでしょう
        • JBoss Tools
        • Tools
        • J2EE Development Platform
Goボタンを押すと、歴代のJBoss Toolsが検索されます。
JBoss Tools (Kepler) の Installボタンを押して、インストールを実行します

    •  JBoss Tools (Kepler) Featuresの選択画面
 
Featureを、すべて選択するとDownload/Installに結構時間が掛かりますので、必要に応じて取捨選択してください。 
選択後、Confirmボタンを押し、Review Licensesを (よく読んで) Acceptして、Installを開始します

Install後、Eclipseを再起動します

  • JBOSS AS 7のセットアップ
    • Select a wizard
 File --> New --> Others で “Select a wizard”を開く 
Serverを選択してNext

    • Define a New Server
“Define a New Server”で“JBoss AS 7.1”を選択します 
今回はServer’s host name, Server NameはDefaultを採用しています
 
    • JBoss Runtime
      • ホーム・ディレクトリーはJBoss AS 7をインストールした C:\jboss-as-7.1.1.Final
      • JREにはプルダウンからjre7を選択(jre7というエントリーはJDK1.7をインストールする際に併せてインストールされたJREの場所で、これはEclipseが自動的に登録してくれています)

Finishを押して、ServerをEclipseに登録します

  • JBoss AS 7の起動
    • Server tabにJBoss AS 7が現れる

JBoss AS 7 Runtime の Eclipe IDE への登録が完了すると、EclipseのServer Tabに “JBoss 7.1 Runtime Server” が現れます。
“JBoss 7.1 Runtime Server”を右クリックして “Start”を実行するとJBossが起動します

(※もしServer Tabがない場合は、Window --> Open Perspective --> Others …からJava EE (default)を選択してみてください)

起動が終わったら、また Server タブの “JBoss 7.1 Runtime Server”を右クリックして “Show In --> Web Browser”をクリックします

  •  JBoss AS 7の稼働確認
    • Eclipse Embedded Web Browser
“JBoss 7.1 Runtime Server”を右クリックして “Show In --> Web Browser”をクリックして、 こんな画面が出てきたら、JBossの起動は完了です


これで開発環境は整いました、せっかくなのでhellowordのSample Web ApplicationをDeployしてみましょう!

 

 2. Sample Web Application (Hello World) を Deploy

  2-1. Hello World ProjectをDownload、Eclipseに取り込む

  • JBoss Central サイトを開く
    • JBoss Central サイト

JBoss Central のアイコン をクリック CommunityサイトをEclipse IDE環境上で開きます
Start from a sampleからWeb Applicationsを選択して、helloworldのリンクをクリックします。
自動的にhelloworldサンプルプロジェクトのDownloadが開始され 新規プロジェクトファイル ダイアログがでますので、プロジェクトファイルをDownloadおよびEclipse IDE環境に取り込みます 
(※ Maven Project など必要な Tool も自動的に取り込まれます)

  2-2. Hello World Project を起動

サンプルプロジェクトを取り込むと左のパンに “jboss-as-helloworld”が現れます(Hello WorldプロジェクトがEclipseで開かれた状態です)
    • Eclipseで開かれた、Hello Worldプロジェクト
 “jboss-as-helloworld”を右クリックして “Run As --> Run on Server" を選択
サーバーにはJBoss 7.1 Runtime Serverを選択して Finish します

  2-3. Hello World の稼働確認

    •  http://localhost:8080/jboss-as-helloworld/HelloWorld

http://localhost:8080/jboss-as-helloworld/HelloWorld
にアクセスして Hello World! が出てくれば Deploy 成功です


以上です、お疲れ様でした!

それでは、楽しいJava EEライフを!








参考にしたサイト:

https://docs.jboss.org/author/display/AS7/Helloworld+quickstart
http://www.jboss.org/jdf/examples/get-started/



2013年9月19日木曜日

Websphere8.5 - How to delete a profile

Websphere8.5のサーバープロファイルの削除方法


8.5に限っての話ではないですが、Profileを作成することはWebsphere Customization Toolboxから簡単にできますが、削除というのはコマンドライン(manageprofile)から実行するしかないようですね。


例:

  • Websphere8.5 Network Developmentは、D:\app\IBM\WebSphere\AppServerにインストールされているとする(つまり install_root=D:\app\IBM\WebSphere\AppServer ということ)

  • そして、AppSrv01という名前のプロファイルを削除したいとする





手順:

  1. AppSrv01のプロセスが停止していることを確認する

  2. コマンドプロンプトを開き、%Install_root%¥binまでcdする

  3. っy下記のように manageprofile コマンドを実行


 manageprofiles -delete -profileName AppSrv01 

実際の実行結果:


D:\app\IBM\WebSphere\AppServer\bin>manageprofiles -delete -profileName AppSrv01
INSTCONFSUCCESS: Success: The profile no longer exists.




参考資料:

 "WebSphere Application Server V8: Administration and Configuration Guide" p161~



2013年6月20日木曜日

JBoss AS 7 を Windows Service 化

はじめに:

今回は JBoss5用の "JBoss Web Native Connectors" を流用して、JBoss AS 7 の Windows サービス化 します。

前提条件:

・ JBoss バージョンは Windows x64用です(当たり前か。。。)
・ JBoss AS 7 は、D:\JBoss\jboss-as-7.1.1.Final にインストールされている



サービス化手順:

1. JBoss Web Native Connectors を Download

http://www.jboss.org/jbossweb/downloads/jboss-native-2-0-9.html

今回は前提条件にあるようにWindows x64なので、binaries 2.0.9-windows (x64) を選択します、すると、jboss-native-2.0.9-windows-x64-ssl.zip をDownloadすることになります

 2. jboss-native-2.0.9-windows-x64-ssl.zipをUnzip

Unzipすると以下のようなフォルダ構成で解凍されます。
下の例では D:\JBOSS\JBOSS-NATIVE-2.0.9-WINDOWS-X64-SSLにUnzipしています

 D:\JBOSS\JBOSS-NATIVE-2.0.9-WINDOWS-X64-SSL
├───bin
│   │   jbosssvc.exe
│   │   jbossweb.x64.exe
│   │   jbosswebw.x64.exe
│   │   README-service.txt
│   │   service.bat
│   │
│   └───native
└───licenses

3. UnzipしたbinとlicensesフォルダをJBossのインストールフォルダに置きます

(念のため、インストールフォルダはバックアップを取っておいた方がいいですね。)
結果、JBossのインストールフォルダ構成はこんな感じになります 。

D:\JBOSS\JBOSS-AS-7.1.1.FINAL
├───appclient
├───bin
│   │   jbosssvc.exe
│   │   jbossweb.x64.exe
│   │   jbosswebw.x64.exe
│   │   service.bat

│   │   README-service.txt
│   │   run.bat
│   │   standalone.bat
│   ├───client
│   ├───init.d
│   ├───logs
│   └───native
├───bundles
├───docs
├───domain
├───licenses
├───modules
├───standalone
└───welcome-content

赤字のフォルダ・ファイルが置かれたものです、ほかは既存のファイルです。

4. service.batを編集します(重要!

===service.bat ========================

20行目|     set SVCNAME=JBAS71SVC
21行目|     set SVCDISP=JBoss AS 7.1.1.Final
22行目|     set SVCDESC=JBoss AS 7.1.1.Final: Windows x64
84行目|     REM call shutdown -S < .s.lock >> shutdown.log 2>&1
94行目|     REM call shutdown -S < .s.lock >> shutdown.log 2>&1


=====================================

service.batをテキストエディタで開き、次の5行を編集します
20, 21, 22行目はService ID, Name, Descriptionなので、他のWindows Serviceと重複しない適当な文字列に変えてあげればいいのです。それに、そのままだと、JBoss5の名前になっているので、気持ち悪いですし。

それよりも、84、94行目のコメントアウトは重要です。
思いっきり、WindowsのShutdownコマンドをCallしています、このままREMを付けずにJBossをWindows Serviceに登録してしまうと、サービスを停止したときにWindowsもろともShutdownしてしまいます!

5. run.batを編集する

run.batをテキストエディタで開き、echo.から始まる行(7行)をガッツリ削除します。
そして、 standalone.batをCallするように下のように追加します。

===service.bat ========================

@ECHO OFF
REM Placeholder for people used to run.bat from older version redirecting them to read the readme
set JAVA_HOME=D:\Java\jdk1.7.0_21
call D:\JBoss\jboss-as-7.1.1.Final\bin\standalone.bat -b 0.0.0.0 -bmanagement=0.0.0.0

=====================================

JAVA_HOMEや、-bオプションや-bmanagementオプションの値は、環境に合わせて適切な値に変更してくださいね

6. Service登録

コマンドプロンプトを開きます。(Windows 2008やWindows 7の場合は管理者として開いてください)。
JBossのbinに移動してservice.batを実行します

D:\JBoss\jboss-as-7.1.1.Final\bin>service.bat install
Installed JBAS71SVC
Service JBoss Application Server 7.1.1.Final installed


以上でサービス化完了。





2013年6月19日水曜日

JBoss7 管理コンソール を有効にする方法



JBoss AS 7 は起動が断然速くなりましたね、でもアプリ構成が大きく変わり、まだなじめません。 起動バッチも、run.batからstandalone.batに変わったりして。

でも相変わらずセットアップは簡単だったので、さくっと起動して、管理コンソール でも覗いて見てみようかと思ったら、エラーが。。。

ということで、今回は JBoss AS 7 の 管理コンソール (以下 management console ) 起動方法ということで。。。



このエラーにピンときたら:

デフォルトの状態だと、JBoss 起動後に Management Console の Web Page (port:9990) にアクセスしようとすると


Unable to redirect.
It is not possible to redirect to the console, please contact the system administrator for the correct address to access the console.

と出てしまいます。

対策:

この場合は、AS起動時に -bmanagement で Management ConsoleがListenするIPを与えてやる必要があります。 ちなみに、-b オプションは、前と変わらず AS本体(デフォルトだと8080ポート)をListenするIPになります
standalone.bat -b 0.0.0.0 -bmanagement=0.0.0.0
* 0.0.0.0 は、すべてのNetwork Interface (NIC) のアドレスでリスエストを受け付けるようになります

おまけ(その1):

Management Consoleにアクセスできるようなったら、管理ユーザーでのログインを求められます。 ユーザー作成がまだであれば、コマンドプロンプトから、add-user.batを実行して、管理ユーザーを作ってあげましょう。
D:\JBoss\jboss-as-7.1.1.Final\bin>set JAVA_HOME=D:\Java\jdk1.7.0_21
D:\JBoss\jboss-as-7.1.1.Final\bin>add-user.bat

What type of user do you wish to add?
 a) Management User (mgmt-users.properties)
 b) Application User (application-users.properties)
(a):

Enter the details of the new user to add.
Realm (ManagementRealm) :
Username (myNewUser) : jbossadmin
Password :
Re-enter Password :
About to add user 'jbossadmin' for realm 'ManagementRealm'
Is this correct yes/no? yes
Added user 'jbossadmin' to file 'D:\JBoss\jboss-as-7.1.1.Final\standalone\configuration\mgmt-users.properties'
Added user 'jbossadmin' to file 'D:\JBoss\jboss-as-7.1.1.Final\domain\configuration\mgmt-users.properties'
Press any key to continue . . .
注: JDKは、"D:\Java\jdk1.7.0_21" に、JBossは、"D:\JBoss\jboss-as-7.1.1.Final" にインストールされている前提です

おまけ(その2):

過去ログで紹介した起動用バッチのように、例えば 下のような Start_JBossAS7.bat などを準備するのも、手かと。。。  JDKは、"D:\Java\jdk1.7.0_21" に、JBossは、"D:\JBoss\jboss-as-7.1.1.Final" にインストールされている前提です。

===例: Start_JBossAS7.bat ======


set JAVA_HOME=D:\Java\jdk1.7.0_21
call D:\JBoss\jboss-as-7.1.1.Final\bin\standalone.bat -b 0.0.0.0 -bmanagement=0.0.0.0

==============================




さーて、APデプロイして、Web連携や、クラスタリング、などをトライしてみますかね。




2013年6月18日火曜日

ESXi で netstat 相当のコマンド (esxcli)


# esxcli network connection list

esxcli で相手先のアドレスと使用ポートと遷移状態が確認できる




2013年6月10日月曜日

ApacheとJBOSSの連携 - その2 - Apache/JBossの設定


前回、「ApacheとJBOSSの連携 - その1 mod_jk.so の入手方法」でmod_jk.soの準備ができたら、ApacheとJBossのセットアップです。

前提条件:



  • ApacheはD:\app\Apache2.2にインストール済み (Versionは2.2.22)
  • JBOSSはD:\app\jboss-5.1.0.GA-jdk6\jboss-5.1.0.GAにインストール済み (Versionは5.1.0GA-jdk6)
  • Apache, JBOSSは同じマシン上にインストールされている(Windows 2008)
  • ApacheとJBOSSはTomcat Connector (mod_jk.so)で連携
  • Apacheと連携させるWeb Application はJBossの管理アプリケーションであるweb-console, admin-console, jmx-console とする

目的:

ユーザーがWeb Application Serverに8080ポートでアクセスしている状態(いわゆる直アクセス)であるところを、Front End HTTPサーバーとしてApacheを立ててWell known Portである80番ポートでアクセスできるようにしてあげる。

図で表すと、こういう状態を
このようにします。


手順:


Apache側のセットアップ 


セットアップの概要はこんな感じ




1. conf/httpd.confを修正


ファイルの最下行に、次のInclude Statement 1行を追加

Include conf/mod_jk.conf

*Apacheに「mod_jkを使うよ、詳しくはconf/mod_jk.confを見てね」と言っている

2. conf/mod_jk.confを作成


メモ帳を開き、次の6行をコピペして、mod_jk.confファイルとして保存、confフォルダの下に置く

LoadModule jk_module modules/mod_jk.so
JkWorkersFile conf/workers.properties
JkLogFile logs/mod_jk.log
JkMount /admin-console/* node1
JkMount /jmx-console/* node1
JkMount /web-console/* node1


ステップ1の[Include]の設定で、Apacheはこのファイルを見に来る。

まず、ここではApacheにロードしてもらいたいmod_jk.soモジュールの場所を伝え[LoadModule]、mod_jk.soモジュールに関するログを出力するファイルの場所を指定している[JkLogFile]。

ユーザーからのHTTPリクエストのURLに/admin-console/、/jmx-console/、/web-console/が入っている場合にnode1 (worker) にリクエストを転送するよう指示している[JkMount]。Apacheはリクエストをnode1に転送すれば良いことは理解できたがnode1は何処か? 転送先情報はまだ知らない。

node1の転送先情報は、[JkWorkersFile] で指定されたconf/workers.propertiesで定義されているので、次にconf/workers.propertiesのファイルを見に行く。

3. conf/workers.propertiesを作成


メモ帳を開き、次の5行をコピペして、workers.propertiesとして保存、confフォルダの下に置く

worker.list=node1
worker.node1.port=8009
worker.node1.host=server1
worker.node1.type=ajp13


ステップ2の[JkWorkersFile]の設定で、Apacheは転送先情報を知るためこのファイルを見に来る。

workers.propertiesファイルでは、node1という名前のWorkerはここで定義されていて[worker.list]、node1のHost名(またはIP)、ポート番号とタイプが定義されている[worker.node1.port], [worker.node1.host], [worker.node1.type]。


4. mod_jk.soをApacheサイトからDownloadしてmodulesフォルダに置く


mod_jk.soのDownload方法は前回の ApacheとJBOSSの連携 - その1 mod_jk.so の入手方法 を参照。



JBOSS側のセットアップ


JBOSS起動用バッチ(run.bat) にbオプションでJBOSSがListenするアドレスを指定(ホスト名もしくはIP)しておく。 (今回は、run.bat -b 0.0.0.0 と設定している、0.0.0.0は、server1上のすべてのNetwork Interface (NIC) のアドレスでJBossはリスエストを受け付けるようになる)

オプション付きでJBossを起動する方法として、過去紹介したように起動用バッチを準備したり、下の例のようにrun.batのショートカットを作成して、プロパティで-bオプションをつけてやる方法がある。




Apache/JBOSSを起動と動作確認


以上の設定が終わったら、Apache/JBOSSを起動する。 下記URLがちゃんと表示されたら設定完了(server1の部分は実際のサーバーホスト名に変更してください)。

http://server1/admin-console/
http://server1/jmx-console/
http://server1/web-console/


最後に:


今回はHTTP(Apache)とWeb Application Server(JBoss)が同じマシンにある場合の設定方法を紹介したが、下図のようにserver1, server2と別々のマシンに別れている場合は、workers.propertiesのnode1.hostを変えてやれば良い。









2013年6月7日金曜日

ApacheとJBOSSの連携 - その1 - mod_jk.so の入手方法

今回は、ApacheとJBOSSの連携 その1 として、手始めに(そして、ちょっと丁寧に)
mod_jk.so の入手方法をまとめてみる。

前提条件

  • ApacheはD:\app\Apache2.2にインストール済み (Versionは2.2.22)
  • JBOSSはD:\app\jboss-5.1.0.GA-jdk6\jboss-5.1.0.GAにインストール済み (Versionは5.1.0GA-jdk6)
  • Apache, JBOSSは同じマシン上にインストールされている(Windows 2008)
  • ApacheとJBOSSはTomcat Connector (mod_jk.so)で連携

mod_jk.so の入手方法


 1. Apache - nearby FTP mirror siteにアクセス
   http://www.apache.org/ のDownloadリンクからアクセス
   またはURL ( http://www.apache.org/dyn/closer.cgi) から直接アクセス

 2. 最寄りのミラーサイトのリストから、いずかのサイトにアクセス

 3. ミラーサイトにアクセスできたら下記の順でディレクトリを辿る
   tomcat --> tomcat-connectors --> jk --> binaries --> windows

 4. 最新版のtomcat-connectorsから使用する環境に対応したものをDownloadする
  しかし、通常下のように7つのバージョンがあり、どのバージョンが選ぶべきかは
  ファイル名の意味を理解する必要がある

   (a) tomcat-connectors-1.2.37-windows-i386-httpd-2.0.x.zip
   (b) tomcat-connectors-1.2.37-windows-i386-httpd-2.2.x.zip
   (c) tomcat-connectors-1.2.37-windows-i386-httpd-2.4.x.zip
   (d) tomcat-connectors-1.2.37-windows-i386-iis.zip
   (e) tomcat-connectors-1.2.37-windows-i386-iplanet.zip
   (f) tomcat-connectors-1.2.37-windows-x86_64-httpd-2.4.x.zip
   (g) tomcat-connectors-1.2.37-windows-x86_64-iis.zip

   この場合:
  • 1.2.37はtomcat-connectorsのバージョン(大抵、最新の方が良い)
  • i386は32-bit Windows OSで、x86_64は64-bit Windows OS用 (XP, 7, 2003, 2008などは不問)
  • httpdはApache、iisはIIS、iplanetはNetscapeとの連携用であることを意味している
  • httpdはさらにApacheのバージョン毎 (2.0.x, 2.2.xと2.4.x) にBinaryが提供されている

   以上を踏まえると今回は「Windows 32-bit版Apache2.2.22」を使うので

     (b) tomcat-connectors-1.2.37-windows-i386-httpd-2.2.x.zip

   をDownloadするのが正解となる。


 5. tomcat-connectorsがDownloadできたらUnzipして、mod_jk.soをゲット。
  ApacheのModulesディレクトリに置いて準備完了


次回(ApacheとJBOSSの連携 - その2 - Apache/JBossの設定)に続く。。。

2013年3月28日木曜日

org.w3c.dom.Document の XML parse で Exception あるある


Double-Byteの文字が入っているXMLファイルをParseする際に良くある失敗

Invalid byte 1 of 1-byte UTF-8 sequence.


XMLにDouble-Byteが入っているなら、対応するEncodingを指定してあげましょう
上の例であれば、読み込み対象のXMLファイルのEncodingがUTF-8になっているはずなのでこれをShift-JISに変えます。

<?xml version="1.0" encoding="UTF-8"?> 
 -->
<?xml version="1.0" encoding="Shift-JIS"?>

そもそもDouble-Byteが入っているのにEncodingがUTF-8であるXMLファイルは、それ自体XMLファイルとしてFormatが成立していない訳なんですが、自分の場合は、強引にXMLファイルを作成するケースが多いので、なんども同じ過ちを繰り返してしまう。。。

あるよね~ (え?ないですか?)

2013年3月19日火曜日

Oracle Enterprise Manager (OracleDBConsole) がアクセスできない!?

背景:

ある日、突然 EM (Oracle Enterprise Manager) のWeb Consoleが使えなくなった

Internet Explorer ではこのページは表示できません


Windows Service "OracleDBConsole" は開始になってるし、%ORACLE_HOME%\sysman\log\emdb.nohupなどを確認しても問題なく動いているし。。。
でも、 https://hostname:1158/emにアクセスしようとすると、やっぱり

Internet Explorer ではこのページは表示できません


なんで?


やったこと: 

いちおうセオリーに則って。。。

1.Windows ServiceからEM ("OracleDBConsole") の再起動 --> 復旧せず

2.EMの再生成 --> 復旧せず
  •  emca -deconfig dbcontrol db -repos drop
  •  emca -config dbcontrol db -repos create
create 途中で、「'job_queue_processes' must be greater than or equal to 1.」と怒られたので、alter system set job_queue_processes=1 scope=both; でjob_queue_processesを1にしてみる、そういえばこの前この値を変更したわぁ、きっとこれが原因に違いないと思ったが、結局 create後も現象は復旧せず

3. そもそもEM自体は問題なく動いてたわけだし、1. 2.ともに解決策になるわけもないことを確認する。「Internet Explorer ではこのページは表示できません」という現象を考察し直す。 サーバーサイドエラー(500系)ではないので、ブラウザ側の設定の問題かも知れないと思う(今更ですが。。。)

4. 試しにFireFoxでアクセスしてみる -->動いた!(ていうか、そもそも動いてたー!)

5. そういえばIEを8に上げていたんだった

6.IE設定の問題かと思うけど、FireFoxを使うからいいや、ということで、とりあえずおしまい。ここまでで 3時間を無駄にした


まとめ:

IEだとページがロードできなかったので、FireFoxを使うことにした。
IEのSSLやTLSあたりの設定が原因かと思うが、今回は特定はできず。
追って確認する、します。 

原因解明:

原因が解明、Windows更新プログラムだったかー

暫定回避策を更新しました

2013年3月11日月曜日

@setlocal EnableDelayedExpansionの使い方

@setlocal EnableDelayedExpansionの使い方について


はじめに:

EnableDelayedExpansionは遅延環境変数を使用可能にするオプションです。
この設定が欲しくなるケースは恐らくその多くの場合、「For loop内で、loopが1巡する毎に異なる値を環境変数に設定したい時」だと思います。

以下説明は、「setlocal /?」と「cmd /?」のヘルプからの引用+自分なりに解釈した、環境変数遅延環境変数の違いです(たぶん合ってる、間違っていたらすみません。。。)

  • 環境変数は区切り文字として % を使います (例:%var%)
  • 遅延環境変数は区切り文字として ! を使います (例:!var!)
  • 環境変数はforループ中に値を変更することができません。forループが完了してからループ中最後に代入された値が入ります(途中で代入された値は無視されます)。 同様にLoopに入る前にすでに環境変数に値が入っている場合はLoop中は常にその値が維持されます、そしてLoopが完了した時点でLoop中最後に代入された値が反映されます。
  • 遅延環境変数はforループ中にsetで値を代入することができます。(<-- これが、いいですねー)

と、いきなり言われても結局どう使えるの?
ということで、遅延環境変数の使用例です



使用例:

ある複数行のテキストファイルがあり、For分で一行ずつ環境変数に読み込んでEchoでその環境変数を標準出力する。

手順:

  1. C:\temp\forというフォルダを作成
  2. EnableDE.bat(*1)をC:\temp\forに作成
  3. readFile.txt(*2)というファイルを準備(内容はなんでもいいんです)
  4. CMDを開いてC:\temp\forに移動(cdする)
  5. EnableDE.batを実行
5の実行結果、下のような結果が出てくれば成功です(!count!には行番号、!readline!は各行の文字列になります)

C:\Temp\for>EnableDE.bat
Line:1 This is a sample file to be read
Line:2 by "for" statement in test.bat.
Line:3 Each line to be set as a value
Line:4 of the environment varialble,
Line:5 "!readline!" and shown
Line:6 by echo !readline!.
Line:7 This requires
Line:8 "@setlocal EnableDelayedExpansion"
Line:9 enables setting each line to
Line:10 !readline! variable
Line:11 *EVEN* that's set sometime in "for" loop
Line:12 As default, otherwise, setting
Line:13 several values in a "for" loop
Line:14 wasn't allowed.




(*1)EnableDE.bat

=========================================
@echo off
@setlocal EnableDelayedExpansion
set count=
for /f "delims=" %%s in (C:\temp\for\readFile.txt) do (
 set /a COUNT+=1
 set readline=%%s
 echo Line^:!count! !readline!
)


(*2)readFile.txt

=========================================
 This is a sample file to be read
 by "for" statement in test.bat.

 Each line to be set as a value
 of the environment varialble,
 "^!readline^!" and shown
 by echo ^!readline^!.

 This requires
 "@setlocal EnableDelayedExpansion"
 enables setting each line to
 ^!readline^! variable
 *EVEN* that's set sometime in "for" loop
 As default, otherwise, setting
 several values in a "for" loop
 wasn't allowed.

ちなみに:

一方で、環境変数を使った場合はForループ内で値は変更されないことが分かります
気になる方は、DisabledDE.batをC:\temp\forで実行してみください

(*3)DisabledDE.bat

=========================================
 @echo off
set count=
for /f "delims=" %%s in (C:\temp\for\readFile.txt) do (
 set /a COUNT+=1
 set readline=%%s
 echo Line^:%count% %readline%
)

FOR 変数参照の置換(%~) の可能性を探る旅

ファイルの取扱いで痒いところに手が届かないイメージのあるDOSですが、for /? のHelpを見ると、それなりに使えるオプションが揃っています。
今回は、FOR 変数参照の置換(%~) の可能性を探る旅と称して、「DOS for文のツアー」を準備してみました。



旅準備:

test用のフォルダとファイルを準備します。 手作りでもいいですが、せっかくなので下の8行をコピーしてDOS窓にペーストして実行してみます。

if not exist C:\temp\for (mkdir C:\temp\for)
fsutil file createnew C:\temp\for\0kb.txt 0
fsutil file createnew C:\temp\for\1kb.txt 1024
fsutil file createnew C:\temp\for\10kb.txt 1024
if not exist C:\temp\for\sub (mkdir C:\temp\for\sub)
fsutil file createnew C:\temp\for\sub\0kb.txt 0
fsutil file createnew C:\temp\for\sub\5kb.txt 5120
fsutil file createnew C:\temp\for\sub\50kb.txt 51200


DOS窓からtreeで表示すると下記のような構成のフォルダになります
> tree /F /A C:\temp\for

C:\TEMP\FOR
|   0kb.txt
|   10kb.txt
|   1kb.txt
|
\---sub
        0kb.txt
        50kb.txt
        5kb.txt


test用のフォルダの準備ができたら、そのDOSをそのまま使っても結構なのでecho offします(for文の標準出力がうっとうしいので)
echo off


そして以下のfor文を実行してみましょう

for /F "delims=" %I in ('dir /S /B "C:\temp\for"') do (echo %I)

こんな結果が出たら旅の準備は完了です
C:\temp\for\0kb.txt
C:\temp\for\10kb.txt
C:\temp\for\1kb.txt
C:\temp\for\sub
C:\temp\for\sub\0kb.txt
C:\temp\for\sub\50kb.txt
C:\temp\for\sub\5kb.txt


いざ旅へ!:

さて、ここから旅の始まりです。「FOR 変数参照の置換オプション」を試してみましょう
はてさて、それぞれどんな結果になるでしょうか?
for /F "delims=" %I in ('dir /S /B "C:\temp\for"') do (echo %~fI)
for /F "delims=" %I in ('dir /S /B "C:\temp\for"') do (echo %~sI)
for /F "delims=" %I in ('dir /S /B "C:\temp\for"') do (echo %~aI)
for /F "delims=" %I in ('dir /S /B "C:\temp\for"') do (echo %~tI)
for /F "delims=" %I in ('dir /S /B "C:\temp\for"') do (echo %~zI)

for /F "delims=" %I in ('dir /S /B "C:\temp\for"') do (echo %~ftzaI)


更なる旅へ!:

さて(うまく結果が出たとして)、今回の「DOS for文ツアー」はここで終わりです
これまでを通して「FOR 変数参照の置換オプション」というツールを手に入れられたのではないでしょうか? (ついでにfsutilやtreeなどにも触れました。)

 個人的には ~z のファイルのサイズを返すオプションが目玉だと思います。空ファイル(0kb)を判別する必要がある時などに重宝します。

そして、ここからが旅の本番です、行く先々で待ち受けているであろう「DOS故の痒いところ」は、もしかすると「FOR 変数参照の置換オプション」で、意外と簡単に乗り越えられるかもしれませんね


今回の例ではFOR変数に I を使用しています、またコマンドラインで実行しているので 変数I に付ける % は一個です、.batで実行するような時は %%I としてください。 またFOR変数は I である必要はありません、aを使いたかったら%aでいいですし、その場合は %~za という感じで使ってください


最後に「FOR 変数参照の置換オプション」をリストしておきます。for /? からの抜粋です。
===========================================================

    %~I         - すべての引用句 (") を削除して、%I を展開します。
    %~fI        - %I を完全修飾パス名に展開します。
    %~dI        - %I をドライブ文字だけに展開します。
    %~pI        - %I をパス名だけに展開します。
    %~nI        - %I をファイル名だけに展開します。
    %~xI        - %I をファイル拡張子だけに展開します。
    %~sI        - 展開されたパスは短い名前だけを含みます。
    %~aI        - %I をファイルの属性に展開します。
    %~tI        k- %I ファイルの日付/時刻に展開します。
    %~zI        - %I ファイルのサイズに展開します。
    %~$PATH:I   - PATH 環境変数に指定されているディレクトリを
                   検索し、最初に見つかった完全修飾名に %I を
                   展開します。
                   環境変数名が定義されていない場合、または検索
                   してもファイルが見つからなかった場合は、この
                   修飾子を指定すると空の文字列に展開されます。

修飾子を組み合わせて、複合結果を得ることもできます:

    %~dpI       - %I をドライブ文字とパスだけに展開します。
    %~nxI       - %I をファイル名と拡張子だけに展開します。
    %~fsI       - %I を完全なパスと短い名前だけに展開します。
    %~dp$PATH:I - PATH 環境変数に指定されているディレクトリを
                   検索して %I を探し、最初に見つかったファイル
                   のドライブ文字とパスだけに展開します。
    %~ftzaI     - %I を DIR コマンドの出力行のように展開します。

===========================================================

2013年2月25日月曜日

Scripting.FileSystemObject.Drive Object - Sample

Scripting.FileSystemObject.Driveの使用例


scanDrives.vbs:
 VBスクリプト。 Scripting.FileSystemObjectオブジェクトを作成してDrivesと

 EnumNetworkDrivesを使用して、マイコンピュータがマウントしている各ドライブをスキャンして
 各ドライブの情報をCSV形式で出力する

使い方:
 下のscanDrives.vbsをテキストエディタにコピペして、scanDrives.vbsで保存して実行

 次の例はC:\scanDrives.vbsに保存した場合の使用方法。


c:\>cscript /nologo c:\scanDrives.vbs
 Letter,Type,Total[Byte],Used[Byte],Available[Byte],Usage[%],Path
 C,Local HDD Drive,52428795904,48322715648,4106080256,7.83%,-
 D,Local HDD Drive,246629265408,151006982144,95622283264,38.77%,-
 E,Local HDD Drive,20971515904,10150678528,10820837376,51.60%,-
 F is not ready.
 Z,Network Drive,-,-,-,-,\\fileserver01\Shared\
 Y,Network Drive,-,-,-,-,\\fileserver02\NASShare
 Z,Network Drive,-,-,-,-,\\remoteservr01\c$


scanDrives.vbs
==================================================================================
'--------------------------------------------------------
' Scripting.FileSystemObject.Drive Object
'--------------------------------------------------------
' Property       | 機能
'----------------|---------------------------------------
' AvailableSpace | 利用可能な空きスペースの大きさを取得する
' DriveLetter    | ドライブ名(「C」など)を取得する
' DriveType      | ドライブの種類を取得する (0は不明なドライブ、1はリムーバブル・ディス
'                | ク、2はハードディスク、3はネットワーク・ドライブ、4はCD-ROM、5はRAM
'                | ディスクを表す。)
' FileSystem     | ドライブのファイルシステムを取得する
' FreeSpace      | ディスクの空きスペースの大きさを取得する
' IsReady        | ドライブが準備できているかどうかを取得する
' Path           | コロン付きのドライブ名を取得する
' RootFolder     | ルートフォルダを表すFolderオブジェクトを取得する
' SerialNumber   | ディスクのシリアルナンバーを取得する
' ShareName      | ネットワーク・ドライブの共有名を取得する
' TotalSize      | ディスクの総容量を取得する
' VolumeName     | ドライブのボリューム名を取得する
'---------------------------------------------------------

Set fso1 = CreateObject("Scripting.FileSystemObject")
Set drives = fso1.Drives
Set fso2 = CreateObject ("WScript.Network")
Set networkdrives = fso2.EnumNetworkDrives

WScript.Echo "Letter" & "," & "Type" & "," & "Total[Byte]" & "," & "Used[Byte]" & "," & "Available[Byte]" & "," & "Usage[%]" & "," & "Path"

For Each drive in drives
   letter = drive.DriveLetter
   if(drive.isReady) Then
   Select Case drive.DriveType
      Case "1"
         diskusage = FormatPercent (drive.AvailableSpace/drive.TotalSize)
         WScript.Echo letter & "," & "Removable HDD Drive" & "," & drive.TotalSize & "," & drive.TotalSize - drive.AvailableSpace & "," & drive.AvailableSpace & "," & diskusage & "," & "-"
         WScript.Echo letter
         diskusage = ""
      Case "2"
         diskusage = FormatPercent (drive.AvailableSpace/drive.TotalSize)
         WScript.Echo letter & "," & "Local HDD Drive" & "," & drive.TotalSize & "," & drive.TotalSize - drive.AvailableSpace & "," & drive.AvailableSpace & "," & diskusage & "," & "-"
         diskusage = ""
      Case "3"
         path = ""
         For i = 0 to networkdrives.Count - 1 Step 2
            if networkdrives.Item(i) = letter & ":" Then
               path = networkdrives.Item(i + 1)
            End if
         Next
         WScript.Echo letter & "," & "Network Drive" & "," & "-" & "," & "-" & "," & "-" & "," & "-" & "," & path
      Case "4"
         WScript.Echo letter & "," & "Disc Drive" & "," & "-" & "," & "-" & "," & "-" & "," & "-" & "," & "-"
      Case Else
         WScript.Echo letter & "," & "Unknown Drive Type" & "," & "-" & "," & "-" & "," & "-" & "," & "-" & "," & path
   End Select
   Else
         WScript.Echo letter & " is not ready."
   End if
Next
==================================================================================