Oracle + Sun Welcome イベントが東京、大阪で開催
Oracle + Sun Welcome Event が世界各国で開催されることが決まったようです。
各国の開催予定日はここに記載されています。
ちなみに、日本では東京と大阪で、それぞれ 4月21日、4月22日 に開催されるようです。
どうぞお楽しみに。
プレゼンスタイルについて
私は仕事がら社内外でプレゼンをする機会が多いのですが、プレゼンを行った後、ご来場頂いた皆様に書いて頂いたアンケートを必ず見るようにしています。というのも頂いたアンケート結果を元に次回のプレゼンに何とか生かせないかと考えているためです。
そんな、アンケートの内容を確認するとたまにプレゼンの仕方について
記載して頂くことがあります。
(同僚からは寺田のプレゼンは「熱い!!」と言われています。)
そこで、今日は私のプレゼンに対する取り組みと注意しているポイントについてまとめてみたいと思います。
さて、
- プレゼンを行う際に皆様どのような事に気をつけていますか?
- もしくはどのようにプレゼンしたいと思いますか?
私がプレゼンで一番重要にしているポイントは「情熱」です。
自分が紹介する情報に対して如何に情熱を持って話ができるか、それが何よりも重要だと思っています。だから熱いと言われるのも仕方がないのですが。しかし 自分が良いと思ってもない事、自分自身が信じていない事に対していくら良いですよ、聞いてくださいねと話をしても聞き手には全く伝わりません。
ですので伝えたい内容に関して、この自分が信じて止まない情報を是非聞いていただきたい、もっと広めたいと思って説明をするようにしています。
これを実現するためには、必ず自分のプレゼン資料は自分で作るようにしています。それは当然では?と思われる方も多いかと思うのですが、企業に勤めて製品 説明等を行う際、別の誰かが作成したプレゼン資料を使い回して説明しなければならない事もあります。実際過去に世界各国で共通のプレゼンを使用して、それ ぞれ別の人が発表するといった事があったわけですが、そのような場合も必ず自分で手を加えるようにしました。
なぜなら、そのプレゼン資料を作成した人と私の重要ポイントは違うためです。仮に発表用の原稿が用意されていて、強調ポイントまでが指し示されているので あれば、同じ資料を使用して同じプレゼンをする事もできるかもしれませんが、それでは自分がプレゼンをする意味がありません。
私が聞いて欲しいと思うポイントを強調したり、新たに原稿を追加する等して
カスタマイズする事によって自分のプレゼンに仕上がります。
実際に、プレゼン資料を作成する際に注意する点は下記です。
全体構成に関する注意点
- 概要説明から詳細説明へ
- かんたんな内容から難しい内容へ
- ページ間にストーリを作成
ページ作成時の注意点
- 文字を多用しない
- 伝えたいポイントのみ記載する
- 自分の口頭の説明に対する補助を記載する
- 説明する内容の概要のみ把握(詳細は必要なし)
上記で、”説明する内容の概要のみ把握”と記載していますが、これは、私が重視するポイントの一つです。最初は各ページで説明する内容をまとめた発表用原稿を用意していましたが今は原稿を作成することはまずありません。
各ページの作成時に覚えておくべき事は、このページでは何を説明すべきか、という事だけです。仮に忘れそうであればプレゼン資料内に補助で説明文言を含めれば忘れることもなくなるので、基本的には発表内容を一言一句全て覚えるということはしません。
発表内容を完全に覚えた場合のワーストケースとして下記のような事が発生する可能性があります
- 発表時間が突然変わることがある。
- 緊張して上がった場合に頭が真っ白になる。
説明する内容の概要さえ覚えておけば上記を防ぐことができます。例えば、発表時間に応じて内容を柔軟に修正できるため時計をみながら発表内容を短縮もしくは拡張することができるようになります。
また仮に緊張して上がっても発表する内容の概要だけが頭に残っていれば、(仮に残っていなくてもページの文章を読めば)最悪な停止状態はさけられ、そこを乗り越えれば時間を経過するにつれて落ち着いてくるので普段とおりの発表ができるようになります。
一言一句覚えてしまうと柔軟な対応ができなくなってしまいます。
また、発表時に気をつけるポイントとしては下記があります。
- 声は大きくはっきりと
- ポイントを指す時以外はできる限りプレゼン資料は見ない
- 常に聞き手に対して正面を向くようにする
- 相づちを打ってくださる数名のお客様を見つけその方達に語りかけるように説明する
- テーブル等がある場合は、テーブルに隠れないようにし体全体が見えるようにする
- お客様のリストの事前確認、もしくは発表中のお客様の反応を見て、興味のありそうなポイントを通常より詳しく説明する。
- デモンストレーションを行う場合は事前にデモ内容を録画した動画ファイルを準備しておく
以上、私がプレゼンで注意しているポイントです。プレゼンスタイルは人それぞれだと思いますし手法も色々あるのですが少しでも参考になれば幸いです。
最後に余談ですが、こうやって改めて自分のプレゼンについて考えてみて自分のプレゼンスタイルのルーツを思い出すことができました。学生時代にあ る国際学会で出会った外人さんなのですが、彼のプレゼンがとてもすばらしく最初は彼の真似をしたのではないかと思います。もちろん、その後社会人になって 色々な方にプレゼンのアドバイスを頂いたり書籍などからも学んだのですが、ルーツはそこなんだなと思いだしました。
皆さんも記憶に残るプレゼンってありますか?
GlassFish データベースの設定
GlassFishはデータベースとの接続にデータベースベンダーが提供するJDBCドライバを使用します.
GlassFishにはインストール時デフォルトで Java DBが付属しており,あらかじめJava DBに対するJDBCリソースと接続プールの設定がされています.そして GlassFish の監視系の機能の一つである,「呼び出しフロー」のデータ保存先として使用されています.
ここでは,新たにMySQL 5.1との接続設定方法について紹介します.MySQLと接続するためには,MySQLのJDBCドライバを事前に入手しておいてください.
また以降の手順ではMySQLが既にインストールされていることを前提に説明します.
JDBCドライバに対するクラスパスを設定
| dashost > asadmin get “cluster1-config.java-config.server-classpath” cluster1-config.java-config.server-classpath = dashost > asadmin set “cluster1-config.java-config.server-classpath=/sun/glassfish-v2.1.1/lib/mysql-connector-java-5.1.5-bin.jar” cluster1-config.java-config.server-classpath = /sun/glassfish-v2.1.1/lib/mysql-connector-java-5.1.5-bin.jar |
クラスパスの設定は,管理コンソールから左ペインの「設定」→「対象のコンフィグ(cluster1-config)」→「JVM 設定」を選択し右ペインの「サーバクラスパス」内に記載し設定できます.

次に JDBC の接続プールを作成します.
| dashost > asadmin create-jdbc-connection-pool –datasourceclassname com.mysql.jdbc.jdbc2.optional.MysqlDataSource –restype=javax.sql.DataSource –property user=root:password=password:DatabaseName=MySQL:ServerName=localhost:port=3306:URL=”jdbc\:mysql\://localhost\:3306/test” MySQL-Pool コマンド create-jdbc-connection-pool は正常に実行されました。 |
分散トランザクションが必要な場合,リソースタイプ,データソースにそれぞれ下記を使用してください.
javax.sql.XADataSource
com.mysql.jdbc.jdbc2.optional.MysqlXADataSource
管理コンソールからは下記の手順に従い設定してください.
まず、左ペインの「リソース」→「JDBC」→ 「接続プール」を選択し右ペインの「新規 …」ボタンを押下します.

次に,「接続プール名」,「リソースタイプ」,「データベースベンダー」を選択し「次へ」ボタンを押下します.

最後に,JDBC の各種詳細な設定項目を選択/入力し「完了」ボタンを押下します.



JDBCドライバ等の設定項目一覧が数多くリストされますが,ここでは最低限下記の項目のみ編集して設定を完了します.
| 名前 | 値 |
| user | root |
| password | password |
| DatabaseName | MySQL |
| ServerName | localhost |
| port | 3306 |
| URL | jdbc:mysql://localhost:3306/test |
「完了」ボタンを押下すると下記の画面が表示されます.

ここで、作成した JDBC 接続プールが有効か否か疎通確認を行います.
成功時:
| dashost > asadmin ping-connection-pool MySQL-Pool コマンド ping-connection-pool は正常に実行されました。 |
失敗時:
|
dashost > asadmin ping-connection-pool MySQL-Pool com.mysql.jdbc.exceptions.jdbc4.CommunicationsException CLI137 コマンド ping-connection-pool は失敗しました。 |
また,管理コンソールから左ペインの「リソース」→「 JDBC」→「 接続プール」より対象の接続プールを選択し「Ping」ボタンを押下し確認できます.
成功時:

失敗時:

次に、作成した JDBC 接続プールに対して,リソース設定を行います.
アプリケーションはここで設定する JNDI 名を利用して DB にアクセスできるようになります.
| dashost > asadmin create-jdbc-resource –connectionpoolid MySQL-Pool jdbc/mysql コマンド create-jdbc-resource は正常に実行されました。 |
管理コンソールからは下記の手順に従い設定してください.
まず、左ペインの「リソース」→「JDBC」→ 「 JDBCリソース」を選択し右ペインより「新規 …」ボタンを押下します.

続いて,「JNDI 名」,「プール名」,有効状態のチェックをつけ「利用可能なターゲット」に対象のクラスタ(cluster1)を追加して「了解」ボタンを押下します.

「了解」ボタンを押下すると下記の画面が表示され JDBC リソースの設定は完了します.以降アプリケーションはここで設定した “jdbc/mysql” を利用して DB
に対して接続ができるようになります.

DBの設定情報の取得
ここで,DB の設定可能な項目の一覧をリストしてみます.asadmin の get コマンドを実行して確認ができます.各設定項目は asadmin set コマンドで設定変更を更新できますので必要に応じて設定変更を行ってください.
| dashost > asadmin get “domain.resources.jdbc-connection-pool.MySQL-Pool.*” domain.resources.jdbc-connection-pool.MySQL-Pool.allow-non-component-callers = false domain.resources.jdbc-connection-pool.MySQL-Pool.associate-with-thread = false domain.resources.jdbc-connection-pool.MySQL-Pool.connection-creation-retry-attempts = 0 domain.resources.jdbc-connection-pool.MySQL-Pool.connection-creation-retry-interval-in-seconds = 10 domain.resources.jdbc-connection-pool.MySQL-Pool.connection-leak-reclaim = false domain.resources.jdbc-connection-pool.MySQL-Pool.connection-leak-timeout-in-seconds = 0 domain.resources.jdbc-connection-pool.MySQL-Pool.connection-validation-method = auto-commit domain.resources.jdbc-connection-pool.MySQL-Pool.datasource-classname = com.mysql.jdbc.jdbc2.optional.MysqlDataSource domain.resources.jdbc-connection-pool.MySQL-Pool.description = domain.resources.jdbc-connection-pool.MySQL-Pool.fail-all-connections = false domain.resources.jdbc-connection-pool.MySQL-Pool.idle-timeout-in-seconds = 300 domain.resources.jdbc-connection-pool.MySQL-Pool.is-connection-validation-required = false domain.resources.jdbc-connection-pool.MySQL-Pool.is-isolation-level-guaranteed = false domain.resources.jdbc-connection-pool.MySQL-Pool.lazy-connection-association = false domain.resources.jdbc-connection-pool.MySQL-Pool.lazy-connection-enlistment = false domain.resources.jdbc-connection-pool.MySQL-Pool.match-connections = false domain.resources.jdbc-connection-pool.MySQL-Pool.max-connection-usage-count = 0 domain.resources.jdbc-connection-pool.MySQL-Pool.max-pool-size = 32 domain.resources.jdbc-connection-pool.MySQL-Pool.max-wait-time-in-millis = 60000 domain.resources.jdbc-connection-pool.MySQL-Pool.name = MySQL-Pool domain.resources.jdbc-connection-pool.MySQL-Pool.non-transactional-connections = false domain.resources.jdbc-connection-pool.MySQL-Pool.pool-resize-quantity = 2 domain.resources.jdbc-connection-pool.MySQL-Pool.property.AllowLoadLocalInfile = true domain.resources.jdbc-connection-pool.MySQL-Pool.property.AllowMultiQueries = false domain.resources.jdbc-connection-pool.MySQL-Pool.property.AllowNanAndInf = false domain.resources.jdbc-connection-pool.MySQL-Pool.property.AllowUrlInLocalInfile = false domain.resources.jdbc-connection-pool.MySQL-Pool.property.AlwaysSendSetIsolation = true domain.resources.jdbc-connection-pool.MySQL-Pool.property.AutoClosePStmtStreams = false domain.resources.jdbc-connection-pool.MySQL-Pool.property.AutoDeserialize = false domain.resources.jdbc-connection-pool.MySQL-Pool.property.AutoGenerateTestcaseScript = false domain.resources.jdbc-connection-pool.MySQL-Pool.property.AutoReconnectForPools = false domain.resources.jdbc-connection-pool.MySQL-Pool.property.AutoSlowLog = true domain.resources.jdbc-connection-pool.MySQL-Pool.property.BlobSendChunkSize = 1048576 domain.resources.jdbc-connection-pool.MySQL-Pool.property.BlobsAreStrings = false domain.resources.jdbc-connection-pool.MySQL-Pool.property.CacheCallableStatements = false domain.resources.jdbc-connection-pool.MySQL-Pool.property.CacheCallableStmts = false domain.resources.jdbc-connection-pool.MySQL-Pool.property.CachePrepStmts = false domain.resources.jdbc-connection-pool.MySQL-Pool.property.CachePreparedStatements = false domain.resources.jdbc-connection-pool.MySQL-Pool.property.CacheResultSetMetadata = false domain.resources.jdbc-connection-pool.MySQL-Pool.property.CacheServerConfiguration = false domain.resources.jdbc-connection-pool.MySQL-Pool.property.CallableStatementCacheSize = 100 domain.resources.jdbc-connection-pool.MySQL-Pool.property.CallableStmtCacheSize = 100 domain.resources.jdbc-connection-pool.MySQL-Pool.property.CapitalizeTypeNames = true domain.resources.jdbc-connection-pool.MySQL-Pool.property.ClientInfoProvider = com.mysql.jdbc.JDBC4CommentClientInfoProvider domain.resources.jdbc-connection-pool.MySQL-Pool.property.ClobberStreamingResults = false domain.resources.jdbc-connection-pool.MySQL-Pool.property.ConnectTimeout = 0 domain.resources.jdbc-connection-pool.MySQL-Pool.property.ContinueBatchOnError = true domain.resources.jdbc-connection-pool.MySQL-Pool.property.CreateDatabaseIfNotExist = false domain.resources.jdbc-connection-pool.MySQL-Pool.property.DatabaseName = MySQL domain.resources.jdbc-connection-pool.MySQL-Pool.property.DefaultFetchSize = 0 domain.resources.jdbc-connection-pool.MySQL-Pool.property.DontTrackOpenResources = false domain.resources.jdbc-connection-pool.MySQL-Pool.property.DumpMetadataOnColumnNotFound = false domain.resources.jdbc-connection-pool.MySQL-Pool.property.DumpQueriesOnException = false domain.resources.jdbc-connection-pool.MySQL-Pool.property.DynamicCalendars = false domain.resources.jdbc-connection-pool.MySQL-Pool.property.ElideSetAutoCommits = false domain.resources.jdbc-connection-pool.MySQL-Pool.property.EmptyStringsConvertToZero = true domain.resources.jdbc-connection-pool.MySQL-Pool.property.EmulateLocators = false domain.resources.jdbc-connection-pool.MySQL-Pool.property.EmulateUnsupportedPstmts = true domain.resources.jdbc-connection-pool.MySQL-Pool.property.EnablePacketDebug = false domain.resources.jdbc-connection-pool.MySQL-Pool.property.EnableQueryTimeouts = true domain.resources.jdbc-connection-pool.MySQL-Pool.property.ExplainSlowQueries = false domain.resources.jdbc-connection-pool.MySQL-Pool.property.FailOverReadOnly = true domain.resources.jdbc-connection-pool.MySQL-Pool.property.FunctionsNeverReturnBlobs = false domain.resources.jdbc-connection-pool.MySQL-Pool.property.GatherPerfMetrics = false domain.resources.jdbc-connection-pool.MySQL-Pool.property.GatherPerformanceMetrics = false domain.resources.jdbc-connection-pool.MySQL-Pool.property.GenerateSimpleParameterMetadata = false domain.resources.jdbc-connection-pool.MySQL-Pool.property.HoldResultsOpenOverStatementClose = false domain.resources.jdbc-connection-pool.MySQL-Pool.property.IgnoreNonTxTables = false domain.resources.jdbc-connection-pool.MySQL-Pool.property.IncludeInnodbStatusInDeadlockExceptions = false domain.resources.jdbc-connection-pool.MySQL-Pool.property.InitialTimeout = 2 domain.resources.jdbc-connection-pool.MySQL-Pool.property.InteractiveClient = false domain.resources.jdbc-connection-pool.MySQL-Pool.property.IsInteractiveClient = false domain.resources.jdbc-connection-pool.MySQL-Pool.property.JdbcCompliantTruncation = true domain.resources.jdbc-connection-pool.MySQL-Pool.property.JdbcCompliantTruncationForReads = true domain.resources.jdbc-connection-pool.MySQL-Pool.property.LoadBalanceStrategy = random domain.resources.jdbc-connection-pool.MySQL-Pool.property.LocatorFetchBufferSize = 1048576 domain.resources.jdbc-connection-pool.MySQL-Pool.property.LogSlowQueries = false domain.resources.jdbc-connection-pool.MySQL-Pool.property.LogXaCommands = false domain.resources.jdbc-connection-pool.MySQL-Pool.property.Logger = com.mysql.jdbc.log.StandardLogger domain.resources.jdbc-connection-pool.MySQL-Pool.property.LoggerClassName = com.mysql.jdbc.log.StandardLogger domain.resources.jdbc-connection-pool.MySQL-Pool.property.LoginTimeout = 0 domain.resources.jdbc-connection-pool.MySQL-Pool.property.MaintainTimeStats = true domain.resources.jdbc-connection-pool.MySQL-Pool.property.MaxQuerySizeToLog = 2048 domain.resources.jdbc-connection-pool.MySQL-Pool.property.MaxReconnects = 3 domain.resources.jdbc-connection-pool.MySQL-Pool.property.MaxRows = -1 domain.resources.jdbc-connection-pool.MySQL-Pool.property.MetadataCacheSize = 50 domain.resources.jdbc-connection-pool.MySQL-Pool.property.NetTimeoutForStreamingResults = 600 domain.resources.jdbc-connection-pool.MySQL-Pool.property.NoAccessToProcedureBodies = false domain.resources.jdbc-connection-pool.MySQL-Pool.property.NoDatetimeStringSync = false domain.resources.jdbc-connection-pool.MySQL-Pool.property.NoTimezoneConversionForTimeType = false domain.resources.jdbc-connection-pool.MySQL-Pool.property.NullCatalogMeansCurrent = true domain.resources.jdbc-connection-pool.MySQL-Pool.property.NullNamePatternMatchesAll = true domain.resources.jdbc-connection-pool.MySQL-Pool.property.OverrideSupportsIntegrityEnhancementFacility = false domain.resources.jdbc-connection-pool.MySQL-Pool.property.PacketDebugBufferSize = 20 domain.resources.jdbc-connection-pool.MySQL-Pool.property.PadCharsWithSpace = false domain.resources.jdbc-connection-pool.MySQL-Pool.property.Paranoid = false domain.resources.jdbc-connection-pool.MySQL-Pool.property.Password = password domain.resources.jdbc-connection-pool.MySQL-Pool.property.Pedantic = false domain.resources.jdbc-connection-pool.MySQL-Pool.property.PinGlobalTxToPhysicalConnection = false domain.resources.jdbc-connection-pool.MySQL-Pool.property.PopulateInsertRowWithDefaultValues = false domain.resources.jdbc-connection-pool.MySQL-Pool.property.Port = 3306 domain.resources.jdbc-connection-pool.MySQL-Pool.property.PortNumber = 3306 domain.resources.jdbc-connection-pool.MySQL-Pool.property.PrepStmtCacheSize = 25 domain.resources.jdbc-connection-pool.MySQL-Pool.property.PrepStmtCacheSqlLimit = 256 domain.resources.jdbc-connection-pool.MySQL-Pool.property.PreparedStatementCacheSize = 25 domain.resources.jdbc-connection-pool.MySQL-Pool.property.PreparedStatementCacheSqlLimit = 256 domain.resources.jdbc-connection-pool.MySQL-Pool.property.ProcessEscapeCodesForPrepStmts = true domain.resources.jdbc-connection-pool.MySQL-Pool.property.ProfileSQL = false domain.resources.jdbc-connection-pool.MySQL-Pool.property.ProfileSql = false domain.resources.jdbc-connection-pool.MySQL-Pool.property.QueriesBeforeRetryMaster = 50 domain.resources.jdbc-connection-pool.MySQL-Pool.property.ReconnectAtTxEnd = false domain.resources.jdbc-connection-pool.MySQL-Pool.property.RelaxAutoCommit = false domain.resources.jdbc-connection-pool.MySQL-Pool.property.ReportMetricsIntervalMillis = 30000 domain.resources.jdbc-connection-pool.MySQL-Pool.property.RequireSSL = false domain.resources.jdbc-connection-pool.MySQL-Pool.property.ResultSetSizeThreshold = 100 domain.resources.jdbc-connection-pool.MySQL-Pool.property.RewriteBatchedStatements = false domain.resources.jdbc-connection-pool.MySQL-Pool.property.RollbackOnPooledClose = true domain.resources.jdbc-connection-pool.MySQL-Pool.property.RoundRobinLoadBalance = false domain.resources.jdbc-connection-pool.MySQL-Pool.property.RunningCTS13 = false domain.resources.jdbc-connection-pool.MySQL-Pool.property.SecondsBeforeRetryMaster = 30 domain.resources.jdbc-connection-pool.MySQL-Pool.property.ServerName = localhost domain.resources.jdbc-connection-pool.MySQL-Pool.property.SlowQueryThresholdMillis = 2000 domain.resources.jdbc-connection-pool.MySQL-Pool.property.SlowQueryThresholdNanos = 0 domain.resources.jdbc-connection-pool.MySQL-Pool.property.SocketFactory = com.mysql.jdbc.StandardSocketFactory domain.resources.jdbc-connection-pool.MySQL-Pool.property.SocketFactoryClassName = com.mysql.jdbc.StandardSocketFactory domain.resources.jdbc-connection-pool.MySQL-Pool.property.SocketTimeout = 0 domain.resources.jdbc-connection-pool.MySQL-Pool.property.StrictFloatingPoint = false domain.resources.jdbc-connection-pool.MySQL-Pool.property.StrictUpdates = true domain.resources.jdbc-connection-pool.MySQL-Pool.property.TcpKeepAlive = true domain.resources.jdbc-connection-pool.MySQL-Pool.property.TcpNoDelay = true domain.resources.jdbc-connection-pool.MySQL-Pool.property.TcpRcvBuf = 0 domain.resources.jdbc-connection-pool.MySQL-Pool.property.TcpSndBuf = 0 domain.resources.jdbc-connection-pool.MySQL-Pool.property.TcpTrafficClass = 0 domain.resources.jdbc-connection-pool.MySQL-Pool.property.TinyInt1isBit = true domain.resources.jdbc-connection-pool.MySQL-Pool.property.TraceProtocol = false domain.resources.jdbc-connection-pool.MySQL-Pool.property.TransformedBitIsBoolean = false domain.resources.jdbc-connection-pool.MySQL-Pool.property.TreatUtilDateAsTimestamp = true domain.resources.jdbc-connection-pool.MySQL-Pool.property.URL = jdbc:mysql://:3306/ domain.resources.jdbc-connection-pool.MySQL-Pool.property.UltraDevHack = false domain.resources.jdbc-connection-pool.MySQL-Pool.property.Url = jdbc:mysql://localhost:3306/test domain.resources.jdbc-connection-pool.MySQL-Pool.property.UseBlobToStoreUTF8OutsideBMP = false domain.resources.jdbc-connection-pool.MySQL-Pool.property.UseCompression = false domain.resources.jdbc-connection-pool.MySQL-Pool.property.UseCursorFetch = false domain.resources.jdbc-connection-pool.MySQL-Pool.property.UseDirectRowUnpack = true domain.resources.jdbc-connection-pool.MySQL-Pool.property.UseDynamicCharsetInfo = true domain.resources.jdbc-connection-pool.MySQL-Pool.property.UseFastDateParsing = true domain.resources.jdbc-connection-pool.MySQL-Pool.property.UseFastIntParsing = true domain.resources.jdbc-connection-pool.MySQL-Pool.property.UseGmtMillisForDatetimes = false domain.resources.jdbc-connection-pool.MySQL-Pool.property.UseHostsInPrivileges = true domain.resources.jdbc-connection-pool.MySQL-Pool.property.UseInformationSchema = false domain.resources.jdbc-connection-pool.MySQL-Pool.property.UseJDBCCompliantTimezoneShift = false domain.resources.jdbc-connection-pool.MySQL-Pool.property.UseJvmCharsetConverters = false domain.resources.jdbc-connection-pool.MySQL-Pool.property.UseLocalSessionState = false domain.resources.jdbc-connection-pool.MySQL-Pool.property.UseNanosForElapsedTime = false domain.resources.jdbc-connection-pool.MySQL-Pool.property.UseOldAliasMetadataBehavior = false domain.resources.jdbc-connection-pool.MySQL-Pool.property.UseOldUTF8Behavior = false domain.resources.jdbc-connection-pool.MySQL-Pool.property.UseOnlyServerErrorMessages = true domain.resources.jdbc-connection-pool.MySQL-Pool.property.UseReadAheadInput = true domain.resources.jdbc-connection-pool.MySQL-Pool.property.UseSSL = false domain.resources.jdbc-connection-pool.MySQL-Pool.property.UseSSPSCompatibleTimezoneShift = false domain.resources.jdbc-connection-pool.MySQL-Pool.property.UseServerPrepStmts = false domain.resources.jdbc-connection-pool.MySQL-Pool.property.UseServerPreparedStmts = false domain.resources.jdbc-connection-pool.MySQL-Pool.property.UseSqlStateCodes = true domain.resources.jdbc-connection-pool.MySQL-Pool.property.UseStreamLengthsInPrepStmts = true domain.resources.jdbc-connection-pool.MySQL-Pool.property.UseTimezone = false domain.resources.jdbc-connection-pool.MySQL-Pool.property.UseUltraDevWorkAround = false domain.resources.jdbc-connection-pool.MySQL-Pool.property.UseUnbufferedInput = true domain.resources.jdbc-connection-pool.MySQL-Pool.property.UseUnicode = true domain.resources.jdbc-connection-pool.MySQL-Pool.property.UseUsageAdvisor = false domain.resources.jdbc-connection-pool.MySQL-Pool.property.User = root domain.resources.jdbc-connection-pool.MySQL-Pool.property.YearIsDateType = true domain.resources.jdbc-connection-pool.MySQL-Pool.property.ZeroDateTimeBehavior = exception domain.resources.jdbc-connection-pool.MySQL-Pool.res-type = javax.sql.DataSource domain.resources.jdbc-connection-pool.MySQL-Pool.statement-timeout-in-seconds = -1 domain.resources.jdbc-connection-pool.MySQL-Pool.steady-pool-size = 8 domain.resources.jdbc-connection-pool.MySQL-Pool.transaction-isolation-level = domain.resources.jdbc-connection-pool.MySQL-Pool.validate-atmost-once-period-in-seconds = 0 domain.resources.jdbc-connection-pool.MySQL-Pool.validation-table-name = domain.resources.jdbc-connection-pool.MySQL-Pool.wrap-jdbc-objects = false |
コネックションプールのモニタリング
最後に、JDBC の接続プールに対してモニタリングの設定を行う方法を紹介します.モニタリングを有効にするために下記の手順に従い設定を行い,確認してください.
| dashost > asadmin list “*monitor*” server.monitoring-service server.monitoring-service.module-monitoring-levels dashost > asadmin set “server.monitoring-service.module-monitoring-levels.jdbc-connection-pool=HIGH” server.monitoring-service.module-monitoring-levels.jdbc-connection-pool = HIGH dashost > asadmin get “server.monitoring-service.module-monitoring-levels.*” server.monitoring-service.module-monitoring-levels.connector-connection-pool = OFF server.monitoring-service.module-monitoring-levels.connector-service = OFF server.monitoring-service.module-monitoring-levels.ejb-container = OFF server.monitoring-service.module-monitoring-levels.http-service = OFF server.monitoring-service.module-monitoring-levels.jdbc-connection-pool = HIGH server.monitoring-service.module-monitoring-levels.jms-service = OFF server.monitoring-service.module-monitoring-levels.jvm = OFF server.monitoring-service.module-monitoring-levels.orb = OFF server.monitoring-service.module-monitoring-levels.thread-pool = OFF server.monitoring-service.module-monitoring-levels.transaction-service = OFF server.monitoring-service.module-monitoring-levels.web-container = OFF dashost > asadmin list –monitor=true “*MySQL*” server.resources.MySQL-Pool dashost > asadmin get –monitor=true “server.resources.MySQL-Pool.*” |
GlassFish SSLの設定(クライアント認証)
GlassFish のドメイン管理サーバ上でHTTP リスナーの設定をクライアント認証対応に変更
| dashost > asadmin set “cluster1-config.http-service.http-listener.http-listener-2.ssl.client-auth-enabled = true” |
クライアント証明書の秘密鍵を作成
|
ca-admin > openssl genrsa -des3 -out /tmp/client-private-key 2048 Generating RSA private key, 2048 bit long modulus ……….+++ ………………………………….+++ e is 65537 (0x10001) Enter pass phrase for /tmp/client-private-key: Verifying – Enter pass phrase for /tmp/client-private-key: |
クライアント証明書用のCSRを作成
下記の例では便宜上,認証局(CA)上で CSR を生成していますが,CSRの生成はどの環境で構築しても問題ありません.
| ca-admin > openssl req -new -days 365 -key /tmp/client-private-key -out /tmp/clientcsr.pem Enter pass phrase for /tmp/client-private-key: You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter ‘.’, the field will be left blank. —– Country Name (2 letter code) [AU]:JP State or Province Name (full name) [Some-State]:Tokyo Locality Name (eg, city) []:Setagaya Organization Name (eg, company) [Internet Widgits Pty Ltd]:Sun Microsystems Organizational Unit Name (eg, section) []:Software Practice Common Name (eg, YOUR name) []:Tarou Yamada Email Address []:Tarou.Yamada@Sun.COM Please enter the following ‘extra’ attributes |
認証局(CA)でクライアント証明書を署名
クライアント証明書のCSRを認証局(CA)で署名します。
| ca-admin > openssl ca -config ./openssl-client.cnf -in /tmp/clientcsr.pem -out /tmp/signed-clientcert.pem Using configuration from ./openssl-client.cnf Enter pass phrase for ./demoCA/private/cakey.pem: Check that the request matches the signatureSignature ok Certificate Details: Serial Number: cd:ea:db:f4:c8:e3:93:92 Validity Not Before: Dec 4 08:27:14 2009 GMT Not After : Dec 4 08:27:14 2010 GMT (省略) |
署名されたクライアント証明書をGlassFishのキーストアにインポートするため,X.509形式に変更
| ca-admin > openssl x509 -in /tmp/signed-clientcert.pem -out /tmp/signed-clientcert.x509 |
GlassFishのキーストアに対してクライアント証明書をインポート
| dashost > keytool -import -alias yamada -file /tmp/signed-clientcert.x509 キーストアのパスワードを入力してください:[changeit] 新規パスワードを再入力してください:[changeit] 所有者: EMAILADDRESS=Tarou.Yamada@Sun.COM, CN=Tarou Yamada, OU=Software Practice, O=Sun Microsystems, ST=Tokyo, C=JP 発行者: EMAILADDRESS=caadmin@Sun.COM, CN=ca-server.sun.com, OU=Software Practice, O=Sun Microsystems, ST=Tokyo, C=JP シリアル番号: cdeadbf4c8e39392 有効期間の開始日: Fri Dec 04 17:27:14 JST 2009 終了日: Sat Dec 04 17:27:14 JST 2010 証明書のフィンガープリント: MD5: 59:06:3C:95:79:5D:31:D7:A3:92:0E:AA:A2:23:73:6D SHA1: 26:00:30:F1:15:DB:20:D4:8E:AF:99:AB:96:13:CB:17:DA:E5:71:15 署名アルゴリズム名: SHA1withRSA バージョン: 3 (省略) この証明書を信頼しますか? [no]: yes 証明書がキーストアに追加されました。 |
クライアント証明書をブラウザにインポートするためPKCS12形式に変換
| ca-admin > openssl pkcs12 -export -in /tmp/signed-clientcert.pem -inkey /tmp/client-private-key -certfile ./demoCA/cacert.pem -out /tmp/clientcert.p12 Enter pass phrase for /tmp/client-private-key: Enter Export Password: Verifying – Enter Export Password: ca-admin > ls -l /tmp/clientcert.p12 -rw-r–r– 1 root root 3525 12月 4日 17:29 /tmp/clientcert.p12 |
最後にブラウザにPKCS12形式のクライアント証明書をインポートします.
上記で設定は完了です,ブラウザからアクセスしてみてください.
GlassFish SSLの設定 (サーバ証明書の設定)
※ GlassFish で証明書の管理や鍵の管理を行う場合、
管理コンソールからは行えません.コマンドを使用してください.
SSLの設定(サーバ認証の設定)
クライアントのWebブラウザからサーバに対してSSL通信を行う場合,通常アプリケーションサーバの前段に配置するロードバランサもしくはリバースプロキシなどのシステムでSSL設定を行い,前段のシステムとアプリケーションサーバ間はSSLによる通信を行わない場合が多いです.しかしミッションクリティカルな環境では,前段のシステムとアプリケーションサーバ間もセキュアな通信路を確保する必要があリます.そのような場合,アプリケーションサーバ上でもSSLのサーバ証明書を設定する必要があります.ここでは前段のシステムからSSLで負荷分散されることを想定しクラスタ環境に対してSSLの設定を行う方法について紹介します.単一サーバインスタンスに対する設定を行う場合も基本的には同様の手続きで可能ですので参考にしてください.
今回紹介するクラスタ環境におけるSSL証明書管理の利点は,クラスタ構成に対して一度だけ設定を行えばクラスタに所属する全てのインスタンスに対して共通のSSL設定が有効になりますので,管理するマシンの台数が多い場合非常に便利です。
GlassFishのSSL設定はサーバ証明書のニックネームを変更する以外の殆どの設定操作をコマンドを使用して行います.そこで以下の説明では全ての操作をコマンドを使用して管理する方法を紹介します.
また,下記の手順は開発者プロファイル,クラスタプロファイル(Sun GlassFish Enterprise Server/OSS版GlassFish)を使用した場合の方法を紹介します.開発者プロファイル,クラスタプロファイルを使用する場合,証明書の管理にJava SEに付属するkeytoolを使用して管理します.エンタープライズプロファイル(Sun GlassFish Enterprise Server with HADB)を使用する場合は,NSS (Network Security Service)のcertutilコマンドやライブラリを使用します.certutilコマンドを使用した証明書管理方法は別途「GlassFish Enteprise Server管理ガイド」をご参照ください.
既存の自己署名証明書の確認
keytoolの-listコマンドを使用してGlassFishのインストール時に,デフォルトでインストールされている証明書を確認できます.証明書のキーストアはドメインのconfigディレクトリ中に存在しています.keystore.jksにはサーバ証明書などを格納します.またcacerts.jksには認証局(CA)の証明書などを格納します.
| dashost > cd /export/home/appserv/domains/clusterDomain/config/ dashost > ls keystore.jks cacerts.jks cacerts.jks keystore.jks dashost > keytool -list -keystore ./keystore.jks -alias s1as -storepass changeit s1as, 2009/12/03, PrivateKeyEntry, 証明書のフィンガープリント (MD5): E7:3A:3C:2A:F1:AE:7D:E8:72:0D:E5:A7:AE:87:97:DA dashost > keytool -list -keystore cacerts.jks -alias s1as -storepass changeit s1as, 2009/12/03, trustedCertEntry, 証明書のフィンガープリント (MD5): E7:3A:3C:2A:F1:AE:7D:E8:72:0D:E5:A7:AE:87:97:DA |
鍵のペア(公開鍵および関連する非公開鍵)の生成
keytoolの-genkeypairコマンドを使用して鍵のペアを生成します.クラスタ環境では実際の接続先はクラスタに所属するノードエージェントのホスト名になるため,CNにワイルドカードでホスト名を指定(*.japan.sun.com)することをおすすめします.ワイルドカードを使用すると,実際の接続先がnodeagent1.japan.sun.comやnodeagent2.japan.sun.comであった場合も正当なサーバ証明書として利用できます.単一のサーバインスタンスに対するサーバ証明書を作成する際は,CNに対してサーバ名をFQDN(www.japan.sun.com)で指定してください.
| dashost > keytool -genkeypair -alias cluster -keystore keystore.jks -keyalg RSA -keysize 2048 -validity 365 -dname “CN=*.japan.sun.com, OU=Software Practice, O=Sun Microsystems, L=Setagaya, ST=Tokyo, C=JP” -storepass changeit -keypass changeit |
証明書署名要求(CSR)の生成
keytool の-certreqコマンドを使用して証明書署名要求(CSR)を作成します.クラスタ環境における実際の接続先はクラスタに所属するノードエージェント上のインスタンスになるため,ワイルドカードでホスト名を指定することをおすすめします.ワイルドカードを使用すると,実際の接続先がnodeagent1.japan.sun.comやnodeagent2.japan.sun.comであった場合も正当なサーバ証明書として利用できます.(単一のサーバインスタンスに対してサーバ証明書を作成する際は,*(アスタリスク)の代わりにサーバ名をFQDNで指定してください.)
| dashost > keytool -certreq -alias cluster -keystore ./keystore.jks -file cluster.japan.sun.com.csr -storepass changeit |
署名前のサーバ証明書の確認
下記のコマンドを実行しkeytoolで作成したCSRの内容を確認します.
| dashost > openssl req -text -in ./cluster.japan.sun.com.csr Certificate Request: Data: Version: 0 (0x0) Subject: C=JP, ST=Tokyo, L=Setagaya, O=Sun Microsystems, OU=Software Practice, CN=*.japan.sun.com Subject Public Key Info: Public Key Algorithm: rsaEncryption RSA Public Key: (2048 bit) (省略) |
認証局(CA)でサーバ証明書を署名
GlassFish 上で生成した CSR を元に認証局で署名を行います.
| ca-server > openssl ca -in cluster.japan.sun.com.csr -keyfile ./demoCA/private/cakey.pem -cert ./demoCA/cacert.pem -out /tmp/signed-cluster.japan.sun.com.cert Using configuration from /usr/local/ssl/openssl.cnf Enter pass phrase for ./demoCA/private/cakey.pem: Check that the request matches the signature Signature ok Certificate Details: Serial Number: cd:ea:db:f4:c8:e3:93:8f (省略) Certificate is to be certified until Dec 3 11:23:45 2010 GMT (365 days) Sign the certificate? [y/n]: y 1 out of 1 certificate requests certified, commit? [y/n] y Write out database with 1 new entries Data Base Updated |
認証局(CA)でサーバ証明書をバイナリ(DER)形式に変換
keytool で証明書(鍵)データベースに保存するため,署名された証明書(signed-cluster.japan.sun.com.cert)をバイナリ(DER)形式(signed-cluster.japan.sun.com.der)に変換します.
| ca-server > openssl x509 -in /tmp/signed-cluster.japan.sun.com.cert -outform DER -out /tmp/signed-cluster.japan.sun.com.der |
認証局(CA)の証明書(cecert.pem)からX.509形式の証明書を準備
自己認証局によって署名されたサーバ証明書をGlassFishにインポートする前に,認証機関の証明書をGlassFishの証明書(鍵)データベースにインポートする必要があります.下記のように認証局のX.509形式のフォーマットを別ファイルにコピー&ペーストして保存してください.
| dashost > vi cacert.x509 “cacert.x509” [新規ファイル] —–BEGIN CERTIFICATE—– MIIDmTCCAwKgAwIBAgIJAM3q2/TI45OEMA0GCSqGSIb3DQEBBQUAMIGQMQswCQYD VQQGEwJKUDEOMAwGA1UECBMFVG9reW8xGTAXBgNVBAoTEFN1biBNaWNyb3N5c3Rl bXMxGjAYBgNVBAsTEVNvZnR3YXJlIFByYWN0aWNlMRowGAYDVQQDExFjYS1zZXJ2 ZXIuc3VuLmNvbTEeMBwGCSqGSIb3DQEJARYPY2FhZG1pbkBTdW4uQ09NMB4XDTA5 MTEwOTA0NDAwOVoXDTEyMTEwODA0NDAwOVowgZAxCzAJBgNVBAYTAkpQMQ4wDAYD VQQIEwVUb2t5bzEZMBcGA1UEChMQU3VuIE1pY3Jvc3lzdGVtczEaMBgGA1UECxMR U29mdHdhcmUgUHJhY3RpY2UxGjAYBgNVBAMTEWNhLXNlcnZlci5zdW4uY29tMR4w HAYJKoZIhvcNAQkBFg9jYWFkbWluQFN1bi5DT00wgZ8wDQYJKoZIhvcNAQEBBQAD gY0AMIGJAoGBALbumBZl+9qUSGdxADtmgW8JRlriRmwOgOoYyrifayZz7to2SB09 +gk7alqzEFz1vFA2jUZu4X8veWMP/PLFvmjwPVXtSbk3HeRWosinb0ge49sX1/Nl GOe90wGQzxci30O6V8FlHo1bWt9p/SSXZzLAtSn9Y5Au1GlpGHO4gL4hAgMBAAGj gfgwgfUwHQYDVR0OBBYEFB24TDDMoTWycjWgisz6+RecxNJKMIHFBgNVHSMEgb0w gbqAFB24TDDMoTWycjWgisz6+RecxNJKoYGWpIGTMIGQMQswCQYDVQQGEwJKUDEO MAwGA1UECBMFVG9reW8xGTAXBgNVBAoTEFN1biBNaWNyb3N5c3RlbXMxGjAYBgNV BAsTEVNvZnR3YXJlIFByYWN0aWNlMRowGAYDVQQDExFjYS1zZXJ2ZXIuc3VuLmNv bTEeMBwGCSqGSIb3DQEJARYPY2FhZG1pbkBTdW4uQ09NggkAzerb9Mjjk4QwDAYD VR0TBAUwAwEB/zANBgkqhkiG9w0BAQUFAAOBgQAyiypjUnJBMMyy615ZYM3oOUYZ 3UgwLOnos/rGGCov9CIcxiLH8PcXc3IXRYgRFDqINRhSqfDrjt4YP9cz4QmEbNqy 9wPxrje4HPYZU+AKErN7Wt058dKFSeA+Wp2JsDiwdoARy4Ow/j/tkhVoOm07E3fM TbEdS42dtkHlBgdSrw== —–END CERTIFICATE—– |
GlassFish 上で認証局の証明書をインポート
認証期間の署名書(cacert.x509)を,GlassFishが稼働するマシン上にコピーしそれぞれ証明書データベース,鍵データベースにインポートしてください.
| dashost > keytool -import -file /tmp/cacert.x509 -trustcacerts -alias private-ca -keystore keystore.jks -storepass changeit 所有者: EMAILADDRESS=caadmin@Sun.COM, CN=ca-server.sun.com, OU=Software Practice, O=Sun Microsystems, ST=Tokyo, C=JP 発行者: EMAILADDRESS=caadmin@Sun.COM, CN=ca-server.sun.com, OU=Software Practice, O=Sun Microsystems, ST=Tokyo, C=JP シリアル番号: cdeadbf4c8e39384 有効期間の開始日: Mon Nov 09 13:40:09 JST 2009 終了日: Thu Nov 08 13:40:09 JST 2012 証明書のフィンガープリント: MD5: 7C:21:2B:4A:DF:A4:5D:BF:78:1D:56:22:54:3F:4E:48 SHA1: 00:3C:55:1E:34:60:FC:77:24:38:7E:64:39:C4:38:48:79:92:2F:31 署名アルゴリズム名: SHA1withRSA バージョン: 3 (省略) この証明書を信頼しますか? [no]: yes 証明書がキーストアに追加されました。 |
| dashost > keytool -import -file /tmp/cacert.x509 -trustcacerts -alias private-ca -keystore cacerts.jks -storepass changeit 所有者: EMAILADDRESS=caadmin@Sun.COM, CN=ca-server.sun.com, OU=Software Practice, O=Sun Microsystems, ST=Tokyo, C=JP 発行者: EMAILADDRESS=caadmin@Sun.COM, CN=ca-server.sun.com, OU=Software Practice, O=Sun Microsystems, ST=Tokyo, C=JP シリアル番号: cdeadbf4c8e39384 有効期間の開始日: Mon Nov 09 13:40:09 JST 2009 終了日: Thu Nov 08 13:40:09 JST 2012 証明書のフィンガープリント: MD5: 7C:21:2B:4A:DF:A4:5D:BF:78:1D:56:22:54:3F:4E:48 SHA1: 00:3C:55:1E:34:60:FC:77:24:38:7E:64:39:C4:38:48:79:92:2F:31 署名アルゴリズム名: SHA1withRSA バージョン: 3 (省略) この証明書を信頼しますか? [no]: yes 証明書がキーストアに追加されました。 |
GlassFish上で認証局(CA)で署名されたサーバ証明書をインポート
認証局の証明書をインポートした後に,認証局で署名されたバイナリ(DER)形式のサーバ証明書を鍵データベースにインポートします。この時このサーバ証明書を識別するためのエイリアスとして cluster という名前を設定して実行します.
| dashost > keytool -import -alias cluster -file /tmp/signed-cluster.japan.sun.com.der -keystore keystore.jks -storepass changeit 証明書応答がキーストアにインストールされました。 |
署名済みサーバ証明書をインポートした後,鍵データベースの内容を確認してみましょう.
| dashost > keytool -list -keystore keystore.jks -storepass changeit キーストアのタイプ: JKS キーストアのプロバイダ: SUN キーストアには 3 エントリが含まれます。 cluster, 2009/12/03, PrivateKeyEntry, 証明書のフィンガープリント (MD5): 2A:50:2A:50:1E:B9:3F:42:DB:4C:AF:8D:48:38:AB:05 private-ca, 2009/12/03, trustedCertEntry, 証明書のフィンガープリント (MD5): 7C:21:2B:4A:DF:A4:5D:BF:78:1D:56:22:54:3F:4E:48 s1as, 2009/12/03, PrivateKeyEntry, 証明書のフィンガープリント (MD5): B0:69:F8:C5:C0:09:44:D7:0C:9A:06:4B:33:53:E0:05 |
次に,インポートしたサーバ証明書をクラスタ環境で利用できるように,クラスタで使用するSSLのサーバ証明書ニックネームを全てs1asからcluster変更します.クラスタ設定で s1as を参照するSSLの設定一覧を表示し確認します.
| dashost > asadmin get “*” | grep cluster1 | grep s1as cluster1-config.admin-service.jmx-connector.system.ssl.cert-nickname = s1as cluster1-config.http-service.http-listener.http-listener-2.ssl.cert-nickname = s1as cluster1-config.iiop-service.iiop-listener.SSL.ssl.cert-nickname = s1as cluster1-config.iiop-service.iiop-listener.SSL_MUTUALAUTH.ssl.cert-nickname = s1as cluster1.admin-service.jmx-connector.system.ssl.cert-nickname = s1as cluster1.http-service.http-listener.http-listener-2.ssl.cert-nickname = s1as cluster1.iiop-service.iiop-listener.SSL.ssl.cert-nickname = s1as cluster1.iiop-service.iiop-listener.SSL_MUTUALAUTH.ssl.cert-nickname = s1as |
s1as の証明書ニックネームを参照している全ての設定をasadmin setコマンドを使用してclusterに変更します.
| dashost > asadmin set cluster1-config.admin-service.jmx-connector.system.ssl.cert-nickname=cluster dashost > asadmin set cluster1-config.http-service.http-listener.http-listener-2.ssl.cert-nickname=cluster dashost > asadmin set cluster1-config.iiop-service.iiop-listener.SSL.ssl.cert-nickname=cluster dashost > asadmin set cluster1-config.iiop-service.iiop-listener.SSL_MUTUALAUTH.ssl.cert-nickname=cluster dashost > asadmin set cluster1.admin-service.jmx-connector.system.ssl.cert-nickname=cluster dashost > asadmin set cluster1.http-service.http-listener.http-listener-2.ssl.cert-nickname=cluster dashost > asadmin set cluster1.iiop-service.iiop-listener.SSL.ssl.cert-nickname=cluster dashost > asadmin set cluster1.iiop-service.iiop-listener.SSL_MUTUALAUTH.ssl.cert-nickname=cluster |
上記で,GlassFish のサーバ証明書の設定はすべて完了です.設定内容を反映させるため,最後にクラスタを再起動します.
| dashost > asadmin stop-cluster cluster1 クラスタ化されたインスタンス instance1 の停止に成功しました。 クラスタ化されたインスタンス instance2 の停止に成功しました。 コマンド stop-cluster は正常に実行されました。 dashost > asadmin start-cluster cluster1 クラスタ化されたインスタンス instance1 の起動に成功しました。 クラスタ化されたインスタンス instance2 の起動に成功しました。 コマンド start-cluster は正常に実行されました。 |
ブラウザからアクセスして証明書の内容を表示すると,
ca-server.sun.comによって署名されたサーバ証明書を確認できます.

ブラウザでサーバ証明書の内容を確認
SSL 設定に関するデバッグ方法
最後に、SSLの設定に関するデバッグ方法を紹介します.SSLの設定で何らかの問題が発生した場合は,下記コマンドを実行して各インスタンスのログを確認してください.
| dashost > asadmin create-jvm-options –target cluster1 “-Djavax.net.debug=ssl” コマンド create-jvm-options は正常に実行されました。 dashost > asadmin stop-cluster cluster1 クラスタ化されたインスタンス instance1 の停止に成功しました。 クラスタ化されたインスタンス instance2 の停止に成功しました。 コマンド stop-cluster は正常に実行されました。 dashost > asadmin start-cluster cluster1 クラスタ化されたインスタンス instance1 の起動に成功しました。 クラスタ化されたインスタンス instance2 の起動に成功しました。 コマンド start-cluster は正常に実行されました。 |
証明書失効リスト(CRL)のチェック方法については下記のブログを参照してください.
http://weblogs.java.net/blog/kumarjayanti/archive/2007/11/ssl_and_crl_che.html
GlassFish ドメイン管理サーバのバックアップとリストア
※ GlassFish のドメイン管理サーバのバックアップとリストアは
管理コンソールからは行えません.コマンドを使用してください.
ドメイン管理サーバが稼働するサーバが何らかの障害により起動できなくなった場合,ドメインの管理ができなくなります.ドメイン管理サーバが稼働していない状態でもサーバインスタンスを稼働させることはできますが,ドメイン管理サーバが壊れている状態ではアプリケーションの更新やリソースの設定変更等ができなくなります.このような場合、ドメイン管理サーバの設定をバックアップしておくことで,他のサーバをドメイン管理サーバの代替えとして利用することができます.バックアップはドメイン管理サーバ上で何らかの設定変更を行った際,その都度取得しておくことを推奨します.
バックアップを取得する前に,ドメイン管理サーバを停止してください.ドメイン管理サーバを停止しても提供しているサービスに影響は及びませんのでこの作業は本番稼働中に行っても問題ありません.
| dashost > asadmin stop-domain clusterDomain ドメイン clusterDomain が停止しました。 |
次にドメイン管理サーバのバックアップを行います.–domaindirには対象のドメインが含まれるディレクトリを指定します.
| dashost > asadmin backup-domain –domaindir /export/home/appserv/domains clusterDomain ドメインを正常にバックアップしました 説明: 1259776406949 バックアップファイル名: /export/home/appserv/domains/clusterDomain/backups/sjsas_backup_v00001.zip バックアップを実行した日付と時刻: Thu Dec 03 02:53:26 JST 2009 ドメインディレクトリ: /export/home/appserv/domains ドメインディレクトリ: /export/home/appserv/domains/clusterDomain ドメイン名: clusterDomain バックアップを実行したユーザーの名前: appserv |
バックアップコマンドを実行すると,sjsas_backup_vXXXXX.zipと名付けられたバックアップファイルが作成されます.このファイルをドメイン管理サーバのバックアップ用のサーバにFTP等を利用してコピーしておきます.ここではドメイン管理サーバのバックアップ用のサーバとしてnodeagent1を使用します.本番環境ではノードエージェントとは別のマシン上に構築することを推奨します.
| nodeagent1 > asadmin restore-domain –filename ./sjsas_backup_v00001.zip clusterDomain ドメイン clusterDomain の /export/home/appserv/domains/clusterDomain への復元に成功しました 説明: 1259776406949 バックアップファイル名: /export/home/appserv/domains/clusterDomain/backups/sjsas_backup_v00001.zip バックアップを実行した日付と時刻: Thu Dec 03 02:53:26 JST 2009 ドメインディレクトリ: /export/home/appserv/domains ドメインディレクトリ: /export/home/appserv/domains/clusterDomain ドメイン名: clusterDomain バックアップを実行したユーザーの名前: appser |
展開したファイル中よりドメイン管理サーバ名が記載されている箇所を手動で編集します.domains/clusterDomain/config /domain.xml中より修正する必要のある該当箇所を表示し,dashostからnodeagent1に変更します.
|
nodeagent1 > grep dashost domain.xml <property name="client-hostname" value="dashost“/> <jms-host admin-password="admin" admin-user-name="admin" host="dashost” name=”default_JMS_host” port=”5076″/> <property name="client-hostname" value="dashost“/> <jms-host admin-password="admin" admin-user-name="admin" host="dashost” name=”default_JMS_host” port=”${JMS_PROVIDER_PORT}”/> <property name="client-hostname" value="dashost“/> <jms-host admin-password="admin" admin-user-name="admin" host="dashost” name=”default_JMS_host” port=”${JMS_PROVIDER_PORT}”/> |
新しい環境上で再度環境変数を設定した後,ドメインを起動します.
| nodeagent1 > setenv AS_ADMIN_HOST nodeagent1.japan.sun.com nodeagent1 > env |grep AS AS_ADMIN_USER=clusterAdmin AS_ADMIN_PASSWORDFILE=/export/home/appserv/.passwordfile AS_ADMIN_HOST=nodeagent1.japan.sun.com AS_ADMIN_PORT=5048 nodeagent1 > asadmin start-domain clusterDomain ドメイン clusterDomain を起動しています。お待ちください。 デフォルトのログの場所は /export/home/appserv/domains/clusterDomain/logs/server.log です。 出力を /export/home/appserv/domains/clusterDomain/logs/server.log にリダイレクトしています ドメイン clusterDomain が起動しました。 ドメイン [clusterDomain] はその設定で [Sun GlassFish Enterprise Server v2.1.1 ((v2.1 Patch06)(9.1_02 Patch12)) (build b31g-fcs)] を実行しています。ログは [/export/home/appserv/domains] にあります。 管理コンソールは [http://localhost:5048] で使用できます。 “asadmin” コマンドにも同じポート [5048] を使用します。 ユーザーの Web アプリケーションは次の URL で使用できます: [http://localhost:5080 https://localhost:5081 ]。 次の web-contexts を使用できます: [/web1 /__wstx-services ]。 標準の JMX クライアント (JConsole など) はドメイン管理のために JMXServiceURL: [service:jmx:rmi:///jndi/rmi://nodeagent1.japan.sun.com:5086/jmxrmi] に接続できます。 ドメインは少なくとも次のポートで接続を待機しています: [5080 5081 5048 5037 5038 5039 5086 ]。 ドメインはアプリケーションサーバークラスタおよびその他のスタンドアロンインスタンスをサポートします。 |
上記で,ドメインのリストアは完了です.仮にドメイン管理サーバにアクセスするためにSSLを有効にしている場合にドメイン管理サーバのホスト名が変わる場合,サーバ証明書の更新も必要です.デフォルトでインストールされている自己署名サーバ証明書は変更前のドメイン管理サーバ名が記載されていますので更新の必要があります.
最後に,念のためノードエージェントが保持するドメイン管理サーバへの参照情報が更新されているか確認してください.全てのノードエージェントはagentディレクトリ中にconfigディレクトリが存在しています.このディレクトリ配下にdas.propertiesファイルが存在しており,ドメイン管理サーバへ接続するための接続情報などが記載されています.そこでファイルの内容を確認しdashostからnodeagent1に変更されていることを確認してください.仮に変更されていない場合は手動で変更してください.
| nodeagent1 > pwd /export/home/appserv/nodeagents/nodeagent1/agent/config nodeagent1 > grep das.host das.properties agent.das.host=nodeagent1 nodeagent2 > pwd /export/home/appserv/nodeagents/nodeagent2/agent/config nodeagent2 > grep das.host das.properties agent.das.host=nodeagent1 |
GlassFish クラスタとクラスタインスタンス管理(作成、削除、起動、停止)
ここでは管理ツールを使用しクラスタの管理を行う方法について紹介します.
クラスタの作成
クラスタ構成を作成するためにはcreate-clusterコマンドを使用します.コマンド引数にクラスタ名を指定してクラスタを作成します.
| asadmin create-cluster cluster1 コマンド create-cluster は正常に実行されました。 |
また,管理コンソールから左ペインの「クラスタ」を選択し右ペインの「新規…」ボタンを押すことによって作成することができます.

クラスタの作成
クラスタサーバインスタンスの作成
クラスタに所属するサーバインスタンスを作成するためには,create-instanceコマンドを実行します.コマンド引数にインスタンスを配置するノードエージェント名とクラスタ名を指定してインスタンスを作成します.
| dashost > asadmin create-instance –nodeagent nodeagent1 –cluster cluster1 instance1 コマンド create-instance は正常に実行されました。 dashost > asadmin create-instance –nodeagent nodeagent2 –cluster cluster1 instance2 コマンド create-instance は正常に実行されました |
また,クラスタに所属するサーバインスタンスは「クラスタ」作成のウィザードから「作成するサーバインスタンス(2)」のテーブルから,「新規…」ボタンを押すことによって作成することができます.この時ノードエージェントの選択コンボボックスからサーバインスタンスが稼働するノードエージェントを選択します.

クラスタインスタンスの作成
クラスタの一覧表示
ドメイン内に存在するクラスタの一覧を表示するためにはlist-clustersコマンドを使用します.またコマンドを実行すると一覧表示の他クラスタの稼働状態も表示します.
| dashost > asadmin list-clusters cluster2 実行していません cluster1 実行しています コマンド list-clusters は正常に実行されました。 |
また,管理コンソールから左ペインの「クラスタ」を選択して確認できます.

クラスタの一覧表示
クラスタの起動
クラスタの起動はstart-clusterコマンドを使用します.コマンド引数にクラスタ名を指定して起動します.
| dashost > asadmin start-cluster cluster2 クラスタ化されたインスタンス instance3 の起動に成功しました。 クラスタ化されたインスタンス instance4 の起動に成功しました。 コマンド start-cluster は正常に実行されました。 |
また,管理コンソールから左ペインの「クラスタ」を選択し右ペイン中より対象のクラスタにチェックを付け「クラスタの起動」ボタンを押すことによって作成することができます.

クラスタの起動
クラスタの停止
クラスタの停止はstop-clusterコマンドを実行します.コマンド引数にクラスタ名を指定して停止します.
| dashost > asadmin stop-cluster cluster1 クラスタ化されたインスタンス instance1 の停止に成功しました。 クラスタ化されたインスタンス instance2 の停止に成功しました。 コマンド は正常に実行されました。 |
また,管理コンソールから左ペインの「クラスタ」を選択し右ペイン中より対象のクラスタにチェックを付け「クラスタの停止」ボタンを押すことによってクラスタを停止することができます.

クラスタの停止
クラスタの削除
クラスタを削除するためには,クラスタに所属している全てのインスタンスを停止/削除した後に削除を行います.
まず,クラスタの一覧とクラスタに所属するインスタンスを表示します.
| dashost > asadmin list-clusters cluster2 実行していません cluster1 実行していません コマンド list-clusters は正常に実行されました。 dashost > asadmin list-instances instance1 実行していません instance2 実行していません instance3 実行していません instance4 実行していません コマンド list-instances は正常に実行されました。 |
次に,cluster1に属するinstance1,instance2を削除します.
| dashost > asadmin delete-instance instance1 コマンド delete-instance は正常に実行されました。 dashost > asadmin delete-instance instance2 コマンド delete-instance は正常に実行されました。 |
最後にcluster1を削除します.
| dashost > asadmin delete-cluster cluster1 コマンド delete-cluster は正常に実行されました。 |
また,管理コンソールから左ペインの「クラスタ」を選択し右ペイン中より対象のクラスタにチェックを付け「削除」ボタンを押すことによってクラスタを削除することができます.管理コンソールから削除を実行すると,クラスタ内に属する全てのインスタンスも同時に削除する事ができます.

クラスタの削除
GlassFish スタンドアローンインスタンス管理(作成、削除、起動、停止)
スタンドアローンサーバインスタンスの作成
スタンドアローンサーバインスタンスを追加するためにはcreate-instanceコマンドを実行します.サーバインスタンスが稼働するノードエージェント名を指定して作成します.複数のインスタンスを作成する際は,必ずノードエージェントの指定が必要です.そこで,開発者プロファイルを利用している場合,もしくはノードエージェントを作成していない場合は,新たにサーバインスタンスを作成することができませんので,ご注意ください.
|
dashost > asadmin create-instance –nodeagent nodeagent1 instance1 コマンド create-instance は正常に実行されました |
上記のようにサーバインスタンスで使用する各種ポート番号を明示的に指定せずにサーバインスタンスを作成する場合は,極力既存の全てのサーバインスタンスを起動している状態で作成作業を行ってください.ポート番号を指定せずに実行した場合,コマンド内部で自動的に未使用のポート番号を探し出して新規インスタンス用に割り当てます.他のサーバインスタンスが停止している状態でコマンドを実行した場合,他で使用しているポート番号と競合する可能性があり,正常にサーバインスタンスが起動できない場合があります.作成するインスタンスで使用する各種ポート番号を指定したい場合は,下記のように–systempropertiesを付加して各種ポート番号を指定する事もできます.
|
dashost > asadmin create-instance –user clusterAdmin –host sw-103 –port 5048 –nodeagent nodeagent1 –systemproperties HTTP_LISTENER_PORT=5180:HTTP_SSL_LISTENER_PORT=51443:IIOP_LISTENER_PORT=5138:IIOP_SSL_LISTENER_PORT=5137:IIOP_SSL_MUTUALAUTH_PORT=5139:JMX_SYSTEM_CONNECTOR_PORT=5140 instance1 コマンド create-instance は正常に実行されました。 |
また,管理コンソールから左ペインの「スタンドアロンインスタンス」を選択し右ペインの「新規…」ボタンを押すことによって新規インスタンスを追加することができます.

新規スタンドアローンインスタンスの追加
サーバインスタンスの一覧表示
サーバインスタンスの一覧を確認するためにはlist-instancesコマンドを使用します.コマンドを実行すると一覧表示の他インスタンスの稼働状態も表示します.
|
dashost > asadmin list-instances instance1 実行しています instance2 実行していません コマンド list-instances は正常に実行されました。 |
また,管理コンソールから左ペインの「スタンドアロンインスタンス」を選択して確認できます.

インスタンスの一覧表示
サーバインスタンスの起動
サーバインスタンスの起動はstart-instanceコマンドを使用します.実行時にインスタンス名を指定して起動します.
|
dashost > asadmin start-instance instance2 コマンド start-instance は正常に実行されました。 |
また,管理コンソールから左ペインの「スタンドアロンインスタンス」を選択し右ペインの「起動」ボタンを押すことによってインスタンスを起動することができます.

サーバインスタンスの起動
もしくは,管理コンソールから左ペインから対象の「スタンドアロンインスタンス」を選択し右ペインの「インスタンスの起動」ボタンを押すことによってインスタンスを起動することができます.

サーバインスタンスの起動
サーバインスタンスの停止
サーバインスタンスの停止はstop-instanceコマンドを実行します.コマンド引数にインスタンス名を指定して停止します.
|
dashost > asadmin stop-instance instance1 コマンド stop-instance は正常に実行されました |
また,管理コンソールから左ペインの「スタンドアロンインスタンス」を選択し右ペインの「停止」ボタンを押すことによってインスタンスを停止することができます.

サーバインスタンスの停止
もしくは,直接左ペインから対象の「スタンドアロンインスタンス」を選択して右ペインの「インスタンスの停止」ボタンを押すことによってインスタンスを停止することができます.

サーバインスタンスの停止
サーバインスタンスの削除
インスタンスの削除はdelete-instanceコマンドを実行します.コマンド引数にインスタンス名を指定して削除します.
|
dashost > asadmin delete-instance –user clusterAdmin –host sw-103 –port 5048 instance1 コマンド delete-instance は正常に実行されました。 |
また,管理コンソールから左ペインの「スタンドアロンインスタンス」を選択し右ペインの「削除」ボタンを押すことによってインスタンスを削除することができます.

サーバインスタンスの削除
GlassFish ノードエージェント管理(作成、削除、起動、停止、ログ設定)
ノードエージェントの作成
ノードエージェントを作成するためには,ドメイン管理サーバ上で create-node-agent-config コマンドを実行しノードエージェント(参照情報のみ)を作成します.下記の例では2つのノードエージェントを作成しています.
| dashost > asadmin create-node-agent-config nodeagent1 コマンド create-node-agent-config は正常に実行されました。 dashost > asadmin create-node-agent-config nodeagent2 コマンド create-node-agent-config は正常に実行されました |
次にノードエージェントを稼働させるマシン上でそれぞれ create-node-agent コマンドを実行します.この時ドメイン管理サーバ上で指定したノードエージェント名と同一のエージェント名を指定する必要があります.
| nodeagent1 > asadmin create-node-agent –user clusterAdmin –host dashost –port 5048 –savemasterpassword=true nodeagent1 コマンド create-node-agent は正常に実行されました。 |
| nodeagent2 > asadmin create-node-agent –user clusterAdmin –host dashost –port 5048 –savemasterpassword=true nodeagent2 コマンド create-node-agent は正常に実行されました。 |
便宜上ノードエージェントを稼働させるマシン上で create-node-agent コマンドを実行すると,「参照情報」と,「ノードエージェントの実体」の両方が同時に生成されます.しかし内部的には参照情報の設定とノードエージェントの実体は別々に作成されていることに注意してください.
このように,参照情報とノードエージェントの作成が別々に行われる理由は,ノードエージェントをオフラインで管理ができるようにするためです.例えば,実体であるノードエージェントが停止状態でも,ドメイン管理サーバ上で管理しているノードエージェントの参照情報に対してインスタンスを追加することができます.そしてノードエージェントの実体を起動した時にドメイン管理サーバで保持するノードエージェントの参照(設定)情報と同期をとりインスタンスの実体が生成されます.
管理コンソールからは,ドメイン管理サーバで管理する参照情報のみ作成することができます.参照情報を作成した後,別途ノードエージェントが稼働するマシン上でノードエージェントの実体を作成してください.
管理コンソールの左ペインから「ノードエージェント」を選択し、右ペインより「新規…」ボタンを押すことによってノードエージェントの参照情報を作成することができます.

ノードエージェントの参照情報の作成
ノードエージェントの一覧表示
ノードエージェントの一覧を確認するためにはlist-node-agentsコマンドを使用します.コマンドを実行すると一覧表示の他ノードエージェントの稼働状態も表示します.
| dashost > asadmin list-node-agents nodeagent1 実行しています nodeagent2 実行していません コマンド list-node-agents は正常に実行されました。 |
また,管理コンソールからは,左ペインの「ノードエージェント」を選択して確認できます.

ノードエージェントの一覧表示
ノードエージェントの起動
ノードエージェントを起動するためには,ノードエージェントが稼働するマシン上で start-node-agent コマンドを実行します.
| nodeagent1 > asadmin start-node-agent nodeagent1 出力を /export/home/appserv/nodeagents/nodeagent1/agent/logs/server.log にリダイレクトしていますアプリケーション出力を /export/home/appserv/nodeagents/nodeagent1/agent/logs/server.log にリダイレクトします コマンド start-node-agent は正常に実行されました。 |
ノードエージェントの停止
ノードエージェントを停止するためには,ノードエージェントが稼働するマシン上で stop-node-agent コマンドを実行します.
| nodeagent1 > asadmin stop-node-agent nodeagent1 コマンド stop-node-agent は正常に実行されました |
ノードエージェントのログ設定
ノードエージェントのログに関する設定を行う前に,現在設定されているログの設定情報を get コマンドを実行して確認します.
| dashost > asadmin get “domain.node-agent.nodeagent1.log-service.*” domain.node-agent.nodeagent1.log-service.alarms = false domain.node-agent.nodeagent1.log-service.file = ${com.sun.aas.instanceRoot}/logs/server.log domain.node-agent.nodeagent1.log-service.log-filter = domain.node-agent.nodeagent1.log-service.log-handler = domain.node-agent.nodeagent1.log-service.log-rotation-limit-in-bytes = 500000 domain.node-agent.nodeagent1.log-service.log-rotation-timelimit-in-minutes = 0 domain.node-agent.nodeagent1.log-service.log-to-console = false domain.node-agent.nodeagent1.log-service.retain-error-statistics-for-hours = 5 domain.node-agent.nodeagent1.log-service.use-system-logging = false |
ここで例えば、set コマンドを実行しログローテーションのファイルサイズを 500Kb から 1Mb に変更してみます。
下記を実行してください.
| dashost > asadmin set domain.node-agent.nodeagent1.log-service.log-rotation-limit-in-bytes=1000000 domain.node-agent.nodeagent1.log-service.log-rotation-limit-in-bytes = 1000000 |
上記の設定内容を確認するため get コマンドを実行します.
| dashost > asadmin get domain.node-agent.nodeagent1.log-service.log-rotation-limit-in-bytes domain.node-agent.nodeagent1.log-service.log-rotation-limit-in-bytes = 1000000 |
また,ノードエージェントに関する各種設定は,管理コンソールからも行えます.

ノードエージェントの各種設定
ノードエージェントの削除
ノードエージェントを削除する前に,ノードエージェント上で稼働している全てのインスタンス,全てのアプリケーションを停止していることを確認してください.ノードエージェント上にリソースが残っている場合,ノードエージェントの削除に失敗します.
全てのリソースを削除した後に,ノードエージェントが稼働するマシン上で delete-node-agent コマンドを実行し実体を削除します.下記のコマンドを実行するとファイルやディレクトリを全て削除します.
| nodeagent1 > asadmin delete-node-agent nodeagent1 コマンド delete-node-agent は正常に実行されました。 |
次に、delete-node-agent-configコマンドを実行し,ドメイン管理サーバ上で保持するノードエージェントの参照情報を削除します.
| dashost > asadmin delete-node-agent-config –user clusterAdmin –host dashost –port 5048 nodeagent1 コマンド delete-node-agent-config は正常に実行されました。 |
ノードエージェントの参照情報は管理コンソールからも削除できます.管理コンソールの左ペインから「ノードエージェント」を選択し,右ペインより削除対象のノードエージェントにチェックを付け,削除ボタンを押す事により削除できます.

ノードエージェントの参照情報の削除
GlassFish サーバインスタンス
サーバインスタンス
サーバインスタンスはエンドユーザ向けにサービスを提供するJava EE 5の 仕様に完全準拠したJava EEのプロセスです.1つのドメ イン内には複数のサーバインスタンスを作成する事ができます.また物理的にハードウェアが異なる環境上でインスタンスを作成する事もできます.ドメイン内 で複数のサーバインスタンスを作成する場合,それぞれのサーバインスタンスを識別するために,異なる名前を設定する必要があります.
サーバインスタンスは下記の2種類のいずれかの方法で作成できます.
- クラスタに所属しないインスタンス
- クラスタに所属しないインスタンス
クラスタについては別途,詳細に説明しますが,複数のサーバインスタンスを作成する環境では,クラスタへの所属の有無に応じて,アプリケーションの配備やリソース設定等の管理方法が大幅に異なってきます.具体的に はクラスタに属する全てのインスタンスは,クラスタに対する設定情報が各インスタンスに完全に引き継がれるため,たった1度のクラスタに対する操作で全て のインスタンスに対して反影されます.このようにクラスタに所属するインスタンスは,同じアプリケーションを負荷分散や高化用性を実現するために複数台の マシンで実行したいような場合に有効です.一方,クラスタに所属しないインスタンスは,各インスタンス間で設定情報を独立に設定するため,リソース設定を 個別に管理したい場合,単一のアプリケーションを別のJava VMプ ロセスで稼働させたい場合,もしくは異なるアプリケーションをそれぞれ別のJava VMの プロセスで稼働させたいような場合に有効です.
サーバインスタンスのアーキテクチャを「図5:サーバインスタンスのアーキテク チャ」に示します.のようにプロセス内にEJBコンテナやWebコンテナ等を含み,各種クライアントからの要求を受け 付けます.

図 5:サーバインスタンスのアー キテクチャ
サーバインスタンス単位,もしくはクラスタ構成単位に「図6: インスタンス毎の設定項目」に示す項目の設定が可能です.

図 6:インスタンス毎の設定項目

