はじめに
Payara サーバを以下のように起動すると、デフォルトのドメインである domain1
が起動します。
asadmin> start-domain
domain1
は、GlassFishで定義されたデフォルトのドメインと同様であり、開発やテスト用途向けの設定となっています。
幸い Payara Server には、Payara開発チームが推奨する商用環境向けにカスタマイズされた、payaradomain
が準備されています。
Production Ready Domain
start-domain
サブコマンドに production
を指定することで、Production Ready Domain が起動します。
asadmin> start-domain production
payaradomain
は ${PAYARA_HOME}/glassfish/domains/
配下に配備されます。
payaradomain
のテンプレートは、${PAYARA_HOME}/glassfish/common/templates/gf
にある payara-domain.jar
により提供されます。
以下のようにテンプレートJar を明示的に指定してドメインを作成することもできます。
asadmin> create-domain --template ${PAYARA_HOME}/glassfish/common/templates/gf/payara-domain.jar myDomain
ドメイン作成時には、admin ユーザ名とパスワードの登録が求められます。
payaradomain と domain1 の違い
payaradomain
は domain1
と比較して以下の違いがあります。
- 自動デプロイメントの無効化
- Payara Server にはデプロイメントスキャナーが搭載されているが、これは本番環境ではセキュリティリスクがあるため、
domain.xml
で無効化されている
- Payara Server にはデプロイメントスキャナーが搭載されているが、これは本番環境ではセキュリティリスクがあるため、
- 動的なアプリケーションの再読み込みの無効化
- 上記と同じ理由で、これは
domain.xml
でデフォルトで無効化
- 上記と同じ理由で、これは
default-web.xml
内のJSPページの動的リロードの無効化default-web.xml
の<init-param>
設定reload-interval
に1
の値が設定されているため、無効化
- EJBコンテナの
max-pool-size
は128
に設定 thread-pool-1
のmax-thread-pool-size
設定は250
に増加- デフォルトのHTTPリスナー(
http-listener-1
およびhttp-listener-2
)の両方でファイルキャッシュが有効 - 分離されたクラスローディングがサーバーレベルでデフォルトで有効
- プロパティ
fish.payara.classloading.delegate
がfalse
に設定
- プロパティ
- xaおよび非xaのトランザクションに対して、デフォルトのトランザクションタイムアウトが300秒に設定
- デフォルトのグループ-ロールマッピングが有効
- スレッドプール
http-thread-pool
の最大サイズが5
から50
に増加
payaradomain
での JVM オプションは、JDK 8 以降向けの設定となっており、以下の設定となっています(payaradomain
のみの設定)。
-Xmx2g
(Payara 4, 5)-Xms2g
(Payara 4, 5)-XX:+UseG1GC
(Payara 4, 5)-XX:+UseStringDeduplication
(Payara 4, 5)-XX:MaxGCPauseMillis=500
(Payara 5)-XX:MetaspaceSize=256m
(Payara 5)-XX:MaxMetaspaceSize=2g
(Payara 5)-XX:+IgnoreUnrecognizedVMOptions
(Payara 5)
以下のJVMオプションは domain1
のみの設定です。
-Xmx512m
(Payara 4, 5)-Djavax.management.builder.initial=com.sun.enterprise.v3.admin.AppServerMBeanServerBuilder
(Payara 4, 5)-Dorg.glassfish.additionalOSGiBundlesToStart=org.apache.felix.shell,org.apache.felix.gogo.runtime,org.apache.felix.gogo.shell,org.apache.felix.gogo.command,org.apache.felix.shell.remote,org.apache.felix.fileinstall
(Payara 4, 5)-Dosgi.shell.telnet.port=6666
(Payara 4, 5)-Dosgi.shell.telnet.maxconn=1
(Payara 4, 5)-Dosgi.shell.telnet.ip=127.0.0.1
(Payara 4, 5)-Dgosh.args=--nointeractive
(Payara 4, 5)-Dfelix.fileinstall.dir=${com.sun.aas.installRoot}/modules/autostart/
(Payara 4, 5)-Dfelix.fileinstall.poll=5000
(Payara 4, 5)-Dfelix.fileinstall.log.level=2
(Payara 4, 5)-Dfelix.fileinstall.bundles.new.start=true
(Payara 4, 5)-Dfelix.fileinstall.bundles.startTransient=true
(Payara 4, 5)-Dfelix.fileinstall.disableConfigSave=false
(Payara 4, 5)-Dcom.ctc.wstx.returnNullForDefaultNamespace=true
(Payara 4, 5)-XX:MaxPermSize=192m
(Payara 4)-client
(Payara 5)-XX:NewRatio=2
(Payara 5)-Dcom.sun.enterprise.security.httpsOutboundKeyAlias=s1as
(Payara 5)
以下のJVMオプションは、domain1
と payaradomain
の双方にある設定です。
-Djava.awt.headless=true
(Payara 4, 5)-Djdk.corba.allowOutputStreamSubclass=true
(Payara 4, 5)-Djavax.xml.accessExternalSchema=all
(Payara 4, 5)-XX:+UnlockDiagnosticVMOptions
(Payara 4, 5)-Djava.security.policy=${com.sun.aas.instanceRoot}/config/server.policy
(Payara 4, 5)-Djava.security.auth.login.config=${com.sun.aas.instanceRoot}/config/login.conf
(Payara 4, 5)-Djavax.net.ssl.keyStore=${com.sun.aas.instanceRoot}/config/keystore.jks
(Payara 4, 5)-Djavax.net.ssl.trustStore=${com.sun.aas.instanceRoot}/config/cacerts.jks
(Payara 4, 5)-Djdbc.drivers=org.apache.derby.jdbc.ClientDriver
(Payara 4, 5)-DANTLR_USE_DIRECT_CLASS_LOADING=true
(Payara 4, 5)-Dcom.sun.enterprise.config.config_environment_factory_class=com.sun.enterprise.config.serverbeans.AppserverConfigEnvironmentFactory
(Payara 4, 5)-Djdk.tls.rejectClientInitiatedRenegotiation=true
(Payara 4, 5)-Dorg.jboss.weld.serialization.beanIdentifierIndexOptimization=false
(Payara 4, 5)-Dorg.glassfish.grizzly.DEFAULT_MEMORY_MANAGER=org.glassfish.grizzly.memory.HeapMemoryManager
(Payara 4, 5)-XX:NewRatio=2
(Payara 4)-Djava.endorsed.dirs=${com.sun.aas.installRoot}/modules/ (Payara 4)endorsed${path.separator}${com.sun.aas.installRoot}/lib/endorsed
(Payara 4)-Dcom.sun.enterprise.security.httpsOutboundKeyAlias=s1as
(Payara 4)-Djava.ext.dirs=${com.sun.aas.javaRoot}/lib/ext${path.separator}${com.sun.aas.javaRoot}/jre/lib/ext${path.separator}${com.sun.aas.instanceRoot}/lib/ext
(Payara 4)-Xbootclasspath/p:${com.sun.aas.installRoot}/lib/grizzly-npn-bootstrap.jar
(Payara 5)
Java9以降では endorsed と ext ディレクトリのサポートがなくなったため、Payara 5.192 からは java.endorsed.dirs
と java.ext.dirs
オプションが削除されています。
その他の変更/追加すべき設定
payaradomain
の設定に加え、変更/追加を検討すべきものがあります。
ヒープサイズ
payaradomain
では 2g
と設定されていますが、アプリケーションの特性に応じて変更を検討すべきでしょう。
G1GC が有効なため、以前のように Stop The World にシビアにならず、比較的大きな設定でも良いでしょう(そもそもG1GCは大きなヒープでないと効果的ではない)。
以下の例では、8g に変更する例となります。
asadmin> delete-jvm-options '-Xms2g' asadmin> delete-jvm-options '-Xmx2g' asadmin> create-jvm-options '-Xms8g' asadmin> create-jvm-options '-Xmx8g'
Payara 4 では MaxMetaspaceSize
が設定されないため、以下のような Metaspace の最大値の制限を設けるべきです。
asadmin> create-jvm-options '-XX\:MaxMetaspaceSize=2g'
Server header と X-Powered-By header の削除
セキュリティ観点で不要な情報は出力しない方がよいので、以下の設定を行い、Server と X-Powered-By ヘッダを削除します。
asadmin> create-jvm-options '-Dproduct.name=' asadmin> set configs.config.server-config.network-config.protocols.protocol.http-listener-1.http.xpowered-by=false
docroot 設定 と エラーページ
以下の docroot のファイルを削除し、自身の index.html
に置き換えておきましょう。
${PAYARA_HOME}\glassfish\domains\kronos\docroot
必要に応じて HTTPエラー用のページを準備します。
asadmin> set server.http-service.virtual-server.server.property.send-error_1="code=404 path=${com.sun.aas.instanceRoot}/docroot/index.html reason=not_found" asadmin> set server.http-service.virtual-server.server.property.send-error_2="code=500 path=${com.sun.aas.instanceRoot}/docroot/index.html reason=internal_server_error" asadmin> set server.http-service.virtual-server.server.property.send-error_3="code=503 path=${com.sun.aas.instanceRoot}/docroot/index.html reason=service_unavailable"
各種ログ設定
必要に応じてアクセスログの出力設定を行います。
asadmin> set configs.config.server-config.http-service.access-log.format="%client.name% %auth-user-name% %datetime% %request% %status% %response.length% %referer% %user.agent% %header.X-Forwarded-For%" asadmin> set configs.config.server-config.http-service.access-logging-enabled=true asadmin> set configs.config.server-config.http-service.virtual-server.server.access-log=/logs/access
サーバログの出力先についても、特定のディレクトリにまとめて出力されるように設定すると良いでしょう。
asadmin> set-log-attributes com.sun.enterprise.server.logging.GFFileHandler.file='/logs/glassfish/service.log' asadmin> set server-config.http-service.virtual-server.server.log-file=/logs/glassfish/service.log asadmin> set server-config.http-service.virtual-server.__asadmin.log-file=/logs/glassfish/service.log
GCログは必須でしょう。
asadmin> create-jvm-options '-verbose\:gc' asadmin> create-jvm-options '-XX\:+PrintGCTimeStamps' asadmin> create-jvm-options '-XX\:+PrintGCDateStamps' asadmin> create-jvm-options '-XX\:+PrintGCDetails' asadmin> create-jvm-options '-XX\:+PrintClassHistogram' asadmin> create-jvm-options '-Xloggc\:/logs/glassfish/gc/gc.log' asadmin> create-jvm-options '-XX\:+UseGCLogFileRotation' asadmin> create-jvm-options '-XX\:NumberOfGCLogFiles=20' asadmin> create-jvm-options '-XX\:GCLogFileSize=10m'
合わせてヒープダンプの設定も加えておくと良いでしょう。
asadmin> create-jvm-options '-XX\:HeapDumpPath=/logs/glassfish/java_heapDump' asadmin> create-jvm-options '-XX\:+HeapDumpOnOutOfMemoryError'
タイムアウト設定
もし長時間のリクエストを扱う必要がある場合はhttp-listener-1
http-listener-2
のタイムアウトを設定します。
デフォルトは900秒なので、以下のようにアプリケーションに応じた値を設定します。
asadmin> set configs.config.server-config.network-config.protocols.protocol.http-listener-1.http.request-timeout-seconds=1800 asadmin> set configs.config.server-config.network-config.protocols.protocol.http-listener-2.http.request-timeout-seconds=1800
1
を設定するとタイムアウトなし(無制限)となりますが、これはお勧めしません。
必要に応じて、トランザクションタイムアウトも設定します。
デフォルトでは、xa および 非xa のトランザクションタイムアウトは300秒です。
例えばタイムアウト無しとする場合には以下のように設定します(0
でタイムアウト無し)。
asadmin> set configs.config.server-config.transaction-service.timeout-in-seconds=0 asadmin> set configs.config.server-config.transaction-service.property.xaresource-txn-timeout=0
JVM の固定
JAVA は環境変更で想定しないものが使われないように、以下で明示的に指定しておくと良いです。
${PAYARA_HOME}\glassfish\config\asenv.bat
にJavaホームを設定します。
set AS_JAVA=<PATH_TO_JAVAHOME>
${PAYARA_HOME}\glassfish\config\asenv.conf
にも同様に設定します。
AS_JAVA="<PATH_TO_JAVAHOME>"
まとめ
Payara サーバの商用環境向けの設定項目について紹介しました。
アプリケーションや環境に応じて、その他多くの項目はありますが、最低限ここに記した内容は設定しておくと良いでしょう。