본문으로 건너뛰기

4. WAS 종류별 에이전트 설정 방법

이 장에서 하는 일

3장에서 받은 에이전트를 각 WAS 제품의 기동 옵션에 실제로 넣는 방법을 다룹니다.

왜 제품마다 다른가

넣어야 할 내용은 어느 제품이든 같습니다.

-javaagent:<에이전트 jar 경로> # 에이전트를 JVM 에 붙인다
-Dkhan.config.file=<설정 파일 이름> # 어느 설정을 쓸지 지정한다 (인스턴스가 여러 개일 때)

다른 것은 이 옵션을 어디에 적는가입니다. WAS 제품마다 기동 옵션을 읽는 파일과 변수 이름이 다릅니다.

제품적는 곳변수
Spring Boot실행 명령 또는 기동 스크립트JAVA_OPTS
Tomcatbin/setenv.shCATALINA_OPTS · JAVA_OPTS
JBoss EAP · WildFly (Standalone)bin/standalone.confJAVA_OPTS
JBoss EAP · WildFly (Domain)domain.xml · host-slave.xml<jvm-options>
WebLogicsetDomainEnv.sh 또는 기동 스크립트JAVA_OPTIONS
JEUSJEUSMain.xml · domain.xml<command-option> · <jvm-option>
Jettystart.ini 또는 기동 스크립트JAVA_OPTIONS
Resinconf/resin.xml<jvm-arg>

찾는 법이 애매하면 지금 WAS 를 띄우는 스크립트나 설정 파일에서 -Xmx 처럼 이미 들어 있는 JVM 옵션을 찾으십시오. 그 옆이 에이전트 옵션을 넣을 자리입니다.

공통으로 지켜야 할 것

  • 경로는 절대 경로로 적습니다. 상대 경로는 WAS 가 어느 디렉터리에서 뜨는지에 따라 달라집니다.
  • 옵션은 기동 시점에만 읽힙니다. 고친 뒤 반드시 WAS 를 재기동해야 적용됩니다.
  • Java 9 이상이면 추가 옵션이 더 필요합니다. 이 장 마지막의 Java 9 이상 추가 옵션을 함께 넣으십시오.
  • -noverify · -Xverify:none 은 넣지 마십시오. 예전 안내에 있던 옵션이지만 지금은 필요 없고, 운영 중 JVM 이 비정상 종료될 수 있습니다 (6장 참고).

쓰는 제품으로 바로 가기

제품특별히 주의할 것
Spring Boot실행 명령-javaagent-jar
JBoss EAP 6·7 Standalonestandalone.conf로그 관리자 옵션 3종 필수
JBoss EAP 6·7 Domaindomain.xml · host-slave.xml스크립트가 아니라 XML
WildFly 14standalone.confJava 11 은 -Xbootclasspath/a
JBoss EAP 5.xrun.conf설정이 가장 단순
Tomcatcatalina.sh 또는 setenv.sh둘 중 하나만 — 양쪽에 넣으면 두 번 붙음
WebLogicsetDomainEnv.sh변수가 JAVA_OPTIONS
JEUS 6JEUSMain.xmlJMX 옵션 없으면 데이터소스 안 보임
JEUS 7/8domain.xml태그가 <jvm-option>
Jetty 9jetty.sh변수가 JAVA_OPTIONS
Resin 4.xconf/resin.xmlwatchdog 때문에 XML 에

각 절은 고칠 파일 → 주의할 점 → 예제 순서로 되어 있습니다. 예제의 경로와 설정 파일 이름은 환경에 맞게 바꾸십시오.

설정한 뒤 확인하는 법

WAS 를 재기동한 뒤 실제로 붙은 JVM 옵션을 봅니다. 파일에 적었어도 다른 스크립트가 JAVA_OPTS 를 덮어써 사라지는 일이 흔합니다.

$ ps -ef | grep java

출력에 -javaagent:…khan-agent…jar 가 보이면 붙은 것입니다. 보이지 않으면 옵션을 적은 자리가 기동 경로에서 실제로 읽히는지 확인하십시오.

옵션은 보이는데 콘솔에 안 나타나면 접속 정보 문제입니다 — khan-agent.confkhan.host·khan.port 와 방화벽을 확인하십시오 (3장 참고).

Spring Boot

고칠 파일 — 애플리케이션을 띄우는 기동 스크립트(없으면 java -jar 실행 명령). Spring Boot 는 WAS 설정 파일이 따로 없어 실행 명령에 직접 붙입니다.

주의할 점-javaagent 는 반드시 -jar 에 와야 합니다. 뒤에 두면 JVM 옵션이 아니라 애플리케이션 인자로 넘어가 에이전트가 붙지 않습니다.

컨테이너로 띄운다면 JAVA_TOOL_OPTIONS 환경변수로 주는 방법도 있습니다 — 5장 컨테이너·쿠버네티스에 설치 참고.

KHAN_AGENT_FILE=$(ls /data/test/tomcat/servers/khan-agent/khan-agent*.jar | sort -Vr | head -n 1)
export AGENT_OPTS=" -javaagent:$KHAN_AGENT_FILE "
#export AGENT_OPTS=" -javaagent:/svc/test/khan-agent/khan-agent.jar "
export AGENT_OPTS="$AGENT_OPTS -Dkhan.config.file=khan-agent-test11.conf"
export JAVA_OPTS="$AGENT_OPTS $JAVA_OPTS"

java -jar $JAVA_OPTS openmaru-dashboard-server-5.1.0.jar

JBoss EAP 6.x, 7.x Standalone 모드

고칠 파일 — 기동 시 JVM 옵션을 읽는 자리면 어디든 됩니다. 흔한 자리는 세 곳입니다.

자리어떤 경우에
bin/standalone.confJBoss 기본 구성을 그대로 쓸 때
env.sh 같은 자체 기동 스크립트사이트에서 기동 스크립트를 따로 두고 쓸 때. 아래 예제가 이 방식입니다
start.shenv.sh 를 읽어 실제로 띄우는 스크립트 — 여기서 JAVA_OPTS 를 넘깁니다

예제는 env.sh 에 옵션을 모으고 start.sh 가 그것을 JAVA_OPTS 로 넘기는 구성입니다. standalone.conf 하나만 쓴다면 두 예제의 내용을 그 파일에 합쳐 넣으면 됩니다.

왜 설정이 복잡한가 — JBoss 는 자체 로그 관리자(JBoss LogManager)를 쓰는데, 에이전트가 JVM 시작 시점에 먼저 로드되면서 로그 관리자보다 앞서 클래스를 건드립니다. 그대로 두면 기동 중 LogManager 오류로 멈춥니다. 그래서 아래 세 가지를 함께 넣습니다.

옵션무엇을 하나
-Djava.util.logging.manager=…LogManagerJBoss 로그 관리자를 쓰도록 못 박습니다
-Xbootclasspath/p:…jboss-logmanager*.jar그 로그 관리자를 에이전트보다 먼저 읽게 합니다
-Djboss.modules.system.pkgs=…에이전트 패키지를 JBoss 모듈 격리에서 제외합니다

jboss.modules.system.pkgs 에는 com.opennaru.khan.agentorg.jboss.logmanager 를 함께 적어야 합니다. 하나라도 빠지면 ClassNotFoundException 이 납니다.

JBoss EAP의 경우 JBoss LogManager의 설정이 필요합니다.

jboss.modules.system.pkgscom.opennaru.khan.agentorg.jboss.logmanager 패키지를 등록하여 합니다.

  • env.sh (6.x)
export AGENT_OPTS=" -javaagent:/svc/test/khan-agent/khan-agent.jar "
#export AGENT_OPTS=" -javaagent:$(getKhanAgentPath :/svc/test/khan-agent) "
export AGENT_OPTS="$AGENT_OPTS -Dkhan.config.file=khan-agent-test11.conf"

export JAVA_OPTS="$JAVA_OPTS -Djava.util.logging.manager=org.jboss.logmanager.LogManager"
export JBOSS_LOGMANAGER_DIR="$JBOSS_HOME/modules/system/layers/base/org/jboss/logmanager/main"
export JBOSS_LOGMANAGER_JAR=`cd "$JBOSS_LOGMANAGER_DIR" && ls -1 *.jar`
#export JBOSS_LOGMANAGER_JAR=$(getLogmanagerPath "$JBOSS_HOME")

export JAVA_OPTS="$JAVA_OPTS -Xbootclasspath/p:$JBOSS_LOGMANAGER_DIR/$JBOSS_LOGMANAGER_JAR"
export JAVA_OPTS=" $JAVA_OPTS -Djboss.modules.system.pkgs=org.jboss.byteman,com.opennaru.khan.agent,org.github.jamm,org.jboss.logmanager"
  • env.sh (7.x)
## 아래 각 옵션 순서 중요
export AGENT_OPTS=" -javaagent:/home/icfcgw/khan-agent/khan-agent-5.1.0.jar "
export AGENT_OPTS="$AGENT_OPTS -Dkhan.config.file=khan-agent-icfcgw.conf "

## JBoss EAP가 패치된 경우 $JBOSS_HOME/modules/system/layers/base/.overlays/ 하위에서 탐색
## log4j-jboss-logmanager와 혼동하지 않도록 해야함
export JAVA_OPTS="$JAVA_OPTS -Djava.util.logging.manager=org.jboss.logmanager.LogManager "
export JBOSS_LOGMANAGER_DIR="$JBOSS_HOME/modules/system/layers/base/org/jboss/logmanager/main"
export JBOSS_LOGMANAGER_JAR=cd "$JBOSS_LOGMANAGER_DIR" && ls -1 *.jar
export JBOSS_WILDFLY_COMMON_DIR="$JBOSS_HOME/modules/system/layers/base/org/wildfly/common/main"
export JBOSS_WILDFLY_COMMON_JAR=cd "$JBOSS_WILDFLY_COMMON_DIR" && ls -1 *.jar

export JAVA_OPTS="$JAVA_OPTS -Xbootclasspath/p:$JBOSS_LOGMANAGER_DIR/$JBOSS_LOGMANAGER_JAR:$JBOSS_WILDFLY_COMMON_DIR/$JBOSS_WILDFLY_COMMON_JAR"
export JAVA_OPTS="$JAVA_OPTS -Djboss.modules.system.pkgs=org.jboss.byteman,com.opennaru.khan.agent,org.github.jamm,\
org.jboss.logmanager,org.wildfly.common.net.HostName"

## java 11이상의 경우 필수
export JAVA_OPTS=" $JAVA_OPTS -Dsun.util.logging.disableCallerCheck=true "

export JAVA_OPTS="$AGENT_OPTS $JAVA_OPTS"

getKhanAgentPath, getLogmanagerPath 함수 사용 할 경우 function.sh Include (하단 참조)

  • start.sh
export JAVA_OPTS="$AGENT_OPTS $JAVA_OPTS"
  • standalone***.xml**
<datasource jndi-name="{{ jndi_name }}" pool-name="{{ pool_name }}" enabled="true" use-ccm="true" statistics-enabled="true">

JBoss EAP 6.x, 7.x Domain 모드

고칠 파일domain.xmlhost-slave.xml(또는 host.xml).

Standalone 과 다른 점 — 도메인 모드는 서버 인스턴스를 도메인 컨트롤러가 띄웁니다. 기동 스크립트에 옵션을 적어도 각 인스턴스에 전달되지 않으므로, XML 에 적어야 합니다.

파일무엇을 적나
domain.xml도메인 전체에 공통인 시스템 속성(로그 관리자·모듈 격리 제외)
host-slave.xml인스턴스마다 다른 값 — -javaagent 경로와 khan.config.file

인스턴스가 여러 개면 host-slave.xml 의 서버마다 khan.config.file 을 다르게 주어 설정 파일을 나눕니다. 그래야 콘솔에서 인스턴스가 구분됩니다.

도메인 모드를 사용할 경우 XML 파일에 시작 옵션을 설정해야 합니다.

  • env.sh
export JAVA_OPTS=" $JAVA_OPTS -Djboss.modules.system.pkgs=org.jboss.byteman,com.opennaru.khan.agent,org.github.jamm,org.jboss.logmanager"
....
export JBOSS_LOGMANAGER_DIR="$JBOSS_HOME/modules/system/layers/base/org/jboss/logmanager/main"
export JBOSS_LOGMANAGER_JAR=`cd "$JBOSS_LOGMANAGER_DIR" && ls -1 *.jar`

export JAVA_OPTS=" $JAVA_OPTS -DJBOSS_LOGMANAGER=$JBOSS_LOGMANAGER_DIR/$JBOSS_LOGMANAGER_JAR "
  • domain.xml
<system-properties>
{/* IPv4 is not required, but setting this helps avoid unintended use of IPv6 */}
<property name="java.net.preferIPv4Stack" value="true"/>

<property name="java.util.logging.manager" value="org.jboss.logmanager.LogManager" boot-time="true"/>
<property name="jboss.modules.system.pkgs" value="org.jboss.byteman,com.opennaru.khan.agent,org.github.jamm,org.jboss.logmanager" boot-time="true"/>
</system-properties>
...
<datasource jndi-name="{{ jndi_name }}" pool-name="{{ pool_name }}" enabled="true" use-ccm="true" statistics-enabled="true">
...
  • host-slave.xml
<server name="test11" auto-start="true">
<jvm name="default">
<jvm-options>
<option value="-Xbootclasspath/p:${JBOSS_LOGMANAGER}"/>
<option value="-javaagent:/svc/test/khan-agent/khan-agent.jar"/>
<option value="-Xloggc:/svc/log/slave/test11/gclog/gc_${DATE}.log"/>
<option value="-XX:HeapDumpPath=/svc/log/slave/test11/heapdump"/>
</jvm-options>
</jvm>
<system-properties>
<property name="jboss.node.name" value="test11"/>
<property name="khan.config.file" value="khan-agent-test11.conf"/>

Wildfly 14(Java 11)

고칠 파일 — JBoss EAP Standalone 과 같습니다. 아래 예제도 env.sh + start.sh 구성이며, standalone.conf 하나만 쓴다면 내용을 합쳐 넣으면 됩니다. 데이터소스 통계를 보려면 standalone-xxx.xml 도 함께 고칩니다.

JBoss EAP 와 다른 점 — Java 11 부터 -Xbootclasspath/p 가 없어져 -Xbootclasspath/a 를 씁니다. 또 WildFly 는 org.wildfly.common 모듈이 따로 있어 그 JAR 도 함께 지정해야 합니다.

-Dsun.util.logging.disableCallerCheck=true 를 반드시 넣으십시오. 없으면 로그 호출자를 확인하는 과정에서 기동이 크게 느려집니다.

Java 11버전을 사용하는 Wildfly 14는 경우 JBoss LogManager의 설정이 필요합니다.

jboss.modules.system.pkgscom.opennaru.khan.agentorg.jboss.logmanager 패키지를 등록하여 합니다. 또, -Xbootclasspath/a 옵션을 사용하여 JBoss Logging 관련 JAR파일들을 지정하여야 하며, -Dsun.util.logging.disableCallerCheck=true 옵션을 지정합니다.

  • env.sh
export AGENT_OPTS=" -javaagent:/svc/test/khan-agent/khan-agent.jar "
#export AGENT_OPTS=" -javaagent:$(getKhanAgentPath :/svc/test/khan-agent) "
export AGENT_OPTS="$AGENT_OPTS -Dkhan.config.file=khan-agent-test11.conf"

export JAVA_OPTS="$JAVA_OPTS -Djava.util.logging.manager=org.jboss.logmanager.LogManager"
export JBOSS_LOGMANAGER_DIR="$JBOSS_HOME/modules/system/layers/base/org/jboss/logmanager/main"
export JBOSS_LOGMANAGER_JAR=`cd "$JBOSS_LOGMANAGER_DIR" && ls -1 *.jar`
export JBOSS_WILDFLY_COMMON_DIR="$JBOSS_HOME/modules/system/layers/base/org/wildfly/common/main"
export JBOSS_WILDFLY_COMMON_JAR=`cd "$JBOSS_WILDFLY_COMMON_DIR" && ls -1 *.jar`

export JAVA_OPTS=" -Xbootclasspath/a:$JBOSS_LOGMANAGER_DIR/$JBOSS_LOGMANAGER_JAR:$JBOSS_WILDFLY_COMMON_DIR/$JBOSS_WILDFLY_COMMON_JAR $JAVA_OPTS"
export JAVA_OPTS=" -Dsun.util.logging.disableCallerCheck=true $JAVA_OPTS"

export JAVA_OPTS=" $JAVA_OPTS -Djboss.modules.system.pkgs=org.jboss.byteman,com.opennaru.khan.agent,org.github.jamm,org.jboss.logmanager"
  • start.sh
export JAVA_OPTS="$AGENT_OPTS $JAVA_OPTS"
  • standalone-xxx.xml
<datasource jndi-name="{{ jndi_name }}" pool-name="{{ pool_name }}" enabled="true" use-ccm="true" statistics-enabled="true">

JBoss EAP 5.x

고칠 파일bin/run.conf 또는 기동 스크립트(아래 예제).

5.x 는 모듈 격리 구조가 없어 6.x 이후보다 설정이 단순합니다. 로그 관리자 관련 옵션도 필요 없습니다.

시작시 JAVA_OPTS에 아래 설정을 추가합니다.

JAVA_OPTS=%JAVA_OPTS% -Djboss.platform.mbeanserver
JAVA_OPTS=%JAVA_OPTS% -Djavax.management.builder.initial=org.jboss.system.server.jmx.MBeanServerBuilderImpl

JAVA_OPTS=" $JAVA_OPTS -javaagent:/svc/test/khan-agent/khan-agent.jar "
JAVA_OPTS=" $JAVA_OPTS -Dkhan.config.file=khan-agent-test11.conf"

Tomcat

고칠 파일bin/catalina.sh 또는 bin/setenv.sh. 둘 중 하나만 고치면 됩니다.

어떤 경우에
catalina.sh 에 직접지금 쓰는 방식을 그대로 두고 싶을 때. 예제가 이 방식입니다
setenv.sh 로 분리Tomcat 을 올릴 계획이 있을 때 — 업그레이드 때 catalina.sh 는 덮어써지지만 setenv.sh 는 남습니다

setenv.sh 는 기본으로 없는 파일이며, 만들어 두면 catalina.sh 가 기동할 때 자동으로 읽습니다. 내용은 아래 예제와 같고 파일 이름만 다릅니다.

변수 선택CATALINA_OPTS 를 권합니다. JAVA_OPTSshutdown.sh 에도 적용되어 종료할 때 에이전트가 한 번 더 붙습니다.

catalina.sh 에 직접 넣기

catalina.sh 를 열어 맨 위 주석 블록 다음에 아래를 넣습니다. 파일 중간이나 끝에 넣으면 그 아래에서 변수를 다시 덮어쓸 수 있습니다.

export AGENT_OPTS=" -javaagent:/svc/test/khan-agent/khan-agent.jar "
#export AGENT_OPTS=" -javaagent:$(getKhanAgentPath :/svc/test/khan-agent) "
export AGENT_OPTS="$AGENT_OPTS -Dkhan.config.file=khan-agent-test11.conf"
#export AGENT_OPTS="$AGENT_OPTS -Dcom.sun.management.jmxremote"
export CATALINA_OPTS="$AGENT_OPTS $CATALINA_OPTS"

setenv.sh 로 분리하기

bin/setenv.sh 를 새로 만들고 같은 내용을 넣습니다. 실행 권한을 주어야 합니다.

$ vi $CATALINA_HOME/bin/setenv.sh # 위 내용을 그대로 넣는다
$ chmod +x $CATALINA_HOME/bin/setenv.sh

catalina.sh 는 손대지 않습니다. 이미 catalina.sh 에 넣어 두었다면 그 줄을 지우고 옮기십시오 — 양쪽에 있으면 옵션이 두 번 붙습니다.

getKhanAgentPath 함수 사용 할 경우 function.sh Include (하단 참조)

WebLogic

고칠 파일startWebLogic.sh(아래 예제) 또는 bin/setDomainEnv.sh. setDomainEnv.sh 에 넣으면 그 도메인의 모든 서버에 함께 적용됩니다.

변수 이름이 다릅니다 — WebLogic 은 JAVA_OPTIONS 를 씁니다(JAVA_OPTS 가 아닙니다).

데이터소스를 함께 보려면 아래 절의 JMX 관련 설정을 추가해야 합니다. 이 설정이 없으면 트랜잭션은 보이지만 커넥션 풀 상태는 비어 있습니다.

WebLogic의 경우 startWebLogic.sh 파일에 아래 설정을 추가합니다.

  • startWebLogic.sh
export AGENT_OPTS="-javaagent:/svc/test/khan-agent/khan-agent.jar "
export AGENT_OPTS="$AGENT_OPTS -Dkhan.config.file=khan-agent-test11.conf "

DOMAIN_HOME="/svc/test/weblogic/wls1211/user_projects/domains/base_domain"

JAVA_OPTIONS=" $JAVA_OPTIONS $AGENT_OPTS -Djavax.management.builder.initial=weblogic.management.jmx.mbeanserver.WLSMBeanServerBuilder"
export JAVA_OPTIONS

WebLogic의 Data Source에 대한 정보를 모니터링하기 위해서는 다음과 같은 설정이 필요하다.

Domain -> Configuration -> General -> Platform MBean Server Enabled 선택, Platform MBean Server Used 선택

위와 같이 설정하면, config.xml 안에는 다음 설정이 추가됩니다.

<jmx>
<platform-m-bean-server-enabled>true</platform-m-bean-server-enabled>
<platform-m-bean-server-used>true</platform-m-bean-server-used>
</jmx>

시작 옵션에 다음 옵션을 추가해야 합니다.

-Djavax.management.builder.initial=weblogic.management.jmx.mbeanserver.WLSMBeanServerBuilder

JEUS 6

고칠 파일JEUSMain.xml<command-option>.

JEUS 는 XML 에 적습니다 — 엔진 컨테이너를 JEUS 매니저가 띄우므로 기동 스크립트에 적어도 전달되지 않습니다.

데이터소스·웹 세션을 함께 보려면 -Djeus.jmx.usePlatformMBeanServer=true 를 넣어야 합니다.

  • JEUSMain.xml
<engine-container>
<name>container1</name>
<id>22</id>
<base-port>22001</base-port>
<command-option>-XX:MaxPermSize=128m -Xms256m -Xmx512m -javaagent:/svc/test/khan-agent/khan-agent.jar -Dkhan.config.file=khan-agent-test11.conf -Djeus.jmx.usePlatformMBeanServer=true -Djeus.ejb.enable.configDeleteOption=true -Djeus.container.name=example_container1</command-option>

JEUS의 데이터소스, 웹 세션 수를 모니터링 하려면, -Djeus.jmx.usePlatformMBeanServer=true 옵션을 사용해야 합니다.

또, 웹 세션 수 모니터링을 위하여 다음과 같이 JEUS 관리자 콘솔에서 “JEUS 매니저 리소스 -> 보안 -> SYSTEM_DOMAIN -> 정책 -> ‘새 리소스 권한 생성’” 버튼을 클릭하여 다음과 같이 설정해야 합니다.

JEUS 7/8

고칠 파일domain.xml<jvm-option>.

JEUS 6 과 다른 점 — 설정 파일이 JEUSMain.xml 에서 domain.xml 로 바뀌었고, 태그도 <command-option> 에서 <jvm-option> 이 됐습니다. 서버(인스턴스)마다 따로 적습니다.

여기서도 -Djeus.jmx.usePlatformMBeanServer=true 가 데이터소스·웹 세션 수집의 전제입니다.

  • domain.xml
<jvm-config>
<jvm-option>-Xmx1024m -XX:MaxPermSize=128m</jvm-option>
<jvm-option>-javaagent:/svc/test/khan-agent/khan-agent.jar -Dkhan.config.file=khan-agent-test11.conf -Djeus.jmx.usePlatformMBeanServer=true</jvm-option>
</jvm-config>

JEUS의 데이터소스, 웹 세션 수를 모니터링 하려면, -Djeus.jmx.usePlatformMBeanServer=true 옵션을 사용해야 합니다.

또, 웹 세션 수 모니터링을 위하여 다음과 같이 JEUS 관리자 콘솔에서 “Security -> Accounts & Policies Management -> policies -> 하단 ‘Resource Permissions’의 ‘Add’ ”버튼을 클릭하여 다음과 같이 설정해야 합니다.

위와 같이 설정하면 jeus_domain/config/security/SYSTEM_DOMAIN/policies.xml 파일의 아래 굵은 글씨체 부분이 추가됩니다.

<resource-permissions>
<context-id>default</context-id>
<resource-permission>
<role>AdministratorsRole</role>
<resource>jeus.*</resource>
<actions>*</actions>
<classname>jeus.security.resource.ResourcePermission</classname>
</resource-permission>
<resource-permission>
<role>jndiUser</role>
<resource>jeus.jndi.*</resource>
<actions>lookup</actions>
<classname>jeus.security.resource.ResourcePermission</classname>
</resource-permission>
<resource-permission>
<resource>jeus.server.*</resource>
<actions>getstats</actions>
<classname>jeus.security.resource.ResourcePermission</classname>
<unchecked/>
</resource-permission>
</resource-permissions>

Jetty 9

고칠 파일bin/jetty.sh(아래 예제) 또는 start.ini.

변수 이름 — Jetty 는 WebLogic 과 같이 JAVA_OPTIONS 를 씁니다.

  • jetty.sh
export AGENT_OPTS=" -javaagent:/svc/test/khan-agent/khan-agent.jar "
export AGENT_OPTS="$AGENT_OPTS -Dkhan.config.file=khan-agent3.conf"

export JAVA_OPTIONS="$AGENT_OPTS $JAVA_OPTIONS"

Resin 4.x

고칠 파일conf/resin.xml<jvm-arg>, 또는 conf/resin.properties (아래 예제는 두 가지를 함께 보여 줍니다).

XML 에 적습니다 — Resin 은 watchdog 프로세스가 실제 JVM 을 띄우므로 셸 환경변수가 전달되지 않습니다.

  • conf/resin.properties or resin.xml
jvm_args : -Xmx1024m -XX:MaxPermSize=256m -javaagent:/svc/test/khan-agent/khan-agent.jar -Dkhan.config.file=khan-agent3.conf
  • conf/cluster-default.xml
<server-default>
<jvm-arg-line>${jvm_args}</jvm-arg-line>
<jvm-mode>${jvm_mode}</jvm-mode>

에이전트 파일 버전관리를 위한 function.sh 설정

Agent JAR 파일을 업그레이드 할 때, 다음에 WAS가 기동 될 때, 최종 버전의 파일을 사용할 수 있도록 할 필요가 있습니다. function.sh 파일은 최종 버전의 Agent JAR파일을 사용할 수 있도록 하는 스크립트입니다.

javaagent를 설정시 아래와 같이 getKhanAgentPath 함수를 이용하여 설정합니다.

. ./function.sh

export AGENT_OPTS=" -javaagent:$(getKhanAgentPath :/svc/test/khan-agent) "

위와 같은 방법으로 Agent 파일의 디렉터리를 지정하여 설정할 경우, 해당 디렉터리의 current.version 텍스트 파일의 맨 마지막 jar 파일을 로딩합니다.

/svc/test/khan-agent/khan-agent.jar

/svc/test/khan-agent/current.version
  • function.sh 파일의 내용
#!/bin/sh

function getKhanAgentPath() {
local KHAN_AGENT_PATH=$1

for file in $(cat $KHAN_AGENT_PATH/current.version); do
KHAN_AGENT_FILE="$file"
done

echo "$KHAN_AGENT_PATH/$KHAN_AGENT_FILE"
}

function listjars {
FILES=$(ls $1*.jar)
echo ${FILES}

}

function getLogmanagerPath {

JBOSS_HOME=$1
OVERLAYS_PATH="$JBOSS_HOME/modules/system/layers/base"

OVERLAYS_PATH="$JBOSS_HOME/modules/system/layers/base/.overlays"
MODULES_SOURCE_PATHS=("$JBOSS_HOME/modules/system/layers/base" "$JBOSS_HOME")

if [ -f "$OVERLAYS_PATH/.overlays" ]; then
for layer in $(tac $OVERLAYS_PATH/.overlays); do
MODULES_SOURCE_PATHS=("$OVERLAYS_PATH/$layer" $\{MODULES_SOURCE_PATHS[@]})
done
fi
name="org/jboss/logmanager/main/"

for source_dir in "$\{MODULES_SOURCE_PATHS[@]}"; do
if [ -d "$source_dir/$\{name}" ]; then
files="$(listjars $source_dir/$\{name})"

if [ -n "$files" ]; then
echo "$files" | sed -e "s/^[ \t]*//" | sed -e "s| |:|g" | sed -e ":a;N;$!ba;s|\n|:|g"
return
fi
else
files="$(compgen -G "$source_dir/$\{name}*.jar")"

if [ -n "$files" ]; then
echo "$\{files[0]}"
return
fi
fi
done

echo "Could not find any jar for the $name path, aborting"
exit 1
}

Java 9 이상 추가 옵션

--add-opens 옵션은 Java 9 이상에서 모듈 시스템의 접근 제어를 우회하기 위해 사용됩니다.

export AGENT_OPTS="$AGENT_OPTS --add-opens=java.base/java.lang=ALL-UNNAMED "
export AGENT_OPTS="$AGENT_OPTS --add-opens=java.base/java.math=ALL-UNNAMED "
export AGENT_OPTS="$AGENT_OPTS --add-opens=java.base/java.util=ALL-UNNAMED "
export AGENT_OPTS="$AGENT_OPTS --add-opens=java.base/java.util.concurrent=ALL-UNNAMED "
export AGENT_OPTS="$AGENT_OPTS --add-opens=java.base/java.net=ALL-UNNAMED "
export AGENT_OPTS="$AGENT_OPTS --add-opens=java.base/java.text=ALL-UNNAMED "
export AGENT_OPTS="$AGENT_OPTS --add-opens=java.sql/java.sql=ALL-UNNAMED "
export AGENT_OPTS="$AGENT_OPTS --add-opens=java.net.http/jdk.internal.net.http=ALL-UNNAMED "
export AGENT_OPTS="$AGENT_OPTS --add-opens=java.net.http/java.net.http=ALL-UNNAMED "