商用環境向けPayara サーバで行うべき設定

f:id:Naotsugu:20210827225714p:plain


はじめに

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 の違い

payaradomaindomain1 と比較して以下の違いがあります。

  • 自動デプロイメントの無効化
    • Payara Server にはデプロイメントスキャナーが搭載されているが、これは本番環境ではセキュリティリスクがあるため、domain.xml で無効化されている
  • 動的なアプリケーションの再読み込みの無効化
    • 上記と同じ理由で、これは domain.xml でデフォルトで無効化
  • default-web.xml 内のJSPページの動的リロードの無効化
    • default-web.xml<init-param> 設定 reload-interval1 の値が設定されているため、無効化
  • EJBコンテナの max-pool-size128 に設定
  • thread-pool-1max-thread-pool-size 設定は 250 に増加
  • デフォルトのHTTPリスナー(http-listener-1およびhttp-listener-2)の両方でファイルキャッシュが有効
  • 分離されたクラスローディングがサーバーレベルでデフォルトで有効
    • プロパティ fish.payara.classloading.delegatefalse に設定
  • 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オプションは、domain1payaradomain の双方にある設定です。

  • -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 サーバの商用環境向けの設定項目について紹介しました。

アプリケーションや環境に応じて、その他多くの項目はありますが、最低限ここに記した内容は設定しておくと良いでしょう。