[JBoss EAP 7] ๋ฐ์ดํ„ฐ์†Œ์Šค ํŒจ์Šค์›Œ๋“œ ์•”ํ˜ธํ™” ์™„๋ฒฝ ๊ฐ€์ด๋“œ: Password Vault ๊ตฌ์„ฑ ๋ฐ ์ ์šฉ (Windows/Linux)

JBoss EAP 7.x ํ™˜๊ฒฝ์—์„œ ํ‰๋ฌธ์œผ๋กœ ์ €์žฅ๋˜๋Š” ๋ฐ์ดํ„ฐ์†Œ์Šค ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ๋ณดํ˜ธํ•˜๊ธฐ ์œ„ํ•ด Password Vault๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค. Windows์™€ Linux ํ™˜๊ฒฝ, ๊ทธ๋ฆฌ๊ณ  Standalone๊ณผ Domain ๋ชจ๋“œ ๊ฐ๊ฐ์— ๋Œ€ํ•œ ์„ค์ •๋ฒ•์„ ํฌ๊ด„ํ•˜๋ฉฐ, KeyStore ์ƒ์„ฑ๋ถ€ํ„ฐ VAULT ๋ฌธ์ž์—ด ์ ์šฉ๊นŒ์ง€์˜ ์ „์ฒด ํ”„๋กœ์„ธ์Šค๋ฅผ ๋‹ค๋ฃน๋‹ˆ๋‹ค.

1. ํ”„๋กœ์„ธ์Šค ๊ฐœ์š” (Process Overview)

Vault ๊ตฌ์„ฑ์€ ํฌ๊ฒŒ 4๋‹จ๊ณ„๋กœ ์ง„ํ–‰๋ฉ๋‹ˆ๋‹ค.

  1. KeyStore ์ƒ์„ฑ: ์•”ํ˜ธํ™” ํ‚ค๋ฅผ ์ €์žฅํ•  ๋ฌผ๋ฆฌ์  ํŒŒ์ผ(.keystore) ์ƒ์„ฑ
  2. Vault ์ดˆ๊ธฐํ™” ๋ฐ ์•”ํ˜ธํ™”: ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์•”ํ˜ธํ™”ํ•˜๊ณ  JBoss ์„ค์ •์— ํ•„์š”ํ•œ ํŒŒ๋ผ๋ฏธํ„ฐ ์ƒ์„ฑ
  3. JBoss Vault ์„ค์ •: ์ƒ์„ฑ๋œ KeyStore์™€ JBoss๋ฅผ ์—ฐ๋™ (standalone.xml ๋˜๋Š” host.xml)
  4. ๋ฐ์ดํ„ฐ์†Œ์Šค ์ ์šฉ: ํ‰๋ฌธ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์•”ํ˜ธํ™”๋œ ๋ฌธ์ž์—ด(${VAULT::...})๋กœ ๊ต์ฒด

2. KeyStore ์ƒ์„ฑ (Generate KeyStore)

Java์˜ keytool์„ ์‚ฌ์šฉํ•˜์—ฌ JCEKS ํ˜•์‹์˜ ํ‚ค์Šคํ† ์–ด๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

Windows ํ™˜๊ฒฝ

keytool.exe -genseckey ^
  -alias "vault" ^
  -storetype "jceks" ^
  -keyalg "AES" ^
  -keysize "128" ^
  -storepass "passw0rd" ^
  -keypass "passw0rd" ^
  -validity "7300" ^
  -keystore "D:\app\was\JBoss\vault\vault.keystore"

Linux ํ™˜๊ฒฝ

./keytool -genseckey \
  -alias "vault" \
  -storetype "jceks" \
  -keyalg "AES" \
  -keysize "128" \
  -storepass "passw0rd" \
  -keypass "passw0rd" \
  -validity "7300" \
  -keystore "/app/was/JBoss/vault/vault.keystore"

3. ๋น„๋ฐ€๋ฒˆํ˜ธ ์•”ํ˜ธํ™” ์‹คํ–‰ (Vault Tool)

JBoss `bin` ๋””๋ ‰ํ† ๋ฆฌ์— ์žˆ๋Š” vault ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‹ค์ œ DB ํŒจ์Šค์›Œ๋“œ๋ฅผ ์•”ํ˜ธํ™”ํ•ฉ๋‹ˆ๋‹ค.

Windows (vault.bat)

vault.bat --keystore "D:\app\was\JBoss\vault\vault.keystore" ^
  --keystore-password "passw0rd" ^
  --alias "vault" ^
  --vault-block "vb" ^
  --attribute "dbpw" ^
  --sec-attr "RealDBPassword!" ^
  --enc-dir "D:\app\was\JBoss\vault" ^
  --iteration "44" ^
  --salt "JBo72ssv"

Linux (vault.sh)

./vault.sh --keystore "/app/was/JBoss/vault/vault.keystore" \
  --keystore-password "passw0rd" \
  --alias "vault" \
  --vault-block "vb" \
  --attribute "dbpw" \
  --sec-attr "RealDBPassword!" \
  --enc-dir "/app/was/JBoss/vault" \
  --iteration "44" \
  --salt "JBo72ssv"
์ค‘์š” (Result Check):
๋ช…๋ น์–ด ์‹คํ–‰ ๊ฒฐ๊ณผ์—์„œ ์•„๋ž˜ ๋‘ ๊ฐ€์ง€ ๊ฐ’์„ ๋ฐ˜๋“œ์‹œ ๊ธฐ๋กํ•ด ๋‘์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
1. Vault Configuration: KEYSTORE_PASSWORD ๊ฐ’ (์˜ˆ: MASK-1234abcd...)
2. Vault Block: ์‹ค์ œ ์‚ฌ์šฉ๋  ์•”ํ˜ธํ™” ๋ฌธ์ž์—ด (์˜ˆ: ${VAULT::vb::dbpw::1})

4. JBoss Vault ๊ตฌ์„ฑ ๋“ฑ๋ก (Configuration)

JBoss๊ฐ€ ์œ„์—์„œ ๋งŒ๋“  KeyStore๋ฅผ ์ธ์‹ํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. XML์„ ์ง์ ‘ ์ˆ˜์ •ํ•˜๊ฑฐ๋‚˜ CLI๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Standalone Mode (standalone.xml)

<vault> ์„น์…˜์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. (์ผ๋ฐ˜์ ์œผ๋กœ <extensions> ๋’ค์ชฝ)

<vault>
    <vault-option name="KEYSTORE_URL" value="D:\app\was\JBoss\vault\vault.keystore"/>
    <vault-option name="KEYSTORE_PASSWORD" value="MASK-xxxx"/> <!-- Vault ์‹คํ–‰ ๊ฒฐ๊ณผ๊ฐ’ -->
    <vault-option name="KEYSTORE_ALIAS" value="vault"/>
    <vault-option name="SALT" value="JBo72ssv"/>
    <vault-option name="ITERATION_COUNT" value="44"/>
    <vault-option name="ENC_FILE_DIR" value="D:\app\was\JBoss\vault\"/>
</vault>

Domain Mode (host.xml ๊ถŒ์žฅ)

๋„๋ฉ”์ธ ๋ชจ๋“œ์—์„œ๋Š” ๋ฌผ๋ฆฌ์  ํŒŒ์ผ ๊ฒฝ๋กœ(KeyStore ์œ„์น˜)๊ฐ€ ์„œ๋ฒ„๋งˆ๋‹ค ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ๊ฐ ์„œ๋ฒ„์˜ host.xml์— ์„ค์ •์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ์ผ๋ฐ˜์ ์ž…๋‹ˆ๋‹ค.

<!-- host.xml์˜ <management> ๋˜๋Š” <vault> ์˜์—ญ -->
<vault>
    <vault-option name="KEYSTORE_URL" value="/app/was/JBoss/vault/vault.keystore"/>
    <vault-option name="KEYSTORE_PASSWORD" value="MASK-xxxx"/>
    <vault-option name="KEYSTORE_ALIAS" value="vault"/>
    <vault-option name="SALT" value="JBo72ssv"/>
    <vault-option name="ITERATION_COUNT" value="44"/>
    <vault-option name="ENC_FILE_DIR" value="/app/was/JBoss/vault/"/>
</vault>

5. ๋ฐ์ดํ„ฐ์†Œ์Šค ๋น„๋ฐ€๋ฒˆํ˜ธ ์ ์šฉ

๋งˆ์ง€๋ง‰์œผ๋กœ ๋ฐ์ดํ„ฐ์†Œ์Šค ์„ค์ • ํŒŒ์ผ(standalone.xml ๋˜๋Š” domain.xml)์—์„œ ํ‰๋ฌธ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ Vault ๋ฌธ์ž์—ด๋กœ ๊ต์ฒดํ•ฉ๋‹ˆ๋‹ค.

<datasource jndi-name="java:jboss/datasources/ExampleDS" ...>
    ...
    <security>
        <user-name>dbuser</user-name>
        <!-- ์•”ํ˜ธํ™”๋œ ๋ฌธ์ž์—ด ์ ์šฉ -->
        <password>${VAULT::vb::dbpw::1}</password>
    </security>
</datasource>

Next Step:
์„ค์ •์ด ์™„๋ฃŒ๋˜์—ˆ๋‹ค๋ฉด JBoss๋ฅผ ์žฌ๊ธฐ๋™ํ•˜๊ณ  ๊ด€๋ฆฌ ์ฝ˜์†”์—์„œ Test Connection์„ ์ˆ˜ํ–‰ํ•˜์—ฌ DB ์—ฐ๊ฒฐ์ด ์ •์ƒ์ ์œผ๋กœ ์ด๋ฃจ์–ด์ง€๋Š”์ง€ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค.

[JBoss EAP 6] ๋„๋ฉ”์ธ ๋ชจ๋“œ ๋ณด์•ˆ ๊ฐ•ํ™”: Vault๋ฅผ ์ด์šฉํ•œ Datasource ํŒจ์Šค์›Œ๋“œ ์•”ํ˜ธํ™” ๋ฐ ๋ฌด์ค‘๋‹จ ์ ์šฉ ์ „๋žต

JBoss EAP 6.4 ๋„๋ฉ”์ธ ๋ชจ๋“œ(Domain Mode)์—์„œ ํ‰๋ฌธ์œผ๋กœ ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ์†Œ์Šค ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ๋ณดํ˜ธํ•˜๊ธฐ ์œ„ํ•ด Vault๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค. host.xml๊ณผ domain.xml์˜ ์„ค์ • ๋ถ„๋ฆฌ ์›์น™์„ ์ดํ•ดํ•˜๊ณ , ์ด์ค‘ํ™”๋œ ํ™˜๊ฒฝ์—์„œ ์„œ๋น„์Šค ์ค‘๋‹จ ์—†์ด ์ ์šฉํ•˜๋Š” ์ˆœ์ฐจ์  ๋ฐฐํฌ ์ „๋žต์„ ๋‹ค๋ฃน๋‹ˆ๋‹ค.

0. ๋ฐฐ๊ฒฝ ๋ฐ ์•„ํ‚คํ…์ฒ˜ (Context)

๋ณด์•ˆ ๊ฐ์‚ฌ ์š”๊ฑด ์ถฉ์กฑ์„ ์œ„ํ•ด DB ํŒจ์Šค์›Œ๋“œ ์•”ํ˜ธํ™”๋Š” ํ•„์ˆ˜์ž…๋‹ˆ๋‹ค. ๋„๋ฉ”์ธ ๋ชจ๋“œ์—์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์„ค์ • ๋ถ„๋ฆฌ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

  • host.xml: ๋ฌผ๋ฆฌ์ ์ธ Keystore ํŒŒ์ผ์˜ ์œ„์น˜์™€ ์•”ํ˜ธํ™” ํ‚ค ํ•ด๋… ์„ค์ • (Vault ์„ ์–ธ)
  • domain.xml: ์‹ค์ œ ์•”ํ˜ธํ™”๋œ ๋ฌธ์ž์—ด์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ์ดํ„ฐ์†Œ์Šค ์„ค์ • (Vault ์ฐธ์กฐ)

1. Vault ํ™˜๊ฒฝ ์ค€๋น„ (Keystore ์ƒ์„ฑ)

์•”ํ˜ธํ™” ํ‚ค๋ฅผ ์ €์žฅํ•  Java Keystore๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. JDK์˜ keytool์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

# Keystore ์ƒ์„ฑ (์•Œ๊ณ ๋ฆฌ์ฆ˜: DESede ๋˜๋Š” AES)
keytool -genkey -alias vault -keyalg DESede -keystore vault.keystore -keysize 168 -storepass [ํ‚ค์Šคํ† ์–ด_๋น„๋ฐ€๋ฒˆํ˜ธ] -validity 3650
Tip: ์ƒ์„ฑ๋œ vault.keystore ํŒŒ์ผ์€ ๋งˆ์Šคํ„ฐ(Master)์™€ ์Šฌ๋ ˆ์ด๋ธŒ(Slave) ์„œ๋ฒ„ ๋ชจ๋‘ ๋™์ผํ•œ ๊ฒฝ๋กœ(์˜ˆ: EAP_HOME/vault/)์— ๋ณต์‚ฌํ•ด ๋‘์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

2. Vault ์ดˆ๊ธฐํ™” ๋ฐ ๋น„๋ฐ€๋ฒˆํ˜ธ ์•”ํ˜ธํ™”

JBoss์—์„œ ์ œ๊ณตํ•˜๋Š” ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Vault๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜๊ณ , ์‹ค์ œ DB ํŒจ์Šค์›Œ๋“œ๋ฅผ ์•”ํ˜ธํ™”๋œ ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

๋Œ€ํ™”ํ˜• ๋ชจ๋“œ ์‹คํ–‰ (Interactive)

$JBOSS_HOME/bin/vault.sh

์œ„ ๋ช…๋ น ์‹คํ–‰ ํ›„ ์˜ต์…˜ 0 (Store a secured attribute)์„ ์„ ํƒํ•˜์—ฌ ์ง„ํ–‰ํ•˜๊ฑฐ๋‚˜, ์•„๋ž˜์™€ ๊ฐ™์ด CLI ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ํ•œ ๋ฒˆ์— ์‹คํ–‰ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

# CLI ํŒŒ๋ผ๋ฏธํ„ฐ ์˜ˆ์‹œ
$JBOSS_HOME/bin/vault.sh \
--keystore vault.keystore \
--keystore-password [ํ‚ค์Šคํ† ์–ด_๋น„๋ฐ€๋ฒˆํ˜ธ] \
--alias vault \
--vault-block ds_vault \
--attribute db_password \
--sec-attr [์‹ค์ œ_DB_๋น„๋ฐ€๋ฒˆํ˜ธ] \
--enc-dir /path/to/vault/ \
--iteration 120 \
--salt 1234abcd

๊ฒฐ๊ณผ ํ™•์ธ: ์ถœ๋ ฅ๋˜๋Š” VAULT::ds_vault::db_password::1 ํ˜•ํƒœ์˜ ๋ฌธ์ž์—ด๊ณผ, ํ™”๋ฉด์— ํ‘œ์‹œ๋˜๋Š” XML ์„ค์ • ๋ธ”๋ก์„ ๋ณต์‚ฌํ•ด ๋‘ก๋‹ˆ๋‹ค.


3. host.xml ์„ค์ • (Vault ์„ ์–ธ)

๋ฌผ๋ฆฌ์ ์ธ ํŒŒ์ผ ๊ฒฝ๋กœ๋ฅผ ์ธ์‹ํ•ด์•ผ ํ•˜๋Š” ๋ชจ๋“  ํ˜ธ์ŠคํŠธ ์ปจํŠธ๋กค๋Ÿฌ(Master, Slave)์˜ host.xml ํŒŒ์ผ์„ ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค.

<!-- host.xml์˜ <management> ์„น์…˜ ๋‚ด, ๋˜๋Š” <vault> ์„น์…˜ -->
<vault>
    <vault-option name="KEYSTORE_URL" value="/path/to/vault/vault.keystore"/>
    <vault-option name="KEYSTORE_PASSWORD" value="MASK-..."/> <!-- ๋งˆ์Šคํ‚น๋œ ๋น„๋ฐ€๋ฒˆํ˜ธ -->
    <vault-option name="KEYSTORE_ALIAS" value="vault"/>
    <vault-option name="SALT" value="1234abcd"/>
    <vault-option name="ITERATION_COUNT" value="120"/>
    <vault-option name="ENC_FILE_DIR" value="/path/to/vault/" />
</vault>

4. domain.xml ์„ค์ • (Datasource ์ ์šฉ)

์ด์ œ ๋„๋ฉ”์ธ ์ปจํŠธ๋กค๋Ÿฌ์˜ domain.xml์—์„œ ๋ฐ์ดํ„ฐ์†Œ์Šค ๋น„๋ฐ€๋ฒˆํ˜ธ ๋ถ€๋ถ„์„ ์œ„์—์„œ ์ƒ์„ฑํ•œ Vault ๋ฌธ์ž์—ด๋กœ ๋Œ€์ฒดํ•ฉ๋‹ˆ๋‹ค.

<datasource ...>
    <security>
        <user-name>dbuser</user-name>
        <password>${VAULT::ds_vault::db_password::1}</password>
    </security>
</datasource>

5. ์šด์˜ ํ™˜๊ฒฝ ์ ์šฉ ์ „๋žต (Deployment Strategy)

์ด์ค‘ํ™”(HA)๋œ ์šด์˜ ํ™˜๊ฒฝ์—์„œ ์„œ๋น„์Šค ์ค‘๋‹จ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด, host.xml ์„ค์ •๊ณผ domain.xml ์„ค์ •์„ ๋ถ„๋ฆฌํ•˜์—ฌ ์ ์šฉํ•˜๋Š” ์ „๋žต์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

Scenario A: ๋ฌด์ค‘๋‹จ ์ˆœ์ฐจ ์ ์šฉ (Rolling Update)

Host Controller(HC) ์„ค์ •์ธ host.xml์€ ์žฌ๊ธฐ๋™์ด ํ•„์š”ํ•˜์ง€๋งŒ, domain.xml ๋ณ€๊ฒฝ์€ ๋ฆฌ๋กœ๋“œ(Reload)๋กœ ๋ฐ˜์˜๋  ์ˆ˜ ์žˆ์Œ์„ ์ด์šฉํ•ฉ๋‹ˆ๋‹ค.

  1. Slave ์„œ๋ฒ„(Server2) ์ž‘์—…:
    • Slave HC ์ค‘์ง€
    • Slave host.xml์— Vault ์„ค์ • ์ถ”๊ฐ€ ๋ฐ vault.keystore ํŒŒ์ผ ๋ฐฐํฌ
    • Slave HC ์žฌ๊ธฐ๋™ (์ด๋•Œ Server2 ์ธ์Šคํ„ด์Šค๋“ค๋„ ์žฌ๊ธฐ๋™๋จ)
  2. Master ์„œ๋ฒ„(Server1) ์ž‘์—…:
    • Master HC ์ค‘์ง€ (๋„๋ฉ”์ธ ์ปจํŠธ๋กค๋Ÿฌ ์ค‘์ง€)
    • Master host.xml์— Vault ์„ค์ • ์ถ”๊ฐ€ ๋ฐ vault.keystore ํŒŒ์ผ ๋ฐฐํฌ
    • Master HC ์žฌ๊ธฐ๋™
  3. Datasource ๋ณ€๊ฒฝ:
    • Master๊ฐ€ ๊ธฐ๋™๋œ ์ƒํƒœ์—์„œ domain.xml์˜ ๋ฐ์ดํ„ฐ์†Œ์Šค ํŒจ์Šค์›Œ๋“œ๋ฅผ ${VAULT::...}๋กœ ๋ณ€๊ฒฝ
    • JBoss CLI ๋˜๋Š” ์ฝ˜์†”์—์„œ Datasource Disable/Enable ์ˆ˜ํ–‰ (๋˜๋Š” reload)

Scenario B: ์ „์ฒด ์ค‘๋‹จ ํ›„ ์ ์šฉ (Cold Restart)

๊ฐ€์žฅ ์•ˆ์ „ํ•˜๊ณ  ํ™•์‹คํ•œ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ์œ ์ง€๋ณด์ˆ˜ ์‹œ๊ฐ„(Maintenance Window)์ด ํ™•๋ณด๋˜์—ˆ์„ ๋•Œ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.

  1. ๋ชจ๋“  JBoss ํ”„๋กœ์„ธ์Šค(Master/Slave) ์ข…๋ฃŒ
  2. ๋ชจ๋“  ์„œ๋ฒ„์˜ host.xml ์ˆ˜์ • ๋ฐ ํ‚ค์Šคํ† ์–ด ๋ฐฐํฌ
  3. Master ์„œ๋ฒ„์˜ domain.xml ์ˆ˜์ •
  4. Master ๊ธฐ๋™ → Slave ๊ธฐ๋™ ์ˆœ์„œ๋กœ ์ „์ฒด ์žฌ์‹œ์ž‘

6. ๊ฒ€์ฆ (Verification)

  • ์„œ๋ฒ„ ๊ธฐ๋™ ๋กœ๊ทธ(server.log)์— Vault ๊ด€๋ จ ์—๋Ÿฌ(PBOX000...)๊ฐ€ ์—†๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
  • ๊ด€๋ฆฌ ์ฝ˜์†”์—์„œ Datasource์˜ Test Connection์„ ์ˆ˜ํ–‰ํ•˜์—ฌ DB ์—ฐ๊ฒฐ์ด ์ •์ƒ์ ์ธ์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

[JBoss EAP 7] ๋ณด์•ˆ ํ—ค๋” ์ˆจ๊ธฐ๊ธฐ: Server ๋ฐ X-Powered-By ์ •๋ณด ๋…ธ์ถœ ๋ฐฉ์ง€ (Undertow Filter ์„ค์ •)

JBoss EAP 7.4 (Undertow)์˜ HTTP ์‘๋‹ต ํ—ค๋”์— ๋…ธ์ถœ๋˜๋Š” ์„œ๋ฒ„ ๋ฒ„์ „ ์ •๋ณด(Server: JBoss-EAP/7, X-Powered-By: JSP/2.3)๋ฅผ ์ œ๊ฑฐํ•˜๊ฑฐ๋‚˜ ๋ณ€๊ฒฝํ•˜์—ฌ ๋ณด์•ˆ์„ฑ์„ ๊ฐ•ํ™”ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค. CLI ๋ช…๋ น์–ด๋ฅผ ์ด์šฉํ•œ JSP ์„ค์ • ๋ณ€๊ฒฝ๊ณผ ํ•„ํ„ฐ(Filter) ์ ์šฉ ๋ฐฉ๋ฒ•์„ ๋‹ค๋ฃน๋‹ˆ๋‹ค.

1. ๋ฌธ์ œ ํ˜„์ƒ (Issue)

๊ธฐ๋ณธ ์„ค์ • ์ƒํƒœ์—์„œ JBoss EAP 7.4๋Š” ์‘๋‹ต ํ—ค๋”์— ๊ตฌ์ฒด์ ์ธ ๋ฏธ๋“ค์›จ์–ด ์ •๋ณด๋ฅผ ๋…ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๊ณต๊ฒฉ์ž์—๊ฒŒ ์„œ๋ฒ„ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜๋Š” ๋‹จ์„œ๊ฐ€ ๋˜๋ฏ€๋กœ ๋ณด์•ˆ ์ทจ์•ฝ์ ์œผ๋กœ ๋ถ„๋ฅ˜๋ฉ๋‹ˆ๋‹ค.

๋…ธ์ถœ๋˜๋Š” ํ—ค๋” ์˜ˆ์‹œ

HTTP/1.1 200 OK
X-Powered-By: Undertow/1
X-Powered-By: JSP/2.3
Server: JBoss-EAP/7
...

2. ํ•ด๊ฒฐ ๋ฐฉ๋ฒ• (Resolution Plan)

์กฐ์น˜๋Š” ํฌ๊ฒŒ ๋‘ ๋‹จ๊ณ„๋กœ ๋‚˜๋‰ฉ๋‹ˆ๋‹ค. ① JSP ์—”์ง„์ด ์ž๋™์œผ๋กœ ๋ถ™์ด๋Š” ํ—ค๋” ๋น„ํ™œ์„ฑํ™”, ② Undertow ํ•„ํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Server ํ—ค๋” ๋ฎ์–ด์“ฐ๊ธฐ์ž…๋‹ˆ๋‹ค.

Step 1: X-Powered-By (JSP) ๋น„ํ™œ์„ฑํ™”

์„œ๋ธ”๋ฆฟ ์ปจํ…Œ์ด๋„ˆ ์„ค์ •์—์„œ JSP ์—”์ง„์ด ํ•ด๋‹น ํ—ค๋”๋ฅผ ์ƒ์„ฑํ•˜์ง€ ๋ชปํ•˜๋„๋ก ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

[JBoss CLI ๋ช…๋ น์–ด]

# JSP ์„ค์ •์˜ x-powered-by ์†์„ฑ์„ false๋กœ ๋ณ€๊ฒฝ
/subsystem=undertow/servlet-container=default/setting=jsp:write-attribute(name=x-powered-by,value=false)

# ์„ค์ • ์ ์šฉ์„ ์œ„ํ•œ ๋ฆฌ๋กœ๋“œ (ํ•„์š”์‹œ)
reload
ํ™•์ธ: ๊ด€๋ฆฌ ์ฝ˜์†”์—์„œ๋„ Configuration > Subsystems > Undertow > Servlet Container > JSP ํ•ญ๋ชฉ์—์„œ X-Powered-By ์ฒดํฌ๋ฐ•์Šค๊ฐ€ ํ•ด์ œ๋œ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Step 2: Server ํ—ค๋” ๋ณ€๊ฒฝ/์‚ญ์ œ (Undertow Filter)

Server ํ—ค๋”๋Š” ์—”์ง„ ๋ ˆ๋ฒจ์—์„œ ๋ถ™๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์•„ ์•„์˜ˆ ์‚ญ์ œ๊ฐ€ ์–ด๋ ต๋‹ค๋ฉด, ํ•„ํ„ฐ(Filter)๋ฅผ ํ†ตํ•ด ๋ฌด์˜๋ฏธํ•œ ๊ฐ’์œผ๋กœ ๋ฎ์–ด์“ฐ๋Š”(Override) ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

[JBoss CLI ๋ช…๋ น์–ด]

# 1. ํ—ค๋” ๋ณ€๊ฒฝ์šฉ ํ•„ํ„ฐ ์ƒ์„ฑ (์ด๋ฆ„: server-header, ๊ฐ’: "Apache" ๋˜๋Š” ๋นˆ ๊ฐ’)
/subsystem=undertow/configuration=filter/response-header=server-header:add(header-name="Server", header-value="Apache")

# 2. X-Powered-By (Undertow) ํ—ค๋” ์ œ๊ฑฐ ํ•„ํ„ฐ ์ƒ์„ฑ (ํ•„์š” ์‹œ)
/subsystem=undertow/configuration=filter/response-header=x-powered-by-header:add(header-name="X-Powered-By", header-value="Unknown")

# 3. ์ƒ์„ฑํ•œ ํ•„ํ„ฐ๋ฅผ ๊ธฐ๋ณธ ํ˜ธ์ŠคํŠธ(default-host)์— ์ ์šฉ
/subsystem=undertow/server=default-server/host=default-host/filter-ref=server-header:add
/subsystem=undertow/server=default-server/host=default-host/filter-ref=x-powered-by-header:add
Tip: header-value์— ๋นˆ ๊ฐ’("")์„ ๋„ฃ๊ฑฐ๋‚˜ ์ผ๋ฐ˜์ ์ธ ์›น ์„œ๋ฒ„ ์ด๋ฆ„("Webserver")์„ ๋„ฃ์–ด ๊ณต๊ฒฉ์ž์—๊ฒŒ ํ˜ผ๋™์„ ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

3. ์กฐ์น˜ ๊ฒฐ๊ณผ ํ™•์ธ (Verification)

์„ค์ • ์ ์šฉ ํ›„ curl ๋ช…๋ น์–ด๋‚˜ ๋ธŒ๋ผ์šฐ์ € ๊ฐœ๋ฐœ์ž ๋„๊ตฌ๋ฅผ ํ†ตํ•ด ์‘๋‹ต ํ—ค๋”๊ฐ€ ๋ณ€๊ฒฝ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

๋ณ€๊ฒฝ ์ „ํ›„ ๋น„๊ต

ํ—ค๋”(Header) ๋ณ€๊ฒฝ ์ „ (Before) ๋ณ€๊ฒฝ ํ›„ (After)
Server JBoss-EAP/7 Apache (์„ค์ •ํ•œ ๊ฐ’)
X-Powered-By JSP/2.3, Undertow/1 (์‚ญ์ œ๋จ) ๋˜๋Š” Unknown
Security Header Verification

[๊ทธ๋ฆผ] ์กฐ์น˜ ํ›„ ํ—ค๋” ์ •๋ณด ๋…ธ์ถœ ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ

[JBoss EAP 7] Datasource ํŒจ์Šค์›Œ๋“œ ์•”ํ˜ธํ™” ๊ฐ€์ด๋“œ: Picketbox Security Domain ์„ค์ •

๋ณด์•ˆ ์ปดํ”Œ๋ผ์ด์–ธ์Šค ์ค€์ˆ˜๋ฅผ ์œ„ํ•ด JBoss EAP 7์˜ standalone.xml ๋˜๋Š” domain.xml ํŒŒ์ผ ๋‚ด์— ์ €์žฅ๋˜๋Š” DB ํŒจ์Šค์›Œ๋“œ๋ฅผ ์•”ํ˜ธํ™”ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค. org.picketbox ๋ชจ๋“ˆ์„ ์ด์šฉํ•˜์—ฌ ์•”ํ˜ธํ™”๋œ ๋ฌธ์ž์—ด์„ ์ƒ์„ฑํ•˜๊ณ , Security Domain์„ ํ†ตํ•ด ๋ฐ์ดํ„ฐ์†Œ์Šค์™€ ์—ฐ๋™ํ•ฉ๋‹ˆ๋‹ค.

0. ๋ฐฐ๊ฒฝ ๋ฐ ์ค€๋น„ (Context)

JBoss ์„ค์ • ํŒŒ์ผ์— ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ํ‰๋ฌธ์œผ๋กœ ์ €์žฅํ•˜๋ฉด ๋ณด์•ˆ ๊ฐ์‚ฌ ์‹œ ์ง€์  ๋Œ€์ƒ์ด ๋ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด JBoss๋Š” Security Domain์„ ํ†ตํ•ด ์ธ์ฆ ๊ณผ์ •์„ ์œ„์ž„ํ•˜๋Š” ๋ฐฉ์‹์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

Test Environment

  • OS: CentOS 7.2
  • WAS: JBoss EAP 7.2
  • JDK: 1.8

1. ๋น„๋ฐ€๋ฒˆํ˜ธ ์•”ํ˜ธํ™” ๋ฌธ์ž์—ด ์ƒ์„ฑ (Encryption)

๊ฐ€์žฅ ๋จผ์ € ์‹ค์ œ DB ํŒจ์Šค์›Œ๋“œ๋ฅผ ์•”ํ˜ธํ™”๋œ ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. JBoss ๋‚ด๋ถ€ ๋ชจ๋“ˆ์ธ picketbox๋ฅผ Java๋กœ ์‹คํ–‰ํ•˜์—ฌ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

์•”ํ˜ธํ™” ์Šคํฌ๋ฆฝํŠธ (create_encrypt_pw.sh)

JBoss ํŒจ์น˜(CP)๊ฐ€ ์ ์šฉ๋˜๋ฉด .overlays ๋””๋ ‰ํ† ๋ฆฌ์— ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์•„๋ž˜ ์Šคํฌ๋ฆฝํŠธ๋Š” ํŒจ์น˜ ์—ฌ๋ถ€๋ฅผ ์ž๋™์œผ๋กœ ๊ฐ์ง€ํ•˜์—ฌ ์ ์ ˆํ•œ jar ํŒŒ์ผ์„ ์ฐพ์•„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

#!/bin/sh

# 1. ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์„ค์ • (์‚ฌ์šฉ์ž ํ™˜๊ฒฝ์— ๋งž๊ฒŒ ์ˆ˜์ • ํ•„์ˆ˜)
export JAVA_HOME="/SW/was/java1.8"
export PATH="$JAVA_HOME/bin:$PATH"
JBOSS_HOME="/SW/was/JBoss7.2"

# 2. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๊ฒฝ๋กœ ํƒ์ƒ‰ (Overlay ์ง€์›)
OVERLAY_DIRECTORY="$JBOSS_HOME/modules/system/layers/base/.overlays"
SEARCH_DIRECTORY="$JBOSS_HOME/modules/system/layers/base/org/picketbox/main"

if [ -d "$OVERLAY_DIRECTORY" ]; then
    # ์ตœ์‹  ํŒจ์น˜ ๋””๋ ‰ํ† ๋ฆฌ ํ™•์ธ
    PATCH_SUBDIRECTORY=$(ls -dt $OVERLAY_DIRECTORY/* | grep "CP" | head -n 1)
    if [ -n "$PATCH_SUBDIRECTORY" ]; then
        echo "Info: Patch directory detected: $PATCH_SUBDIRECTORY"
        SEARCH_DIRECTORY="$PATCH_SUBDIRECTORY/org/picketbox/main"
    fi
fi

# 3. Classpath ์„ค์ •
export CLASSPATH=$(find "$SEARCH_DIRECTORY" -name "*.jar" -print | tr '\n' ':')$CLASSPATH

# 4. ์•”ํ˜ธํ™” ์‹คํ–‰
echo ""
read -p "Enter Database Password : " PASSWORD
echo ""
echo "####################################################"
java org.picketbox.datasource.security.SecureIdentityLoginModule "$PASSWORD"
echo "####################################################"
echo ""

์‹คํ–‰ ๊ฒฐ๊ณผ ์˜ˆ์‹œ

Encoded password: 9fdd42c2a7390d3

์ถœ๋ ฅ๋œ Encoded password ๊ฐ’์„ ๋ณต์‚ฌํ•ด ๋‘ก๋‹ˆ๋‹ค.


2. Security Domain ์„ค์ • (standalone.xml)

์ƒ์„ฑํ•œ ์•”ํ˜ธํ™” ํŒจ์Šค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ณด์•ˆ ๋„๋ฉ”์ธ์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. security ์„œ๋ธŒ์‹œ์Šคํ…œ ๋‚ด์— ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.

์„ค์ • ๋‚ด์šฉ

<subsystem xmlns="urn:jboss:domain:security:2.0">
    <security-domains>
        
        <security-domain name="encryptedSecurityDB" cache-type="default">
            <authentication>
                <login-module code="org.picketbox.datasource.security.SecureIdentityLoginModule" flag="required">
                    <module-option name="username" value="sa"/>
                    <module-option name="password" value="9fdd42c2a7390d3"/> <!-- ์•”ํ˜ธํ™”๋œ ๊ฐ’ -->
                    <module-option name="managedConnectionFactoryName" value="jboss.jca:service=LocalTxCM"/>
                </login-module>
            </authentication>
        </security-domain>
        
    </security-domains>
</subsystem>
์˜ต์…˜ ์„ค๋ช…:
  • username: DB ์ ‘์† ๊ณ„์ • ID (ํ‰๋ฌธ)
  • password: ์œ„์—์„œ ์ƒ์„ฑํ•œ ์•”ํ˜ธํ™”๋œ ํŒจ์Šค์›Œ๋“œ
  • managedConnectionFactoryName: jboss.jca:service=LocalTxCM (๊ณ ์ •๊ฐ’ ์‚ฌ์šฉ)

3. Datasource ์—ฐ๋™ ์„ค์ •

์ด์ œ ๋ฐ์ดํ„ฐ์†Œ์Šค๊ฐ€ ํ‰๋ฌธ ๋น„๋ฐ€๋ฒˆํ˜ธ ๋Œ€์‹  ์œ„์—์„œ ๋งŒ๋“  Security Domain์„ ๋ฐ”๋ผ๋ณด๋„๋ก ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค.

์ˆ˜์ • ์ „ (Before)

<datasource ...>
    ...
    <security>
        <user-name>sa</user-name>
        <password>admin1234</password>
    </security>
</datasource>

์ˆ˜์ • ํ›„ (After)

user-name๊ณผ password ํƒœ๊ทธ๋ฅผ ์‚ญ์ œํ•˜๊ณ  security-domain ํƒœ๊ทธ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

<datasource jndi-name="java:jboss/datasources/ExampleDS" pool-name="ExampleDS" enabled="true" use-java-context="true">
    <connection-url>jdbc:h2:mem:test;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE</connection-url>
    <driver>h2</driver>
    
    <security>
        <security-domain>encryptedSecurityDB</security-domain>
    </security>
</datasource>

4. ๊ฒ€์ฆ (Verification)

  1. ์„ค์ • ์ €์žฅ ํ›„ JBoss ์„œ๋ฒ„๋ฅผ ์žฌ๊ธฐ๋™(Reload)ํ•ฉ๋‹ˆ๋‹ค.
  2. ๊ด€๋ฆฌ ์ฝ˜์†” ๋˜๋Š” CLI์—์„œ Test Connection์„ ์ˆ˜ํ–‰ํ•˜์—ฌ ์—ฐ๊ฒฐ ์„ฑ๊ณต ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
  3. ์—ฐ๊ฒฐ ์„ฑ๊ณต ์‹œ, ์„ค์ • ํŒŒ์ผ์— ๋น„๋ฐ€๋ฒˆํ˜ธ ํ‰๋ฌธ์ด ๋‚จ์•„์žˆ์ง€ ์•Š์€์ง€ ์žฌํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

Next Step:
๋งŒ์•ฝ ๋น„๋ฐ€๋ฒˆํ˜ธ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ํ‚ค์Šคํ† ์–ด ํŒจ์Šค์›Œ๋“œ ๋“ฑ JBoss ์„ค์ • ์ „๋ฐ˜์˜ ๋ฏผ๊ฐ ์ •๋ณด๋ฅผ ๋ณดํ˜ธํ•ด์•ผ ํ•œ๋‹ค๋ฉด, Vault(๋ณผํŠธ) ๊ตฌ์„ฑ์„ ์ถ”๊ฐ€๋กœ ๊ฒ€ํ† ํ•ด ๋ณด์‹ญ์‹œ์˜ค.

[JBoss EAP 7] Windows ํ™˜๊ฒฝ ๋„๋ฉ”์ธ ๋ชจ๋“œ(Domain Mode) ๊ตฌ์ถ•: Master/Slave ๊ตฌ์„ฑ ๋ฐ CLI ์ œ์–ด

JBoss EAP 7.2๋ฅผ ๋„๋ฉ”์ธ ๋ชจ๋“œ๋กœ ๊ตฌ์„ฑํ•˜์—ฌ ์ค‘์•™ ์ง‘์ค‘์‹ ๊ด€๋ฆฌ ํ™˜๊ฒฝ์„ ๊ตฌ์ถ•ํ•ฉ๋‹ˆ๋‹ค. Windows Server ํ™˜๊ฒฝ์—์„œ ๋งˆ์Šคํ„ฐ(Master)์™€ ์Šฌ๋ ˆ์ด๋ธŒ(Slave) ํ˜ธ์ŠคํŠธ๋ฅผ ์„ค์ •ํ•˜๊ณ , add-user๋ฅผ ํ†ตํ•ด ๋ณด์•ˆ ์ธ์ฆ(Secret Value)์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ณผ์ •, ๊ทธ๋ฆฌ๊ณ  CLI๋ฅผ ์ด์šฉํ•œ ์ œ์–ด ๋ฐฉ๋ฒ•์„ ๋‹ค๋ฃน๋‹ˆ๋‹ค.

0. ๋ฐฐ๊ฒฝ ์ง€์‹ (Context)

๋„๋ฉ”์ธ ๋ชจ๋“œ๋Š” Domain Controller(Master)๊ฐ€ ์ „์ฒด ์ •์ฑ…์„ ๊ด€๋ฆฌํ•˜๊ณ , Host Controller(Slave)๋“ค์ด ์‹ค์ œ ์„œ๋ฒ„ ์ธ์Šคํ„ด์Šค๋ฅผ ๊ตฌ๋™ํ•˜๋Š” ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค.

  • Master: ์„ค์ • ๋ฐ ๋ฐฐํฌ ์ค‘์•™ ๊ด€๋ฆฌ (์„œ๋ฒ„ ์ธ์Šคํ„ด์Šค๋ฅผ ์ง์ ‘ ๋„์šฐ์ง€ ์•Š๋Š” ๊ฒƒ์„ ๊ถŒ์žฅ)
  • Slave: ์‹ค์ œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๊ตฌ๋™๋˜๋Š” ์„œ๋ฒ„ ๊ทธ๋ฃน ๊ด€๋ฆฌ

Test Environment

  • OS: Windows NT (10/Server)
  • Version: JBoss EAP 7.2
  • Topology: One-Box ๊ตฌ์„ฑ (ํ•˜๋‚˜์˜ ์„œ๋ฒ„์— Master/Slave ๋””๋ ‰ํ† ๋ฆฌ ๋ถ„๋ฆฌ)

1. ๊ด€๋ฆฌ์ž ๊ณ„์ • ์ƒ์„ฑ ๋ฐ ์ธ์ฆ ํ† ํฐ ํ™•๋ณด

๋„๋ฉ”์ธ ์ปจํŠธ๋กค๋Ÿฌ(Master)์™€ ํ˜ธ์ŠคํŠธ ์ปจํŠธ๋กค๋Ÿฌ(Slave) ๊ฐ„์˜ ํ†ต์‹ ์„ ์œ„ํ•ด์„œ๋Š” ๋ณด์•ˆ ์ธ์ฆ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. add-user.bat๋ฅผ ํ†ตํ•ด ๊ณ„์ •์„ ์ƒ์„ฑํ•˜๊ณ  Secret Value๋ฅผ ํ™•๋ณดํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์‹คํ–‰ ์ ˆ์ฐจ

F:\app\Redhat\JBoss7.2\bin> add-user.bat

# 1. ๊ด€๋ฆฌ์ž ๊ณ„์ • ์„ ํƒ
What type of user do you wish to add?
 a) Management User (mgmt-users.properties)
 b) Application User (application-users.properties)
(a): a

# 2. ๊ณ„์ • ์ •๋ณด ์ž…๋ ฅ (Username: admin / Password ์„ค์ •)
# ... (์ค‘๋žต) ...

# 3. ํ”„๋กœ์„ธ์Šค ๊ฐ„ ์—ฐ๊ฒฐ ์Šน์ธ (์ค‘์š”!)
Is this new user going to be used for one AS process to connect to another AS process?
e.g. for a slave host controller connecting to the master ...
yes/no? yes

# 4. ๊ฒฐ๊ณผ๊ฐ’ ๋ณต์‚ฌ
To represent the user add the following to the server-identities definition
Check Point: ๋งˆ์ง€๋ง‰์— ์ถœ๋ ฅ๋œ <secret value="..." /> ๋ฌธ์ž์—ด์„ ๋ฐ˜๋“œ์‹œ ๋ณต์‚ฌํ•ด ๋‘์‹ญ์‹œ์˜ค. Slave ์„ค์ • ์‹œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

2. ์„ค์ • ํŒŒ์ผ ์ˆ˜์ • (Configuration)

Master์™€ Slave ๊ฐ๊ฐ์˜ host.xml ํŒŒ์ผ์„ ์ˆ˜์ •ํ•˜์—ฌ ์—ญํ• ์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

1) Master ์„ค์ • (host-master.xml)

์ž์‹ ์ด ๋„๋ฉ”์ธ ์ปจํŠธ๋กค๋Ÿฌ์ž„์„ ๋ช…์‹œํ•ฉ๋‹ˆ๋‹ค.

<host xmlns="urn:jboss:domain:8.0" name="test-master">
    
    <domain-controller>
       <local/>
    </domain-controller>
    ...
</host>

2) Slave ์„ค์ • (host-slave.xml)

Master์— ์—ฐ๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ์ธ์ฆ ์ •๋ณด์™€ ๊ณ ์œ ํ•œ ํ˜ธ์ŠคํŠธ ์ด๋ฆ„์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ํ•œ ์žฅ๋น„์—์„œ ๋„์šธ ๊ฒฝ์šฐ ํฌํŠธ ์ถฉ๋Œ ๋ฐฉ์ง€๋ฅผ ์œ„ํ•ด ๊ด€๋ฆฌ ํฌํŠธ๋ฅผ ๋ณ€๊ฒฝํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

<host xmlns="urn:jboss:domain:8.0" name="slave-node01">

    <server-identities>
        <secret value="YWRtaW4xMiMk" />
    </server-identities>

    <domain-controller>
        <remote security-realm="ManagementRealm">
            <discovery-options>
                <static-discovery name="primary" protocol="${jboss.domain.master.protocol:remote}" host="${jboss.domain.master.address}" port="${jboss.domain.master.port:9990}"/>
            </discovery-options>
        </remote>
    </domain-controller>

    <management-interfaces>
        <http-interface security-realm="ManagementRealm">
            <http-upgrade enabled="true"/>
            <socket interface="management" port="${jboss.management.http.port:19990}"/>
        </http-interface>
    </management-interfaces>
</host>

3. ๋„๋ฉ”์ธ ๊ธฐ๋™ (Start Scripts)

๋””๋ ‰ํ† ๋ฆฌ(domain/base/dir)๋ฅผ ๋ถ„๋ฆฌํ•˜์—ฌ ์šด์˜ํ•˜๋Š” ํ™˜๊ฒฝ์„ ๊ฐ€์ •ํ•œ ๊ธฐ๋™ ์Šคํฌ๋ฆฝํŠธ์ž…๋‹ˆ๋‹ค.

Master ๊ธฐ๋™

F:\app\Redhat\JBoss7.2\bin\domain.bat ^
 -Djboss.domain.base.dir="F:\app\Redhat\JBoss7.2\master" ^
 -b=192.168.0.6 ^
 -bmanagement=192.168.0.6 ^
 --host-config=host-master.xml

Slave ๊ธฐ๋™ (Node 01 & 02)

Slave๋Š” --master-address ์˜ต์…˜์œผ๋กœ Master๋ฅผ ๋ฐ”๋ผ๋ณด๋ฉฐ, -Djboss.socket.binding.port-offset์œผ๋กœ ์„œ๋น„์Šค ํฌํŠธ ์ถฉ๋Œ์„ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค.

:: Slave Node 01 (Port Offset: 1000)
F:\app\Redhat\JBoss7.2\bin\domain.bat ^
 -Djboss.domain.base.dir="F:\app\Redhat\JBoss7.2\node01" ^
 -b=192.168.0.6 ^
 -bmanagement=192.168.0.6 ^
 --host-config=host-slave.xml ^
 --master-port=9990 ^
 --master-address=192.168.0.6 ^
 -Djboss.socket.binding.port-offset=1000

:: Slave Node 02 (Port Offset: 2000)
F:\app\Redhat\JBoss7.2\bin\domain.bat ^
 -Djboss.domain.base.dir="F:\app\Redhat\JBoss7.2\node02" ^
 -b=192.168.0.6 ^
 -bmanagement=192.168.0.6 ^
 --host-config=host-slave.xml ^
 --master-port=9990 ^
 --master-address=192.168.0.6 ^
 -Djboss.socket.binding.port-offset=2000

4. CLI๋ฅผ ์ด์šฉํ•œ ์„œ๋ฒ„ ์ œ์–ด (Management)

๋„๋ฉ”์ธ ๋ชจ๋“œ์—์„œ๋Š” jboss-cli๋ฅผ ํ†ตํ•ด ํŠน์ • ํ˜ธ์ŠคํŠธ์˜ ํŠน์ • ์„œ๋ฒ„ ์ธ์Šคํ„ด์Šค๋งŒ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ธฐ๋ณธ ๊ตฌ๋ฌธ

/host=[HOST_NAME]/server-config=[SERVER_NAME]:[start|stop|restart]

์‹คํ–‰ ์˜ˆ์‹œ

:: ์ ‘์† (Master Controller IP๋กœ ์ ‘์†)
F:\app\Redhat\JBoss7.2\bin> jboss-cli.bat --connect controller=192.168.0.6:9990

:: ํŠน์ • ์„œ๋ฒ„(test01) ์ •์ง€
[domain@192.168.0.6:9990 /] /host=slave-node01/server-config=test01:stop
{
    "outcome" => "success",
    "result" => "STOPPING"
}

:: ํŠน์ • ์„œ๋ฒ„(test01) ๊ธฐ๋™
[domain@192.168.0.6:9990 /] /host=slave-node01/server-config=test01:start
{
    "outcome" => "success",
    "result" => "STARTING"
}

Next Step:
๊ตฌ์„ฑ์ด ์™„๋ฃŒ๋˜์—ˆ๋‹ค๋ฉด ๊ด€๋ฆฌ ์ฝ˜์†”(http://192.168.0.6:9990)์— ์ ‘์†ํ•˜์—ฌ Runtime ํƒญ์—์„œ Topology๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ์ธ์‹๋˜๋Š”์ง€ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค.

[JBoss EAP 7] MS SQL Server Non-XA ๋ฐ์ดํ„ฐ์†Œ์Šค ์—ฐ๊ฒฐ ์˜ค๋ฅ˜: connection-url ๋ฌด์‹œ ํ˜„์ƒ ํ•ด๊ฒฐ

JBoss EAP 7์—์„œ MS SQL Server์šฉ Non-XA Datasource๋ฅผ ์„ค์ •ํ•  ๋•Œ, <datasource-class> ํƒœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด <connection-url> ์„ค์ •์ด ๋ฌด์‹œ๋˜์–ด "Connection refused" ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ํ˜„์ƒ์„ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค. ์˜ฌ๋ฐ”๋ฅธ ์„ค์ • ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ธ์ง€ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

1. ๋ฌธ์ œ ํ˜„์ƒ (Issue)

MS SQL Server์™€ ์—ฐ๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋ฐ์ดํ„ฐ์†Œ์Šค๋ฅผ ์„ค์ •ํ•˜๊ณ  ํ…Œ์ŠคํŠธ ์—ฐ๊ฒฐ์„ ์‹œ๋„ํ–ˆ์œผ๋‚˜, ์•„๋ž˜์™€ ๊ฐ™์€ Connection refused ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉฐ ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค.

์—๋Ÿฌ ๋กœ๊ทธ

Caused by: com.microsoft.sqlserver.jdbc.SQLServerException: 
The TCP/IP connection to the host localhost, port 1433 has failed. 
Error: "Connection refused. Verify the connection properties. ... Make sure that TCP connections to the port are not blocked by a firewall."

๋ฐฉํ™”๋ฒฝ์ด๋‚˜ DB ์„œ๋ฒ„ ์ƒํƒœ๋Š” ์ •์ƒ์ด์ง€๋งŒ, JBoss๊ฐ€ localhost:1433(๊ธฐ๋ณธ๊ฐ’)์œผ๋กœ๋งŒ ์ ‘์†์„ ์‹œ๋„ํ•˜๊ฑฐ๋‚˜ URL ์ •๋ณด๋ฅผ ์ „ํ˜€ ์ฝ์ง€ ๋ชปํ•˜๋Š” ์ƒํ™ฉ์ž…๋‹ˆ๋‹ค.


2. ์›์ธ ๋ถ„์„ (Root Cause)

์ด ๋ฌธ์ œ๋Š” JBoss์˜ ๋ฐ์ดํ„ฐ์†Œ์Šค ์„ค์ • ์šฐ์„ ์ˆœ์œ„ ๋ฉ”์ปค๋‹ˆ์ฆ˜ ๋•Œ๋ฌธ์— ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

  • Non-XA ํ™˜๊ฒฝ์˜ ํŠน์„ฑ: JDBC 4 ํ‘œ์ค€์„ ๋”ฐ๋ฅด๋Š” ๋“œ๋ผ์ด๋ฒ„๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ, ์ผ๋ฐ˜์ ์œผ๋กœ java.sql.Driver ๋ฉ”์ปค๋‹ˆ์ฆ˜(URL ๋ฐฉ์‹)์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • ์ถฉ๋Œ ๋ฐœ์ƒ: ์„ค์ • ํŒŒ์ผ(standalone.xml)์— <datasource-class>๊ฐ€ ๋ช…์‹œ๋˜๋ฉด, JBoss๋Š” ์ด๋ฅผ ์šฐ์„ ์‹œํ•˜์—ฌ javax.sql.DataSource ๊ตฌํ˜„์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๊ณ  ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค.
  • ๊ฒฐ๊ณผ: ์ด ๊ณผ์ •์—์„œ <connection-url> ์†์„ฑ์€ ๋ฌด์‹œ(Ignored)๋ฉ๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ์ ์œผ๋กœ JDBC URL ์ •๋ณด๊ฐ€ ์ „๋‹ฌ๋˜์ง€ ์•Š์•„ ์—ฐ๊ฒฐ์— ์‹คํŒจํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

3. ํ•ด๊ฒฐ ๋ฐฉ๋ฒ• (Resolution)

Non-XA ๋ฐ์ดํ„ฐ์†Œ์Šค ์„ค์ •์—์„œ๋Š” datasource-class๋ฅผ ์ œ๊ฑฐํ•˜๊ณ , driver-class์™€ connection-url ์กฐํ•ฉ์„ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์„ค์ • ํŒŒ์ผ ์ˆ˜์ • (standalone.xml)

<datasource-class> ํƒœ๊ทธ๊ฐ€ ์žˆ๋Š” ๋ผ์ธ์„ ์‚ญ์ œํ•˜์‹ญ์‹œ์˜ค.

<datasource jndi-name="java:/mssql" pool-name="mssqljdbc" statistics-enabled="true">
    
    <connection-url>jdbc:sqlserver://127.0.0.1:1433;DatabaseName=ucpost</connection-url>
    <driver-class>com.microsoft.sqlserver.jdbc.SQLServerDriver</driver-class>
    
    <driver>sqlserver</driver>
    ...
</datasource>

4. ์ ์šฉ ๋ฐ ๊ฒ€์ฆ (Verification)

  1. ์„ค์ • ํŒŒ์ผ ์ €์žฅ ํ›„ JBoss๋ฅผ ์žฌ๊ธฐ๋™(Reload)ํ•ฉ๋‹ˆ๋‹ค.
  2. ๊ด€๋ฆฌ ์ฝ˜์†” ๋˜๋Š” CLI์—์„œ ๋ฐ์ดํ„ฐ์†Œ์Šค ์—ฐ๊ฒฐ ํ…Œ์ŠคํŠธ(Test Connection)๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
  3. ์ •์ƒ์ ์œผ๋กœ Success ๋ฉ”์‹œ์ง€๊ฐ€ ๋œจ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
Tip: ๋งŒ์•ฝ XA Datasource(๋ถ„์‚ฐ ํŠธ๋žœ์žญ์…˜์šฉ)๋ฅผ ์„ค์ •ํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ๋ฐ˜๋Œ€๋กœ xa-datasource-class ์„ค์ •์ด ํ•„์ˆ˜์ ์ด๋ฉฐ URL ๋ฐฉ์‹์€ ์‚ฌ์šฉ๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์„ค์ •ํ•˜๋ ค๋Š” ํƒ€์ž…(XA vs Non-XA)์„ ๋ช…ํ™•ํžˆ ๊ตฌ๋ถ„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

[JBoss EAP 7] ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์ด์Šˆ ํ•ด๊ฒฐ: Apache CXF ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ถฉ๋Œ (WFLYWS0059)

JBoss EAP 6.4์—์„œ 7.x๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์‹œ, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ํฌํ•จ๋œ Apache CXF ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ JBoss ๋‚ด๋ถ€์˜ WebServices ์„œ๋ธŒ์‹œ์Šคํ…œ์ด ์ถฉ๋Œํ•˜์—ฌ ๋ฐฐํฌ๊ฐ€ ์‹คํŒจํ•˜๋Š” ํ˜„์ƒ(WFLYWS0059)์„ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค. jboss-deployment-structure.xml์„ ํ†ตํ•œ ๋ชจ๋“ˆ ์ œ์™ธ(Exclude) ์„ค์ •์„ ๋‹ค๋ฃน๋‹ˆ๋‹ค.

1. ๋ฌธ์ œ ํ˜„์ƒ ๋ฐ ๋กœ๊ทธ ๋ถ„์„ (Issue)

๊ธฐ์กด EAP 6์—์„œ๋Š” ์ž˜ ๋Œ๋˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด EAP 7 ๋ฐฐํฌ ์‹œ PARSE ๋‹จ๊ณ„์—์„œ ์‹คํŒจํ•˜๋ฉฐ ์•„๋ž˜์™€ ๊ฐ™์€ ์—๋Ÿฌ๋ฅผ ๋ฑ‰์–ด๋ƒ…๋‹ˆ๋‹ค.

์—๋Ÿฌ ๋กœ๊ทธ

WFLYSRV0153: Failed to process phase PARSE of deployment "sso.war"
Caused by: org.jboss.as.server.deployment.DeploymentUnitProcessingException: 
WFLYWS0059: Apache CXF library (cxf-api-2.7.8.jar) detected in ws endpoint deployment; 
either provide a proper deployment replacing embedded libraries with container module dependencies 
or disable the webservices subsystem for the current deployment adding a proper jboss-deployment-structure.xml descriptor to it.

์›์ธ ๋ถ„์„

  • JBoss EAP 7: ๊ธฐ๋ณธ์ ์œผ๋กœ ์ตœ์‹  Apache CXF ๊ธฐ๋ฐ˜์˜ WebServices ์„œ๋ธŒ์‹œ์Šคํ…œ์„ ๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค.
  • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜: WEB-INF/lib ์•ˆ์— ์ž์ฒด์ ์ธ CXF ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(์˜ˆ: cxf-api-2.7.8.jar)๋ฅผ ํฌํ•จํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ถฉ๋Œ: JBoss๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์ž์ฒด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋Œ€์‹  ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•˜๊ธธ ๊ถŒ์žฅํ•˜๋ฉฐ, ์ค‘๋ณต์ด ๊ฐ์ง€๋˜๋ฉด ๋ฐฐํฌ๋ฅผ ์ค‘๋‹จ์‹œํ‚ต๋‹ˆ๋‹ค.

2. ํ•ด๊ฒฐ ๋ฐฉ๋ฒ• (Resolution)

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด JBoss์˜ WebServices ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ , "๋‚ด๊ฐ€ ๊ฐ€์ง„ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์“ฐ๊ฒ ๋‹ค"๊ณ  ์„ ์–ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด jboss-deployment-structure.xml ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜์—ฌ ์ปจํ…Œ์ด๋„ˆ์˜ ํŠน์ • ์„œ๋ธŒ์‹œ์Šคํ…œ์„ ๋น„ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค.

์„ค์ • ํŒŒ์ผ ์œ„์น˜

  • WAR ํŒŒ์ผ: WEB-INF/jboss-deployment-structure.xml
  • EAR ํŒŒ์ผ: META-INF/jboss-deployment-structure.xml

์ž‘์„ฑ ๋‚ด์šฉ

JBoss์˜ webservices์™€ jaxrs ์„œ๋ธŒ์‹œ์Šคํ…œ์„ ์ œ์™ธ(exclude)ํ•˜๊ณ , ํ•„์š”ํ•œ ๊ธฐ๋ณธ API๋งŒ ์˜์กด์„ฑ(dependencies)์œผ๋กœ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

<?xml version="1.0" encoding="UTF-8"?>
<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.2">
    <deployment>
        
        <!-- 1. JBoss ๋‚ด๋ถ€ ์„œ๋ธŒ์‹œ์Šคํ…œ ๋น„ํ™œ์„ฑํ™” -->
        <exclude-subsystems>
            <!-- JBoss์˜ CXF ๋ชจ๋“ˆ์ด ๋กœ๋“œ๋˜์ง€ ์•Š๋„๋ก ์ฐจ๋‹จ -->
            <subsystem name="webservices" />
            <!-- RESTful ์„œ๋น„์Šค ์ถฉ๋Œ ๋ฐฉ์ง€ (ํ•„์š” ์‹œ) -->
            <subsystem name="jaxrs" />
        </exclude-subsystems>
        
        <!-- 2. ํ•„์ˆ˜ API ์˜์กด์„ฑ ์ถ”๊ฐ€ -->
        <!-- ์„œ๋ธŒ์‹œ์Šคํ…œ์€ ๋บ์ง€๋งŒ, ๊ธฐ๋ณธ์ ์ธ Java EE API๋Š” ํ•„์š”ํ•˜๋ฏ€๋กœ ๋ช…์‹œ์  ๋กœ๋“œ -->
        <dependencies>
            <module name="javax.xml.ws.api"/>
            <module name="javax.jws.api"/>
        </dependencies>
        
    </deployment>
</jboss-deployment-structure>

3. ์ ์šฉ ๊ฒฐ๊ณผ ๋ฐ ์ฃผ์˜์‚ฌํ•ญ

  • ๊ฒฐ๊ณผ: ์œ„ ํŒŒ์ผ์„ ์ถ”๊ฐ€ํ•˜๊ณ  ์žฌ๋ฐฐํฌํ•˜๋ฉด, JBoss๋Š” ํ•ด๋‹น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ๋Œ€ํ•ด WebServices ์„œ๋ธŒ์‹œ์Šคํ…œ ์ดˆ๊ธฐํ™”๋ฅผ ๊ฑด๋„ˆ๋›ฐ๊ณ  WEB-INF/lib ๋‚ด์˜ jar ํŒŒ์ผ๋“ค์„ ์šฐ์„ ์ ์œผ๋กœ ๋กœ๋”ฉํ•ฉ๋‹ˆ๋‹ค.
  • ์ฃผ์˜: ์ด ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋ฉด JBoss ๊ด€๋ฆฌ ์ฝ˜์†”์—์„œ ์ œ๊ณตํ•˜๋Š” ์›น ์„œ๋น„์Šค ๋ชจ๋‹ˆํ„ฐ๋ง์ด๋‚˜ ๊ด€๋ฆฌ ๊ธฐ๋Šฅ์„ ํ•ด๋‹น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ๋Œ€ํ•ด์„œ๋Š” ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. (์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ž์ฒด ํ”„๋ ˆ์ž„์›Œํฌ์ธ Spring-CXF ๋“ฑ์ด ์ „์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•จ)

[JBoss EAP 7.2] Windows Service ๋“ฑ๋ก ๋ฐ ๋ฉ€ํ‹ฐ ์ธ์Šคํ„ด์Šค ๊ตฌ์„ฑ ๊ฐ€์ด๋“œ (Jsvc, Port Offset)

JBoss EAP 7.2๋ฅผ Windows ์„œ๋น„์Šค๋กœ ๋“ฑ๋กํ•˜์—ฌ ์‹œ์Šคํ…œ ๋ถ€ํŒ… ์‹œ ์ž๋™์œผ๋กœ ์‹คํ–‰๋˜๋„๋ก ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. Apache Jsvc๋ฅผ ํ™œ์šฉํ•œ ์„œ๋น„์Šค ๋“ฑ๋ก ๋ฐฉ๋ฒ•, ๋ฉ€ํ‹ฐ ์ธ์Šคํ„ด์Šค ๊ตฌ์„ฑ์„ ์œ„ํ•œ ํฌํŠธ ์˜คํ”„์…‹(Port Offset) ์„ค์ •, ๊ทธ๋ฆฌ๊ณ  ํŠน์ˆ˜๋ฌธ์ž ํŒจ์Šค์›Œ๋“œ ์ฒ˜๋ฆฌ ํŒ์„ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

0. ์‚ฌ์ „ ์ค€๋น„ (Prerequisites)

JBoss EAP 7๋ถ€ํ„ฐ๋Š” ์„œ๋น„์Šค ๋“ฑ๋ก์„ ์œ„ํ•ด JBoss Core Services (JBCS) - Apache Jsvc ํŒจํ‚ค์ง€๊ฐ€ ํ•„์š”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Red Hat ํฌํ„ธ์—์„œ ํ•ด๋‹น ๋ฐ”์ด๋„ˆ๋ฆฌ๋ฅผ ๋‹ค์šด๋กœ๋“œํ•˜์—ฌ ์ค€๋น„ํ•ฉ๋‹ˆ๋‹ค.

ํ•„์ˆ˜ ๋‹ค์šด๋กœ๋“œ ๋ฐ ํ™˜๊ฒฝ ๋ณ€์ˆ˜

  • JBoss EAP 7.2: ์„ค์น˜ ํŒŒ์ผ ์••์ถ• ํ•ด์ œ
  • Apache Jsvc: Windows์šฉ ๋ฐ”์ด๋„ˆ๋ฆฌ (sbin ํด๋” ๋‚ด prunsrv.exe ๋“ฑ ํฌํ•จ)
  • ํ™˜๊ฒฝ ๋ณ€์ˆ˜:
    • JAVA_HOME: JDK ์„ค์น˜ ๊ฒฝ๋กœ
    • NOPAUSE=1: ์„œ๋น„์Šค ์ข…๋ฃŒ ์‹œ ๋ฐฐ์น˜ ํŒŒ์ผ์ด ๋ฉˆ์ถ”์ง€ ์•Š๋„๋ก ํ•„์ˆ˜ ์„ค์ •

1. ๋‹จ์ผ ์ธ์Šคํ„ด์Šค ์„œ๋น„์Šค ๋“ฑ๋ก

๊ธฐ๋ณธ์ ์œผ๋กœ ์ œ๊ณต๋˜๋Š” service.bat ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์„œ๋น„์Šค๋ฅผ ๋“ฑ๋กํ•ฉ๋‹ˆ๋‹ค.

๋“ฑ๋ก ๋ช…๋ น์–ด

์•„๋ž˜ ๋ช…๋ น์–ด๋ฅผ ๊ด€๋ฆฌ์ž ๊ถŒํ•œ CMD ์ฐฝ์—์„œ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋กœ๊ทธ ๊ฒฝ๋กœ(/logpath)๋Š” ๋ฏธ๋ฆฌ ์ƒ์„ฑ๋˜์–ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

:: JBoss bin ๋””๋ ‰ํ† ๋ฆฌ๋กœ ์ด๋™
cd %JBOSS_HOME%\bin

:: ์„œ๋น„์Šค ๋“ฑ๋ก ์‹คํ–‰
service.bat install /name "JBoss7-Server01" ^
 /controller "localhost:9990" ^
 /config "standalone-ha.xml" ^
 /jbossuser "admin" ^
 /jbosspass "admin1@34" ^
 /logpath "E:\app\Redhat\waslog\testsvr01"
์ฃผ์˜ (Password Special Characters):
๋น„๋ฐ€๋ฒˆํ˜ธ์— &, <, >, | ๋“ฑ์˜ ํŠน์ˆ˜๋ฌธ์ž๊ฐ€ ํฌํ•จ๋œ ๊ฒฝ์šฐ CMD ์ฐฝ์—์„œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ ํŠน์ˆ˜๋ฌธ์ž๋ฅผ ํ”ผํ•˜๊ฑฐ๋‚˜, ์Œ๋”ฐ์˜ดํ‘œ(")๋กœ ๊ฐ์‹ธ๊ณ  ์ด์Šค์ผ€์ดํ”„ ๋ฌธ์ž(^)๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋“ฑ ์ฃผ์˜๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

2. ๋ฉ€ํ‹ฐ ์ธ์Šคํ„ด์Šค(Multi-Instance) ๊ตฌ์„ฑ

ํ•˜๋‚˜์˜ ์žฅ๋น„์— ์—ฌ๋Ÿฌ ๊ฐœ์˜ JBoss ์„œ๋น„์Šค๋ฅผ ๋“ฑ๋กํ•  ๋•Œ๋Š” ์„œ๋น„์Šค ์ด๋ฆ„, ํฌํŠธ, ๋กœ๊ทธ ๊ฒฝ๋กœ๊ฐ€ ๊ฒน์น˜์ง€ ์•Š์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Step 1: Port Offset ์„ค์ • (XML ์ˆ˜์ •)

service.bat์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ํฌํŠธ ์˜คํ”„์…‹์„ ๋„˜๊ธฐ๋Š” ๊ฒƒ์ด ๋ถˆ์•ˆ์ •ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ์„ค์ • ํŒŒ์ผ(standalone.xml) ์ž์ฒด๋ฅผ ์ˆ˜์ •ํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.

<socket-binding-group name="standard-sockets" default-interface="public" 
    port-offset="${jboss.socket.binding.port-offset:100}">
    </socket-binding-group>

Step 2: Jsvc ๊ฒฝ๋กœ ์ˆ˜์ • (ํ•„์š” ์‹œ)

๋ฉ€ํ‹ฐ ์ธ์Šคํ„ด์Šค ํ™˜๊ฒฝ์—์„œ ๊ฐ ์„œ๋ฒ„๋ณ„๋กœ ๋‹ค๋ฅธ Jsvc ๋ฐ”์ด๋„ˆ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๊ฑฐ๋‚˜ ๊ฒฝ๋กœ๊ฐ€ ํŠน์ˆ˜ํ•œ ๊ฒฝ์šฐ, service.bat ํŒŒ์ผ์„ ์—ด์–ด PRUNSRV ๊ฒฝ๋กœ๋ฅผ ์ˆ˜๋™์œผ๋กœ ์ง€์ •ํ•ด์•ผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

rem service.bat ํŒŒ์ผ ํŽธ์ง‘
set PRUNSRV=

rem ์ปค์Šคํ…€ ๊ฒฝ๋กœ ์šฐ์„  ํ™•์ธ ๋กœ์ง ์˜ˆ์‹œ
if exist "%JBOSS_HOME%\..\test01-jbcs-jsvc-1.1\sbin\prunsrv.exe" (
  set PRUNSRV="%JBOSS_HOME%\..\test01-jbcs-jsvc-1.1\sbin\prunsrv.exe"
) else if exist "%JBOSS_HOME%\bin\prunsrv.exe" (
  set PRUNSRV="%JBOSS_HOME%\bin\prunsrv.exe"
) else (
  echo Please install native utilities into expected location...
  goto cmdEnd
)

Step 3: ์ถ”๊ฐ€ ์ธ์Šคํ„ด์Šค ๋“ฑ๋ก

์„œ๋น„์Šค ์ด๋ฆ„๊ณผ ์ปจํŠธ๋กค๋Ÿฌ ํฌํŠธ, ๋กœ๊ทธ ๊ฒฝ๋กœ๋ฅผ ๋ณ€๊ฒฝํ•˜์—ฌ ๋“ฑ๋กํ•ฉ๋‹ˆ๋‹ค.

service.bat install /name "JBoss7-Server02" ^
 /controller "localhost:10090" ^
 /config "standalone-ha.xml" ^
 /jbossuser "admin" ^
 /jbosspass "admin1@34" ^
 /logpath "E:\app\Redhat\waslog\testsvr02"

3. ์„œ๋น„์Šค ์ œ์–ด ๋ฐ ์‚ญ์ œ

๋“ฑ๋ก๋œ ์„œ๋น„์Šค๋Š” Windows ์„œ๋น„์Šค ๊ด€๋ฆฌ์ž(services.msc) ๋˜๋Š” ๋ช…๋ น์–ด๋กœ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์„œ๋น„์Šค ์‚ญ์ œ (Uninstall)

์„ค์ •์„ ๋ณ€๊ฒฝํ•˜๊ฑฐ๋‚˜ ์žฌ๋“ฑ๋กํ•  ๊ฒฝ์šฐ ๊ธฐ์กด ์„œ๋น„์Šค๋ฅผ ์‚ญ์ œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. /name ์˜ต์…˜์— ๋“ฑ๋กํ–ˆ๋˜ ์„œ๋น„์Šค๋ช…์„ ์ •ํ™•ํžˆ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค.

:: ์„œ๋น„์Šค ์ค‘์ง€
sc stop JBoss7-Server01

:: ์„œ๋น„์Šค ์‚ญ์ œ (service.bat ์ด์šฉ)
service.bat uninstall /name "JBoss7-Server01"

4. ๊ฒ€์ฆ (Verification)

  1. ์„œ๋น„์Šค ์‹คํ–‰: net start JBoss7-Server01
  2. ํฌํŠธ ํ™•์ธ: netstat -an | findstr "9990" (๋˜๋Š” ์˜คํ”„์…‹์ด ์ ์šฉ๋œ ํฌํŠธ)
  3. ๋กœ๊ทธ ํ™•์ธ: ์ง€์ •ํ•œ /logpath ๊ฒฝ๋กœ์— ๋กœ๊ทธ ํŒŒ์ผ์ด ์ƒ์„ฑ๋˜๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

[JBoss EAP 7] JSESSIONID ํ˜•์‹ ๋ณ€๊ฒฝ ์ด์Šˆ ๋ถ„์„ ๋ฐ jvmRoute(Instance-ID) ์„ค์ • ๊ฐ€์ด๋“œ

JBoss EAP 7 ๋„์ž… ์‹œ JSESSIONID ๋’ค์— ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ๋ฌธ์ž์—ด(์„œ๋ฒ„๋ช…, ๊ทธ๋ฃน๋ช… ๋“ฑ)์ด ๋ถ™๊ฑฐ๋‚˜ ๊ธธ์ด๊ฐ€ ๋Š˜์–ด๋‚˜๋Š” ํ˜„์ƒ์„ ๋ถ„์„ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” Undertow ์—”์ง„์˜ JvmRouteHandler ๋™์ž‘ ๋ฐฉ์‹ ๋•Œ๋ฌธ์ด๋ฉฐ, ์ด๋ฅผ ์ œ์–ดํ•˜๊ธฐ ์œ„ํ•œ ์„ค์ • ๋ฐฉ๋ฒ•์„ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

1. ์ด์Šˆ ํ˜„์ƒ ๋ฐ ์›์ธ ๋ถ„์„ (Context)

EAP 6์™€ EAP 7์€ ์„ธ์…˜ ID๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ์‹์— ์ฐจ์ด๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ํŠนํžˆ ํด๋Ÿฌ์Šคํ„ฐ๋ง ํ™˜๊ฒฝ์—์„œ Sticky Session(์„ธ์…˜ ๊ณ ์ •)์„ ์œ„ํ•ด ID ๋’ค์— ๋ถ™์ด๋Š” ์‹๋ณ„์ž(Route)์˜ ๊ธฐ๋ณธ ๋™์ž‘์ด ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

๋ฒ„์ „๋ณ„ ์ฐจ์ด์ 

๊ตฌ๋ถ„ JBoss EAP 6.x (JBossWeb) JBoss EAP 7.x (Undertow)
Engine Apache Tomcat Fork Undertow
Format [ID].[jvmRoute] [ID].[instance-id]
Default ์„ค์ • ์—†์œผ๋ฉด ID๋งŒ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ Hostname ๋ถ€์ฐฉ ๊ฐ•์ œ๋กœ jboss.node.name ๋ถ€์ฐฉ

๊ธฐ์ˆ ์  ์›์ธ (Undertow JvmRouteHandler)

EAP 7์˜ ์›น ์—”์ง„์ธ Undertow๋Š” io.undertow.server.JvmRouteHandler๋ฅผ ํ†ตํ•ด ์„ธ์…˜ ID๋ฅผ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์ด ํ•ธ๋“ค๋Ÿฌ๋Š” ํด๋Ÿฌ์Šคํ„ฐ๋ง ์„ค์ • ์—ฌ๋ถ€์™€ ๊ด€๊ณ„์—†์ด, ์„ค์ •๋œ instance-id๊ฐ€ ์žˆ๋‹ค๋ฉด ๋ฌด์กฐ๊ฑด ์„ธ์…˜ ID ๋’ค์— ๋ถ™์ด๋„๋ก ์„ค๊ณ„๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ, ์ด ๊ฐ’์€ null์ด๊ฑฐ๋‚˜ ๋น„ํ™œ์„ฑํ™”(disable)ํ•  ์ˆ˜ ์—†์œผ๋ฉฐ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋…ธ๋“œ ์ด๋ฆ„์„ ๋”ฐ๋ผ๊ฐ‘๋‹ˆ๋‹ค.


2. ํ•ด๊ฒฐ ๋ฐ ์„ค์ • ๋ฐฉ๋ฒ• (Configuration)

JSESSIONID ๋’ค์— ๋ถ™๋Š” ๊ฐ’์„ ์ œ์–ดํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” undertow ์„œ๋ธŒ์‹œ์Šคํ…œ์˜ instance-id ์†์„ฑ์„ ๋ช…์‹œ์ ์œผ๋กœ ๋ณ€๊ฒฝํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์„ค์ • ํŒŒ์ผ ์ˆ˜์ • (standalone.xml / domain.xml)

Undertow ์„œ๋ธŒ์‹œ์Šคํ…œ ์„ค์ •์—์„œ instance-id ๊ฐ’์„ ์›ํ•˜๋Š” ์‹๋ณ„์ž(๊ธฐ์กด jvmRoute์™€ ๋™์ผํ•œ ์—ญํ• )๋กœ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

<subsystem xmlns="urn:jboss:domain:undertow:3.1">
    <buffer-cache name="default"/>
    <server name="default-server">
        <http-listener name="default" socket-binding="http" redirect-socket="https" enable-http2="true"/>
        <ajp-listener name="ajp" socket-binding="ajp"/>
        <host name="default-host" alias="localhost">
            ...
        </host>
    </server>
    
    <servlet-container name="default" default-session-timeout="30" instance-id="${jboss.node.name}" />
    
</subsystem>

CLI๋ฅผ ์ด์šฉํ•œ ๋ณ€๊ฒฝ

์šด์˜ ์ค‘์ธ ํ™˜๊ฒฝ์—์„œ ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๋ ค๋ฉด ๊ด€๋ฆฌ CLI๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์•ˆ์ „ํ•ฉ๋‹ˆ๋‹ค.

# instance-id๋ฅผ 'node1'์œผ๋กœ ๋ณ€๊ฒฝํ•˜๋Š” ์˜ˆ์‹œ
/subsystem=undertow/servlet-container=default:write-attribute(name=instance-id, value="node1")

# ์„ค์ • ์ ์šฉ์„ ์œ„ํ•ด ๋ฆฌ๋กœ๋“œ ํ•„์š”
reload
์ฃผ์˜ (Warning):
instance-id๋ฅผ ๋ณ€๊ฒฝํ•˜๋ฉด ๊ธฐ์กด์— ๋ฐœ๊ธ‰๋œ ์„ธ์…˜ ID์™€ ๋งคํ•‘์ด ๋‹ฌ๋ผ์ง€๋ฏ€๋กœ, ๊ธฐ์กด ์‚ฌ์šฉ์ž๋“ค์˜ ์„ธ์…˜์ด ๋Š๊ธธ(Invalidate) ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์„œ๋น„์Šค ์ ๊ฒ€ ์‹œ๊ฐ„์— ์ˆ˜ํ–‰ํ•˜์‹ญ์‹œ์˜ค.

3. ๊ฒ€์ฆ (Verification)

์„ค์ • ๋ณ€๊ฒฝ ํ›„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ํ˜ธ์ถœํ•˜์—ฌ ์ฟ ํ‚ค ๊ฐ’์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

๊ฐœ๋ฐœ์ž ๋„๊ตฌ ํ™•์ธ

  1. ๋ธŒ๋ผ์šฐ์ € F12 (๊ฐœ๋ฐœ์ž ๋„๊ตฌ) ์‹คํ–‰
  2. Application ํƒญ > Cookies ์„ ํƒ
  3. JSESSIONID์˜ ๊ฐ’ ํ™•์ธ

๊ฒฐ๊ณผ ์˜ˆ์‹œ:

  • ๋ณ€๊ฒฝ ์ „: abcde12345.server-one-instance-group-a (๊ธธ๊ณ  ๋ณต์žกํ•จ)
  • ๋ณ€๊ฒฝ ํ›„: abcde12345.node1 (์„ค์ •ํ•œ ๊ฐ’์œผ๋กœ ๊น”๋”ํ•ด์ง)

Next Step:
๋งŒ์•ฝ ์•ž๋‹จ์˜ ์›น ์„œ๋ฒ„(Apache/IHS)์™€ mod_cluster ๋˜๋Š” mod_jk๋กœ ์—ฐ๋™ ์ค‘์ด๋ผ๋ฉด, ์›น ์„œ๋ฒ„ ์„ค์ •์˜ jvmRoute ๊ฐ’๊ณผ JBoss์˜ instance-id ๊ฐ’์ด ์ •ํ™•ํžˆ ์ผ์น˜ํ•ด์•ผ ์Šคํ‹ฐํ‚ค ์„ธ์…˜(Sticky Session)์ด ์ •์ƒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๋ฐ˜๋“œ์‹œ ์–‘์ชฝ ์„ค์ •์„ ๋งž์ถฐ์ฃผ์„ธ์š”.

[JBoss EAP 7] ์„ค์น˜ ์˜ค๋ฅ˜ ํ•ด๊ฒฐ: java.lang.UnsupportedClassVersionError (JDK ๋ฒ„์ „ ํ˜ธํ™˜์„ฑ)

JBoss EAP 7 ์„ค์น˜ ๋˜๋Š” ๊ธฐ๋™ ์ค‘ java.lang.UnsupportedClassVersionError๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค๋ฉด, ํ˜„์žฌ ์„œ๋ฒ„์— ์„ค์ •๋œ Java ๋ฒ„์ „์ด JBoss๊ฐ€ ์š”๊ตฌํ•˜๋Š” ์ตœ์†Œ ์‚ฌ์–‘(JDK 1.8)๋ณด๋‹ค ๋‚ฎ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์—๋Ÿฌ ๋ฉ”์‹œ์ง€์˜ major.minor version ์ˆซ์ž๋ฅผ ํ†ตํ•ด ์›์ธ์„ ๋ถ„์„ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ด…๋‹ˆ๋‹ค.

1. ๋ฌธ์ œ ํ˜„์ƒ ๋ฐ ์›์ธ ๋ถ„์„

JBoss ์„ค์น˜ ์Šคํฌ๋ฆฝํŠธ ์‹คํ–‰ ์‹œ ์•„๋ž˜์™€ ๊ฐ™์€ ์—๋Ÿฌ ๋กœ๊ทธ๊ฐ€ ์ถœ๋ ฅ๋˜๋ฉฐ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ข…๋ฃŒ๋ฉ๋‹ˆ๋‹ค.

Exception in thread "main" java.lang.UnsupportedClassVersionError: 
com/ibm/websphere/... : Unsupported major.minor version 52.0
    at java.lang.ClassLoader.defineClass1(Native Method)
    ...

์›์ธ (Root Cause)

์ด ์—๋Ÿฌ๋Š” ์ปดํŒŒ์ผ๋œ ํด๋ž˜์Šค ํŒŒ์ผ์˜ ๋ฒ„์ „(Target JVM)๋ณด๋‹ค ํ˜„์žฌ ์‹คํ–‰ ์ค‘์ธ JVM ๋ฒ„์ „(Runtime)์ด ๋‚ฎ์„ ๋•Œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

  • JBoss EAP 7.x ์š”๊ตฌ์‚ฌํ•ญ: ์ตœ์†Œ JDK 1.8 ์ด์ƒ
  • ํ˜„์žฌ ์„œ๋ฒ„ ์ƒํ™ฉ: JDK 1.7 ์ดํ•˜๊ฐ€ ์„ค์น˜๋˜์–ด ์žˆ๊ฑฐ๋‚˜ JAVA_HOME์ด ๊ตฌ๋ฒ„์ „์„ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ์Œ

2. ๋ฒ„์ „ ๋งคํ•‘ ํ…Œ์ด๋ธ” (Class File Format)

์—๋Ÿฌ ๋ฉ”์‹œ์ง€์— ๋œจ๋Š” ์ˆซ์ž(52.0, 51.0 ๋“ฑ)๋Š” Java ํด๋ž˜์Šค ํŒŒ์ผ ํฌ๋งท์˜ ๋ฉ”์ด์ € ๋ฒ„์ „์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์•„๋ž˜ ํ‘œ๋ฅผ ์ฐธ๊ณ ํ•˜์—ฌ ํ˜„์žฌ ํ•„์š”ํ•œ Java ๋ฒ„์ „์„ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค.

Java Version (SE) Major Version (Hex) Major Version (Dec)
Java 14 0x3A 58
Java 13 0x39 57
Java 12 0x38 56
Java 11 0x37 55
Java 9 0x35 53
Java 8 0x34 52
Java 7 0x33 51
Java 6 0x32 50
๋ถ„์„ ์˜ˆ์‹œ:
์—๋Ÿฌ ๋ฉ”์‹œ์ง€๊ฐ€ Unsupported major.minor version 52.0์ด๋ผ๋ฉด, ํ•ด๋‹น ํ”„๋กœ๊ทธ๋žจ์€ Java 8๋กœ ์ปดํŒŒ์ผ๋˜์—ˆ์œผ๋ฏ€๋กœ ์„œ๋ฒ„์—๋„ Java 8 ์ด์ƒ์ด ์„ค์น˜๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

3. ํ•ด๊ฒฐ ๋ฐฉ๋ฒ• (Solution)

1) ํ˜„์žฌ Java ๋ฒ„์ „ ํ™•์ธ

java -version

์ถœ๋ ฅ ๊ฒฐ๊ณผ๊ฐ€ 1.7.x ์ดํ•˜๋ผ๋ฉด JDK ์—…๊ทธ๋ ˆ์ด๋“œ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

2) JDK ์„ค์น˜ ๋ฐ ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ๋ณ€๊ฒฝ

์„œ๋ฒ„์— JDK 1.8 ์ด์ƒ์„ ์„ค์น˜ํ•œ ํ›„, JBoss๊ฐ€ ์ฐธ์กฐํ•˜๋Š” ์„ค์ • ํŒŒ์ผ์—์„œ JAVA_HOME ๊ฒฝ๋กœ๋ฅผ ์ˆ˜์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • Standalone ๋ชจ๋“œ: [EAP_HOME]/bin/standalone.conf (Windows๋Š” .bat)
  • Domain ๋ชจ๋“œ: [EAP_HOME]/bin/domain.conf (Windows๋Š” .bat)
# standalone.conf ์˜ˆ์‹œ
# JAVA_HOME="/usr/lib/jvm/java-1.7.0"  <-- ๊ธฐ์กด (์ฃผ์„ ์ฒ˜๋ฆฌ)
JAVA_HOME="/usr/lib/jvm/java-1.8.0"    <-- ์‹ ๊ทœ ๊ฒฝ๋กœ๋กœ ๋ณ€๊ฒฝ

Next Step:
JDK ๋ฒ„์ „์„ ์˜ฌ๋ฆฐ ํ›„์—๋Š” ๊ธฐ์กด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜(WAR/EAR)์ด ์ƒˆ Java ๋ฒ„์ „์—์„œ ์ •์ƒ์ ์œผ๋กœ ๋™์ž‘ํ•˜๋Š”์ง€, -Xmx ๋“ฑ ๋ฉ”๋ชจ๋ฆฌ ์˜ต์…˜์ด ๋ณ€๊ฒฝ๋œ ๋ฒ„์ „์— ๋งž๊ฒŒ ์„ค์ •๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

[JBoss EAP 6] ์ปค์Šคํ…€ ๊ธฐ๋™/์ •์ง€ ์Šคํฌ๋ฆฝํŠธ ์ž‘์„ฑ ๊ฐ€์ด๋“œ (Config ๋ถ„๋ฆฌ ๋ฐ JVM ํŠœ๋‹)

JBoss EAP 6 Standalone ๋ชจ๋“œ์˜ ์šด์˜ ํšจ์œจ์„ฑ์„ ๋†’์ด๊ธฐ ์œ„ํ•ด, JVM ์˜ต์…˜๊ณผ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ๋ณ„๋„์˜ ์„ค์ • ํŒŒ์ผ(Config Shell)๋กœ ๋ถ„๋ฆฌํ•˜๊ณ  ์ด๋ฅผ ๋กœ๋“œํ•˜์—ฌ ์„œ๋ฒ„๋ฅผ ์ œ์–ด(Start/Stop/Status)ํ•˜๋Š” ์ปค์Šคํ…€ ์‰˜ ์Šคํฌ๋ฆฝํŠธ ์ž‘์„ฑ๋ฒ•์„ ๊ณต์œ ํ•ฉ๋‹ˆ๋‹ค.

Test Environment

  • OS: CentOS 7.2
  • Middleware: JBoss EAP 6.4

1. ์Šคํฌ๋ฆฝํŠธ ๊ตฌ์กฐ ๋ฐ ์ „๋žต

์œ ์ง€๋ณด์ˆ˜์„ฑ๊ณผ ํ™•์žฅ์„ฑ์„ ์œ„ํ•ด ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋‘ ๊ฐœ์˜ ํŒŒ์ผ๋กœ ๋ถ„๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

  1. Config Script (config1.sh): JVM ์˜ต์…˜, ๊ฒฝ๋กœ, IP, ํฌํŠธ ๋“ฑ ๋ณ€์ˆ˜ ์ •์˜.
  2. Control Script (jboss_ctl.sh): Config๋ฅผ ๋กœ๋“œํ•˜์—ฌ ์‹ค์ œ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ œ์–ดํ•˜๋Š” ๋กœ์ง.

2. ์„ค์ • ์Šคํฌ๋ฆฝํŠธ (config1.sh)

์„œ๋ฒ„ ์ธ์Šคํ„ด์Šค๋ณ„ ๊ณ ์œ ํ•œ ์„ค์ •์„ ์ด๊ณณ์— ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. JAVA_OPTS๋ฅผ ํ†ตํ•ด ๋ฉ”๋ชจ๋ฆฌ ๋ฐ GC ๋กœ๊ทธ ์„ค์ •์„ ์ƒ์„ธํ•˜๊ฒŒ ํŠœ๋‹ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

#!/bin/sh
DATE=`date +%Y%m%d%H%M%S`

##### 1. Basic Configuration #####
export JBOSS_HOME=/SW/was/JBoss
export SERVER_HOME=/SW/was/JBoss/TEST/TESTServer11
export LOG_PATH=/app/logs/was
export NODE_NAME=TESTServer11
export CONFIG_FILE=standalone-ha.xml

# Network & Port Offset
export SERVER_IP=10.252.16.25
export PORT_OFFSET=750
export MGMT_ADDR=$SERVER_IP

# Controller Port Calculation (Base 9999 + Offset)
let CONTROLLER_PORT=9999+$PORT_OFFSET
export CONTROLLER_PORT

# Admin User (Shutdown์šฉ)
export USER=admin

##### 2. JVM Options (Memory & GC) #####
# Heap Memory
export JAVA_OPTS="-server -Xms1024m -Xmx2048m -XX:MaxPermSize=256m"

# GC Logging
export JAVA_OPTS=" $JAVA_OPTS -verbose:gc -XX:+PrintGCTimeStamps -XX:+PrintGCDetails "
export JAVA_OPTS=" $JAVA_OPTS -Xloggc:$LOG_PATH/log/gclog/gc_$DATE.log "

# GC Algorithm (ParallelGC)
export JAVA_OPTS=" $JAVA_OPTS -XX:+UseParallelGC -XX:+ExplicitGCInvokesConcurrent"

# Heap Dump on OOM
export JAVA_OPTS=" $JAVA_OPTS -XX:-HeapDumpOnOutOfMemoryError "
export JAVA_OPTS=" $JAVA_OPTS -XX:HeapDumpPath=$LOG_PATH/heap/$NODE_NAME "

##### 3. System Properties (-D options) #####
export JAVA_OPTS=" $JAVA_OPTS -Djava.net.preferIPv4Stack=true"
export JAVA_OPTS=" $JAVA_OPTS -Dorg.jboss.resolver.warning=true"
export JAVA_OPTS=" $JAVA_OPTS -Djava.awt.headless=true"
export JAVA_OPTS=" $JAVA_OPTS -DjvmRoute=$NODE_NAME"

# JBoss Path & Binding
export JAVA_OPTS=" $JAVA_OPTS -Djboss.server.base.dir=$SERVER_HOME"
export JAVA_OPTS=" $JAVA_OPTS -Djboss.server.log.dir=$LOG_PATH/$NODE_NAME"
export JAVA_OPTS=" $JAVA_OPTS -Djboss.socket.binding.port-offset=$PORT_OFFSET"
export JAVA_OPTS=" $JAVA_OPTS -Djboss.node.name=$NODE_NAME"
export JAVA_OPTS=" $JAVA_OPTS -Djboss.bind.address.management=$MGMT_ADDR"
export JAVA_OPTS=" $JAVA_OPTS -Djboss.bind.address=$SERVER_IP"

# Clustering (Multicast)
export JAVA_OPTS=" $JAVA_OPTS -Djboss.default.jgroups.stack=tcp"
# export JAVA_OPTS=" $JAVA_OPTS -Djboss.default.multicast.address=230.1.0.1"

echo "Configuration Loaded: $NODE_NAME"

3. ์ œ์–ด ์Šคํฌ๋ฆฝํŠธ (jboss_ctl.sh)

์‹ค์ œ ๊ธฐ๋™ ๋ฐ ์ •์ง€๋ฅผ ๋‹ด๋‹นํ•˜๋Š” ๋ฉ”์ธ ์Šคํฌ๋ฆฝํŠธ์ž…๋‹ˆ๋‹ค. ./config/config1.sh๋ฅผ ๋กœ๋“œํ•˜์—ฌ ๋ณ€์ˆ˜๋“ค์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

#!/bin/sh

# Config ํŒŒ์ผ ๋กœ๋“œ (๊ฒฝ๋กœ ์ฃผ์˜)
. ./config/config1.sh

start(){
    # ํ”„๋กœ์„ธ์Šค ์ค‘๋ณต ์‹คํ–‰ ๋ฐฉ์ง€
    PID=`ps -ef | grep java | grep "jboss.node.name=$NODE_NAME " | awk '{print $2}'`
    
    if [ "x$PID" != "x" ]; then
        echo "###############################################"
        echo "ERROR: JBoss SERVER ($NODE_NAME) is already RUNNING (PID=$PID)"
        echo "###############################################"
        exit 1
    fi

    echo "#######################"
    echo "   Starting JBoss EAP  "
    echo "#######################"
    
    # nohup์œผ๋กœ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์‹คํ–‰, ๋กœ๊ทธ ๋ฆฌ๋‹ค์ด๋ ‰์…˜
    nohup $JBOSS_HOME/bin/standalone.sh --server-config=$CONFIG_FILE >> $LOG_PATH/console.log 2>&1 &

    echo "Starting... Wait for checking status..."
    sleep 5
    status
}

stop(){
    echo "#######################"
    echo "    Stopping JBoss     "
    echo "#######################"
    
    # ๋ณด์•ˆ์„ ์œ„ํ•ด ํŒจ์Šค์›Œ๋“œ๋Š” ์ž…๋ ฅ๋ฐ›๋„๋ก ์ฒ˜๋ฆฌ (์ž๋™ํ™” ์‹œ ๋ณ€์ˆ˜๋กœ ๋Œ€์ฒด ๊ฐ€๋Šฅ)
    echo -n "Enter Controller Password: "
    read -s PASSWORD
    echo ""

    # CLI๋ฅผ ์ด์šฉํ•œ ์•ˆ์ „ํ•œ ์ข…๋ฃŒ (Graceful Shutdown)
    $JBOSS_HOME/bin/jboss-cli.sh --connect --controller=$SERVER_IP:$CONTROLLER_PORT --command=:shutdown --user=$USER --password=$PASSWORD
}

status() {
    # ํฌํŠธ ๋ฆฌ์Šจ ์ƒํƒœ๋กœ ๊ตฌ๋™ ์—ฌ๋ถ€ ํ™•์ธ
    _up=`netstat -an | grep $CONTROLLER_PORT | grep LISTEN | wc -l`
    
    if [ "$_up" -ne 0 ]; then
        PID=`ps -ef | grep java | grep "jboss.node.name=$NODE_NAME " | awk '{print $2}'`
        echo "###############################################"
        echo " JBoss Server is RUNNING !! "
        echo " Node: $NODE_NAME (PID: $PID)"
        echo " Port: $CONTROLLER_PORT (Management)"
        echo "###############################################"
    else
        echo "##################################"
        echo " JBoss Server is STOPPED !! "
        echo " Node: $NODE_NAME "
        echo "##################################"
    fi
}

# ํŒŒ๋ผ๋ฏธํ„ฐ ์ฒ˜๋ฆฌ
case "$1" in
  start)
    start
    ;;
  stop)
    stop
    ;;
  status)
    status
    ;;
  restart)
    stop
    sleep 5
    start
    ;;
  *)
    echo "Usage: $0 {start|stop|status|restart}"
    exit 1
esac
exit 0

4. ์‚ฌ์šฉ ๋ฐฉ๋ฒ• ๋ฐ ์ฃผ์˜์‚ฌํ•ญ

์‚ฌ์šฉ๋ฒ•

# ์‹คํ–‰ ๊ถŒํ•œ ๋ถ€์—ฌ
chmod +x jboss_ctl.sh

# ๊ธฐ๋™
./jboss_ctl.sh start

# ์ƒํƒœ ํ™•์ธ
./jboss_ctl.sh status

# ์ •์ง€ (ํŒจ์Šค์›Œ๋“œ ์ž…๋ ฅ ํ•„์š”)
./jboss_ctl.sh stop
Tip: config1.sh ํŒŒ์ผ ๋‚ด์˜ PORT_OFFSET ๋ณ€์ˆ˜๋ฅผ ํ™œ์šฉํ•˜๋ฉด, ํ•˜๋‚˜์˜ ๋ฌผ๋ฆฌ ์„œ๋ฒ„์—์„œ ํฌํŠธ ์ถฉ๋Œ ์—†์ด ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ๋„์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. (์˜ˆ: 0, 100, 200...)

[JBoss EAP 6] CLI ๊ธฐ๋ฐ˜ ํŒจ์น˜ ์ ์šฉ(Apply) ๋ฐ ๋กค๋ฐฑ(Rollback) ์™„๋ฒฝ ๊ฐ€์ด๋“œ

JBoss EAP 6 ํ™˜๊ฒฝ์—์„œ Management CLI(jboss-cli)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ณด์•ˆ ํŒจ์น˜๋‚˜ ๋ฒ„๊ทธ ํ”ฝ์Šค๋ฅผ ์ ์šฉ(Apply)ํ•˜๊ณ , ๋ฌธ์ œ ๋ฐœ์ƒ ์‹œ ์ด์ „ ์ƒํƒœ๋กœ ๋˜๋Œ๋ฆฌ๋Š” ๋กค๋ฐฑ(Rollback) ์ ˆ์ฐจ๋ฅผ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ํŒจ์น˜ ์ด๋ ฅ ๊ด€๋ฆฌ์™€ ์„ค์ • ์ดˆ๊ธฐํ™” ์˜ต์…˜์— ๋Œ€ํ•œ ์ดํ•ด๊ฐ€ ํ•„์ˆ˜์ ์ž…๋‹ˆ๋‹ค.

0. ๋ฐฐ๊ฒฝ ์ง€์‹ (Context)

JBoss EAP 6์˜ ํŒจ์น˜ ์‹œ์Šคํ…œ์€ ๋ˆ„์ (Cumulative) ๋ฐฉ์‹๊ณผ ๋‹จ์ผ(One-off) ๋ฐฉ์‹์œผ๋กœ ๋‚˜๋‰ฉ๋‹ˆ๋‹ค. ํŒจ์น˜๋ฅผ ์ ์šฉํ•˜๋ฉด ๋‚ด๋ถ€์ ์œผ๋กœ .installation ๋””๋ ‰ํ† ๋ฆฌ์— ๋ณ€๊ฒฝ ๋‚ด์—ญ์ด ์ €์žฅ๋˜๋ฉฐ, ์ด๋ฅผ ํ†ตํ•ด ์–ธ์ œ๋“  ์ด์ „ ์‹œ์ ์œผ๋กœ ๋ณต์›ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Test Environment

  • OS: Windows 10 (Linux ๋ช…๋ น์–ด ํฌํ•จ)
  • Middleware: JBoss EAP 6.4
  • Patch File: jboss-eap-6.4.19-patch.zip

1. ํŒจ์น˜ ์ ์šฉ (Patch Apply)

ํŒจ์น˜ ํŒŒ์ผ์„ ๋‹ค์šด๋กœ๋“œํ•œ ํ›„, JBoss๊ฐ€ ๊ฐ€๋™๋œ ์ƒํƒœ(๋˜๋Š” Embed ๋ชจ๋“œ)์—์„œ CLI๋ฅผ ํ†ตํ•ด ์ ์šฉํ•ฉ๋‹ˆ๋‹ค.

๋ช…๋ น์–ด ๊ตฌ๋ฌธ

# ๊ธฐ๋ณธ ๊ตฌ๋ฌธ
patch apply [ํŒจ์น˜ํŒŒ์ผ_๊ฒฝ๋กœ]

OS๋ณ„ ์‹คํ–‰ ์˜ˆ์‹œ

Linux

$JBOSS_HOME/bin/jboss-cli.sh --connect
[standalone@localhost:9999 /] patch apply /was/img/fix/jboss-eap-6.4.19-patch.zip

Windows

%JBOSS_HOME%\bin\jboss-cli.bat --connect
[standalone@localhost:9999 /] patch apply F:\app\was\jboss-eap-6.4.19-patch.zip
Note: ํŒจ์น˜ ์ ์šฉ ํ›„์—๋Š” ๋ณ€๊ฒฝ๋œ ๋ชจ๋“ˆ์„ ๋กœ๋“œํ•˜๊ธฐ ์œ„ํ•ด ๋ฐ˜๋“œ์‹œ ์„œ๋ฒ„๋ฅผ ์žฌ๊ธฐ๋™(Restart)ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

2. ํŒจ์น˜ ์ด๋ ฅ ํ™•์ธ (Verification)

ํŒจ์น˜๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ์ ์šฉ๋˜์—ˆ๋Š”์ง€, ํ˜น์€ ๋กค๋ฐฑ์„ ์œ„ํ•ด ๋Œ์•„๊ฐˆ ์‹œ์ (ID)์„ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

CLI์—์„œ ํ™•์ธ

# ํŒจ์น˜ ์ •๋ณด ์กฐํšŒ
[standalone@localhost:9999 /] patch history

# ์ƒ์„ธ ์ •๋ณด ์กฐํšŒ
[standalone@localhost:9999 /] patch info

ํŒŒ์ผ ์‹œ์Šคํ…œ์—์„œ ํ™•์ธ

JBoss ์„ค์น˜ ๊ฒฝ๋กœ ๋‚ด์˜ ์ˆจ๊น€ ํด๋”๋ฅผ ํ†ตํ•ด์„œ๋„ ํ™•์ธ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

  • ๊ฒฝ๋กœ: {JBoss_HOME}/.installation/patches

3. ํŒจ์น˜ ๋กค๋ฐฑ (Patch Rollback)

ํŒจ์น˜ ์ ์šฉ ํ›„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ๋ฌธ์ œ๊ฐ€ ์ƒ๊ฒผ๋‹ค๋ฉด ์ฆ‰์‹œ ์ด์ „ ์ƒํƒœ๋กœ ๋˜๋Œ๋ ค์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์‚ฌ์ „ ์ค€๋น„: Patch ID ํ™•์ธ

๋กค๋ฐฑํ•  ๋Œ€์ƒ ID๋ฅผ ์•Œ์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. patch history ๋ช…๋ น์–ด๋กœ ๊ฐ€์žฅ ์ตœ๊ทผ์— ์ ์šฉ๋œ ํŒจ์น˜ ID๋ฅผ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค.

๋กค๋ฐฑ ๋ช…๋ น์–ด

# ๊ตฌ๋ฌธ
patch rollback --patch-id=[PATCH_ID] --reset-configuration=[TRUE|FALSE]

ํ•ต์‹ฌ ์˜ต์…˜ ์„ค๋ช… (--reset-configuration)

  • TRUE (๊ถŒ์žฅ): ํŒจ์น˜ ์ ์šฉ ์‹œ ๋ณ€๊ฒฝ๋˜์—ˆ๋˜ ์„ค์ • ํŒŒ์ผ(standalone.xml ๋“ฑ)๋„ ํŒจ์น˜ ์ด์ „ ์ƒํƒœ๋กœ ๋˜๋Œ๋ฆฝ๋‹ˆ๋‹ค.
  • FALSE: ์„ค์ • ํŒŒ์ผ์€ ํ˜„ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜๊ณ  ๋ชจ๋“ˆ(Jar)๋งŒ ๋กค๋ฐฑํ•ฉ๋‹ˆ๋‹ค. ์„ค์ • ์ถฉ๋Œ๋กœ ์ธํ•ด ์„œ๋ฒ„ ๊ธฐ๋™์ด ์‹คํŒจํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ฃผ์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์‹คํ–‰ ์˜ˆ์‹œ

# ์„ค์ •๊นŒ์ง€ ์™„๋ฒฝํ•˜๊ฒŒ ์ด์ „์œผ๋กœ ๋ณต๊ตฌ
[standalone@localhost:9999 /] patch rollback --patch-id=CP19 --reset-configuration=true

4. ๊ด€๋ฆฌ ์ฝ˜์†”(GUI)์„ ์ด์šฉํ•œ ๋ฐฉ๋ฒ•

CLI ์‚ฌ์šฉ์ด ์–ด๋ ต๋‹ค๋ฉด ์›น ๊ด€๋ฆฌ ์ฝ˜์†”์—์„œ๋„ ๋™์ผํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  1. ์ ‘์†: http://localhost:9990/console
  2. ๋ฉ”๋‰ด: ์ƒ๋‹จ Patching ํƒญ ์„ ํƒ
  3. ์ž‘์—…: ํŒจ์น˜ ๋งˆ๋ฒ•์‚ฌ๋ฅผ ํ†ตํ•ด ํŒŒ์ผ ์—…๋กœ๋“œ ๋ฐ ์ ์šฉ (๋กค๋ฐฑ ๊ธฐ๋Šฅ ํฌํ•จ)
JBoss Management Console Patching Screen

[๊ทธ๋ฆผ] JBoss ๊ด€๋ฆฌ ์ฝ˜์†”์˜ ํŒจ์น˜ ๊ด€๋ฆฌ ํ™”๋ฉด


Next Step:
ํŒจ์น˜ ์ž‘์—… ์ „์—๋Š” ๋งŒ์•ฝ์„ ๋Œ€๋น„ํ•ด standalone ๋˜๋Š” domain ๋””๋ ‰ํ† ๋ฆฌ ์ „์ฒด๋ฅผ ์••์ถ•ํ•˜์—ฌ ๋ณ„๋„๋กœ ๋ฐฑ์—…ํ•ด๋‘๋Š” ๊ฒƒ์„ ๊ฐ•๋ ฅํžˆ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.

[JBoss/Apache] mod_cluster ์—ฐ๋™ ์™„๋ฒฝ ๊ฐ€์ด๋“œ: ๋™์  ํด๋Ÿฌ์Šคํ„ฐ๋ง ๋ฐ ๋ฉ€ํ‹ฐ์บ์ŠคํŠธ ์„ค์ •

JBoss EAP 6์™€ Apache HTTP Server๋ฅผ mod_cluster ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•˜์—ฌ ์—ฐ๋™ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์ •์ ์ธ ์„ค์ • ์—†์ด๋„ WAS์˜ ์ถ”๊ฐ€/์‚ญ์ œ๋ฅผ ์ž๋™์œผ๋กœ ๊ฐ์ง€ํ•˜๋Š” ๋™์  ํด๋Ÿฌ์Šคํ„ฐ๋ง์„ ๊ตฌํ˜„ํ•˜๋ฉฐ, ๋ฉ€ํ‹ฐ์บ์ŠคํŠธ(Advertise) ์„ค์ •์„ ์ค‘์‹ฌ์œผ๋กœ ๋‹ค๋ฃน๋‹ˆ๋‹ค.

0. ์‚ฌ์ „ ์ค€๋น„ (Prerequisites)

  • OS: Windows 10 (ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ)
  • Web Server: Apache 2.2.x (JBoss EWS ํฌํ•จ ๋ฒ„์ „ ๊ถŒ์žฅ)
  • Middleware: JBoss EAP 6.4.x
๋ฒ„์ „ ํ˜ธํ™˜์„ฑ ์ฃผ์˜: Apache ๋ฒ„์ „์— ๋งž๋Š” mod_cluster ๋ชจ๋“ˆ(.so)์„ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. JBoss EWS(Enterprise Web Server) ํŒจํ‚ค์ง€๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ด๋ฏธ ์ตœ์ ํ™”๋œ ๋ชจ๋“ˆ์ด ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

1. Apache ์„ค์ • (Web Server)

Apache์— mod_cluster ๊ด€๋ จ ๋ชจ๋“ˆ์„ ๋กœ๋“œํ•˜๊ณ , JBoss๊ฐ€ ๋ณด๋‚ธ ๋ฉ€ํ‹ฐ์บ์ŠคํŠธ ์‹ ํ˜ธ๋ฅผ ์ˆ˜์‹ ํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

1) ํ•„์ˆ˜ ๋ชจ๋“ˆ ๋ณต์‚ฌ

JBoss EAP ์„ค์น˜ ๊ฒฝ๋กœ์— ํฌํ•จ๋œ mod_cluster ๊ด€๋ จ ๋ชจ๋“ˆ(.so)์„ Apache์˜ modules ๋””๋ ‰ํ† ๋ฆฌ๋กœ ๋ณต์‚ฌํ•ฉ๋‹ˆ๋‹ค.

  • ์›๋ณธ ์œ„์น˜: [EAP_HOME]/modules/system/layers/base/native/lib64/httpd/modules
  • ๋ณต์‚ฌํ•  ํŒŒ์ผ:
    • mod_advertise.so
    • mod_manager.so
    • mod_proxy_cluster.so
    • mod_slotmem.so

2) mod_cluster.conf ์ž‘์„ฑ

httpd.conf์—์„œ include ํ•  ์„ค์ • ํŒŒ์ผ์„ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค. ํ•ต์‹ฌ์€ VirtualHost ๋‚ด์˜ ServerAdvertise On ์„ค์ •์ž…๋‹ˆ๋‹ค.

# ํ•„์ˆ˜ ๋ชจ๋“ˆ ๋กœ๋“œ (์ˆœ์„œ ์ค‘์š”)
LoadModule slotmem_module modules/mod_slotmem.so
LoadModule manager_module modules/mod_manager.so
LoadModule proxy_cluster_module modules/mod_proxy_cluster.so
LoadModule advertise_module modules/mod_advertise.so

# ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ ํŒŒ์ผ ์œ„์น˜ ์ง€์ •
MemManagerFile "C:/Apache/logs/mod_cluster"


  # JBoss ์ƒํƒœ ๊ด€๋ฆฌ ๋ฐ Advertise ์ˆ˜์‹  ํฌํŠธ
  Listen 6666
  
    
      Order deny,allow
      Deny from all
      Allow from 127.0.0.1  # ๋ณด์•ˆ์ƒ ๋กœ์ปฌ ์ ‘๊ทผ๋งŒ ํ—ˆ์šฉ ๊ถŒ์žฅ
    
    
    # ๋ฉ€ํ‹ฐ์บ์ŠคํŠธ ๊ด‘๊ณ  ํ™œ์„ฑํ™” (ํ•ต์‹ฌ)
    ServerAdvertise on
    EnableMCPMReceive

    # ๊ด€๋ฆฌ ์ฝ˜์†” URL
    
      SetHandler mod_cluster-manager
      Order deny,allow
      Allow from all
    
  

2. JBoss ์„ค์ • (Middleware)

JBoss๊ฐ€ ๊ธฐ๋™๋  ๋•Œ ์ž์‹ ์˜ ์ •๋ณด๋ฅผ ๋ฉ€ํ‹ฐ์บ์ŠคํŠธ๋กœ ์ „ํŒŒํ•˜๊ฑฐ๋‚˜, ํ”„๋ก์‹œ(Apache) ๋ฆฌ์ŠคํŠธ๋ฅผ ๋ฐ›์•„์˜ค๋„๋ก ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

1) Instance ID ์„ค์ • (domain.xml)

Sticky Session์„ ์œ„ํ•ด ๊ฐ ์„œ๋ฒ„ ์ธ์Šคํ„ด์Šค์— ๊ณ ์œ ํ•œ ID๋ฅผ ๋ถ€์—ฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ${jboss.server.name} ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํŽธ๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

<subsystem xmlns="urn:jboss:domain:web:2.2" default-virtual-server="default-host" instance-id="${jboss.server.name}" native="false">
    <connector name="http" protocol="HTTP/1.1" scheme="http" socket-binding="http"/>
    <connector name="ajp" protocol="AJP/1.3" scheme="http" socket-binding="ajp"/>
    ...
</subsystem>

2) ์†Œ์ผ“ ๋ฐ”์ธ๋”ฉ (Socket Binding) - ๋ฉ€ํ‹ฐ์บ์ŠคํŠธ ์ฃผ์†Œ

๋™์ผ ๋„คํŠธ์›Œํฌ ๋‚ด์— ์—ฌ๋Ÿฌ JBoss ํด๋Ÿฌ์Šคํ„ฐ๊ฐ€ ์กด์žฌํ•  ๊ฒฝ์šฐ ํ˜ผ์„ ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ๋ฉ€ํ‹ฐ์บ์ŠคํŠธ ์ฃผ์†Œ๋‚˜ ํฌํŠธ๋ฅผ ๋ณ€๊ฒฝํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

domain.xml ์ˆ˜์ • (socket-binding-group):

<socket-binding-group name="full-ha-sockets" default-interface="public">
    
    ...
</socket-binding-group>
Tip: XML์„ ์ˆ˜์ •ํ•˜์ง€ ์•Š๊ณ  ๊ธฐ๋™ ์‹œ ํŒŒ๋ผ๋ฏธํ„ฐ(System Property)๋กœ ์ฃผ์†Œ๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
-Djboss.modcluster.multicast.address=224.10.1.1

3. ๊ฒ€์ฆ ๋ฐ ํ…Œ์ŠคํŠธ

์„ค์ • ์™„๋ฃŒ ํ›„ Apache -> JBoss ์ˆœ์„œ๋กœ ๊ธฐ๋™ํ•ฉ๋‹ˆ๋‹ค.

1) Apache ๊ด€๋ฆฌ ์ฝ˜์†” ์ ‘์†

๋ธŒ๋ผ์šฐ์ €์—์„œ http://[Apache_IP]:6666/mod_cluster_manager ๋กœ ์ ‘์†ํ•ฉ๋‹ˆ๋‹ค.

  • ์ •์ƒ: ํ•˜๋‹จ์— ์—ฐ๊ฒฐ๋œ JBoss Node(Node Name, IP, Port) ๋ฆฌ์ŠคํŠธ๊ฐ€ ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค.
  • ์‹คํŒจ: ๋ฆฌ์ŠคํŠธ๊ฐ€ ๋น„์–ด์žˆ๋‹ค๋ฉด ๋ฉ€ํ‹ฐ์บ์ŠคํŠธ ํ†ต์‹ ์ด ๋ฐฉํ™”๋ฒฝ์— ๋ง‰ํ˜€์žˆ๊ฑฐ๋‚˜, Advertise ์„ค์ •์ด ์ž˜๋ชป๋œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

2) ํด๋Ÿฌ์Šคํ„ฐ๋ง ๋™์ž‘ ํ™•์ธ

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํ˜ธ์ถœ ์‹œ ์„ธ์…˜์ด ์œ ์ง€๋˜๋Š”์ง€ ํ™•์ธํ•˜๊ณ , ํ•œ ์ชฝ ๋…ธ๋“œ๋ฅผ ์…ง๋‹ค์šด ์‹œ์ผฐ์„ ๋•Œ Failover๊ฐ€ ์ผ์–ด๋‚˜๋Š”์ง€ ํ…Œ์ŠคํŠธํ•ฉ๋‹ˆ๋‹ค.

mod_cluster manager screen

[๊ทธ๋ฆผ] mod_cluster ๋งค๋‹ˆ์ € ํ™”๋ฉด (๋…ธ๋“œ ์ธ์‹ ์„ฑ๊ณต)


Next Step:
๋ฉ€ํ‹ฐ์บ์ŠคํŠธ ์‚ฌ์šฉ์ด ๋ถˆ๊ฐ€๋Šฅํ•œ ํด๋ผ์šฐ๋“œ ํ™˜๊ฒฝ์ด๋ผ๋ฉด, mod_cluster ์„ค์ •์„ TCP ์œ ๋‹ˆ์บ์ŠคํŠธ(Proxy List ์ง€์ • ๋ฐฉ์‹)๋กœ ๋ณ€๊ฒฝํ•˜์—ฌ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๊ฒ€ํ† ํ•ด ๋ณด์‹ญ์‹œ์˜ค.

[JBoss EAP 6] Windows Service ๋“ฑ๋ก ๊ฐ€์ด๋“œ (service.bat install)

Windows ํ™˜๊ฒฝ์—์„œ JBoss EAP 6๋ฅผ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์„œ๋น„์Šค๋กœ ๋“ฑ๋กํ•˜์—ฌ, ์‹œ์Šคํ…œ ๋ถ€ํŒ… ์‹œ ์ž๋™์œผ๋กœ ์‹œ์ž‘๋˜๋„๋ก ์„ค์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค. JBoss Native ํŒจํ‚ค์ง€์— ํฌํ•จ๋œ service.bat ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

0. ์‚ฌ์ „ ์ค€๋น„ (Prerequisites)

์„œ๋น„์Šค ๋“ฑ๋ก ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ๊ด€๋ฆฌ์ž ๊ถŒํ•œ(Run as Administrator)์œผ๋กœ ์‹คํ–‰๋œ ๋ช…๋ น ํ”„๋กฌํ”„ํŠธ(CMD)๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

์‹œ์Šคํ…œ ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์„ค์ •

JBoss๊ฐ€ ์„œ๋น„์Šค๋กœ ๊ตฌ๋™๋  ๋•Œ ์ฐธ์กฐํ•  ํ•„์ˆ˜ ๋ณ€์ˆ˜๋ฅผ ์‹œ์Šคํ…œ ํ™˜๊ฒฝ ๋ณ€์ˆ˜์— ๋“ฑ๋กํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • JBOSS_HOME: JBoss EAP 6 ์„ค์น˜ ๋””๋ ‰ํ† ๋ฆฌ (์˜ˆ: C:\jboss-eap-6.4)
  • NOPAUSE: ๊ฐ’์„ 1๋กœ ์„ค์ •.
    (※ ์ค‘์š”: ์ด ์„ค์ •์ด ์—†์œผ๋ฉด ์„œ๋น„์Šค ์ข…๋ฃŒ ์‹œ ๋ฐฐ์น˜ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ "Press any key..." ์ƒํƒœ๋กœ ๋Œ€๊ธฐํ•˜์—ฌ ์„œ๋น„์Šค๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ๋ฉˆ์ถ”์ง€ ์•Š๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.)

1. ์„œ๋น„์Šค ์„ค์น˜ ์Šคํฌ๋ฆฝํŠธ ์œ„์น˜

JBoss EAP 6๋Š” Windows ์„œ๋น„์Šค ๋“ฑ๋ก์„ ์œ„ํ•œ Native ์œ ํ‹ธ๋ฆฌํ‹ฐ๋ฅผ ๋‚ด์žฅํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํ•ด๋‹น ๊ฒฝ๋กœ๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.

:: ๊ฒฝ๋กœ ์ด๋™ (์„ค์น˜ ํ™˜๊ฒฝ์— ๋”ฐ๋ผ ๊ฒฝ๋กœ๊ฐ€ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์Œ)
cd %JBOSS_HOME%\modules\system\layers\base\native\sbin

:: ํŒŒ์ผ ํ™•์ธ
dir service.bat

2. ์„œ๋น„์Šค ๋“ฑ๋ก (Install Command)

service.bat install ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์šด์˜ ๋ชจ๋“œ(Standalone / Domain)์— ๋”ฐ๋ผ ์˜ต์…˜์ด ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

Case A: Standalone Mode (๋‹จ๋… ์ธ์Šคํ„ด์Šค)

๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ธ ๊ตฌ์„ฑ์ž…๋‹ˆ๋‹ค. ๋กœ๊ทธ ๋ ˆ๋ฒจ์„ ์ง€์ •ํ•˜์—ฌ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค.

service.bat install /loglevel INFO

Case B: Domain Mode (๋„๋ฉ”์ธ ๊ตฌ์„ฑ)

๋„๋ฉ”์ธ ์ปจํŠธ๋กค๋Ÿฌ(Domain Controller)์™€ ์—ฐ๊ฒฐํ•ด์•ผ ํ•˜๋ฏ€๋กœ ์ปจํŠธ๋กค๋Ÿฌ ์ •๋ณด๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

:: ๊ธฐ๋ณธ ๊ตฌ๋ฌธ
service.bat install /controller [Host:Port] /host [HostName] /loglevel INFO

:: ์‚ฌ์šฉ ์˜ˆ์‹œ (๋กœ์ปฌ์ด ๋งˆ์Šคํ„ฐ์ธ ๊ฒฝ์šฐ)
service.bat install /controller localhost:9990 /host master /loglevel INFO

์ฃผ์š” ์˜ต์…˜ ์„ค๋ช…

์˜ต์…˜ ์„ค๋ช…
/name ์„œ๋น„์Šค ์ด๋ฆ„ ์ง€์ • (๊ธฐ๋ณธ๊ฐ’: JBossEAP6)
/desc ์„œ๋น„์Šค ์„ค๋ช… ์ง€์ •
/serviceuser ์„œ๋น„์Šค๋ฅผ ์‹คํ–‰ํ•  Windows ๊ณ„์ • (DOMAIN\User)
/servicepass ์‹คํ–‰ ๊ณ„์ •์˜ ์•”ํ˜ธ

3. ๋“ฑ๋ก ํ™•์ธ ๋ฐ ์ œ์–ด (Verification)

์„ค์น˜๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด Windows ์„œ๋น„์Šค ๊ด€๋ฆฌ์ž์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  1. ์‹คํ–‰ ์ฐฝ(Win+R) > services.msc ์ž…๋ ฅ.
  2. "JBoss Enterprise Application Platform 6" ์„œ๋น„์Šค๋ฅผ ์ฐพ์Šต๋‹ˆ๋‹ค.
  3. ์„œ๋น„์Šค๋ฅผ ์‹œ์ž‘(Start) ํ•˜๊ณ , ์ƒํƒœ๊ฐ€ '์‹คํ–‰ ์ค‘'์œผ๋กœ ๋ฐ”๋€Œ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
  4. ๋ธŒ๋ผ์šฐ์ €๋กœ JBoss ๊ด€๋ฆฌ ์ฝ˜์†”์ด๋‚˜ ๋ฉ”์ธ ํŽ˜์ด์ง€์— ์ ‘์†ํ•˜์—ฌ ์‹ค์ œ ๊ตฌ๋™ ์—ฌ๋ถ€๋ฅผ ์ฒดํฌํ•ฉ๋‹ˆ๋‹ค.

4. ์„œ๋น„์Šค ์‚ญ์ œ (Uninstall)

์„ค์ •์„ ๋ณ€๊ฒฝํ•˜๊ฑฐ๋‚˜ ๊ฒฝ๋กœ๋ฅผ ๋ฐ”๊ฟ€ ๊ฒฝ์šฐ, ๊ธฐ์กด ์„œ๋น„์Šค๋ฅผ ์‚ญ์ œํ•˜๊ณ  ๋‹ค์‹œ ๋“ฑ๋กํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

:: ์„œ๋น„์Šค ์ค‘์ง€ (๋จผ์ € ์ˆ˜ํ–‰ ํ•„์ˆ˜)
service.bat stop

:: ์„œ๋น„์Šค ์‚ญ์ œ
service.bat uninstall
์ฃผ์˜: ์„œ๋น„์Šค ์‚ญ์ œ ํ›„ services.msc ๋ชฉ๋ก์— ์ž”์ƒ์ด ๋‚จ์•„์žˆ๋‹ค๋ฉด, ์œˆ๋„์šฐ๋ฅผ ์žฌ๋ถ€ํŒ…ํ•˜๊ฑฐ๋‚˜ ๊ด€๋ฆฌ์ž ๊ถŒํ•œ CMD์—์„œ sc delete [์„œ๋น„์Šค๋ช…]์„ ๊ฐ•์ œ๋กœ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

[JBoss EAP 6] Context Root๋ฅผ ๋ฃจํŠธ(/)๋กœ ๋ณ€๊ฒฝํ•˜๊ธฐ: Welcome Page ๋น„ํ™œ์„ฑํ™” ์„ค์ •

์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ฐฐํฌํ•  ๋•Œ, URL ๋’ค์— ๋ถ™๋Š” ํ”„๋กœ์ ํŠธ๋ช…(์˜ˆ: /MyApp) ์—†์ด ๋„๋ฉ”์ธ ์ž์ฒด(์˜ˆ: http://localhost:8080/)๋กœ ์ ‘์†ํ•˜๋„๋ก ์„ค์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„ค์ • ๋ณ€๊ฒฝ๊ณผ JBoss ์„œ๋ฒ„์˜ ๊ธฐ๋ณธ Welcome Page ๋น„ํ™œ์„ฑํ™” ์ž‘์—…์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

0. ๋ฐฐ๊ฒฝ ์ง€์‹ (Context)

๊ธฐ๋ณธ์ ์œผ๋กœ JBoss EAP๋Š” ๋ฃจํŠธ ๊ฒฝ๋กœ(/)์— "Welcome to JBoss"๋ผ๋Š” ๊ธฐ๋ณธ ํ™˜์˜ ํŽ˜์ด์ง€๊ฐ€ ๋งคํ•‘๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ฃจํŠธ ๊ฒฝ๋กœ์— ๋ฐฐํฌํ•˜๋ ค๋ฉด, ์ด ๊ธฐ๋ณธ ํ™˜์˜ ํŽ˜์ด์ง€ ๊ธฐ๋Šฅ์„ ๋„๊ณ  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๊ทธ ์ž๋ฆฌ๋ฅผ ์ฐจ์ง€ํ•˜๋„๋ก ์„ค์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Test Environment

  • OS: CentOS 7.2
  • WAS: JBoss EAP 6.4

1. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„ค์ • (jboss-web.xml)

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜(WAR) ๋‚ด๋ถ€์˜ ์„ค์ • ํŒŒ์ผ์„ ํ†ตํ•ด "์ด ์•ฑ์€ ๋ฃจํŠธ ์ปจํ…์ŠคํŠธ(/)๋ฅผ ์‚ฌ์šฉํ•˜๊ฒ ๋‹ค"๊ณ  ์„ ์–ธํ•ฉ๋‹ˆ๋‹ค.

ํŒŒ์ผ ์ƒ์„ฑ ๋ฐ ์ˆ˜์ •

  • ์œ„์น˜: [WAR_FILE]/WEB-INF/jboss-web.xml
  • ํŒŒ์ผ์ด ์—†๋‹ค๋ฉด ์ƒˆ๋กœ ์ƒ์„ฑํ•˜์‹ญ์‹œ์˜ค.
<?xml version="1.0" encoding="UTF-8"?>
<jboss-web>
    <!-- Context Root๋ฅผ / ๋กœ ์ง€์ • -->
    <context-root>/</context-root>
</jboss-web>

2. ์„œ๋ฒ„ ์„ค์ • (domain.xml / standalone.xml)

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„ค์ •๋งŒ์œผ๋กœ๋Š” ๋ถ€์กฑํ•ฉ๋‹ˆ๋‹ค. JBoss ์›น ์„œ๋ธŒ์‹œ์Šคํ…œ(Web Subsystem) ์„ค์ •์—์„œ enable-welcome-root ์˜ต์…˜์„ false๋กœ ๋ณ€๊ฒฝํ•˜์—ฌ ๊ธฐ๋ณธ ํŽ˜์ด์ง€๋ฅผ ๋น„ํ™œ์„ฑํ™”ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์„ค์ • ํŒŒ์ผ ์„ ํƒ

  • Domain Mode: [EAP_HOME]/domain/configuration/domain.xml
  • Standalone Mode: [EAP_HOME]/standalone/configuration/standalone.xml

์ˆ˜์ • ๋‚ด์šฉ

๋„๋ฉ”์ธ ๋ชจ๋“œ์˜ ๊ฒฝ์šฐ, ํ˜„์žฌ ์„œ๋ฒ„ ๊ทธ๋ฃน์ด ์‚ฌ์šฉ ์ค‘์ธ ํ”„๋กœํŒŒ์ผ(Profile)(์˜ˆ: ha, full, full-ha)์„ ์ •ํ™•ํžˆ ์ฐพ์•„ ์ˆ˜์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

<!-- ํ•ด๋‹น ํ”„๋กœํŒŒ์ผ ๋‚ด์˜ web ์„œ๋ธŒ์‹œ์Šคํ…œ ๊ฒ€์ƒ‰ -->
<subsystem xmlns="urn:jboss:domain:web:2.2" default-virtual-server="default-host" native="false">
    
    <connector name="http" protocol="HTTP/1.1" scheme="http" socket-binding="http"/>
    
    <!-- ํ•ต์‹ฌ ์ˆ˜์ • ๋ถ€๋ถ„: enable-welcome-root๋ฅผ false๋กœ ๋ณ€๊ฒฝ -->
    <virtual-server name="default-host" enable-welcome-root="false">
        <alias name="localhost"/>
        <alias name="example.com"/>
    </virtual-server>

</subsystem>
์ฃผ์˜ (Warning):
enable-welcome-root="true"์ธ ์ƒํƒœ์—์„œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ Context Root๋ฅผ /๋กœ ์„ค์ •ํ•˜๊ณ  ๋ฐฐํฌํ•˜๋ฉด, JBoss ๊ธฐ๋™ ์‹œ "Context / is already in use" ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉฐ ๋ฐฐํฌ์— ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค.

3. ์ ์šฉ ๋ฐ ๊ฒ€์ฆ (Verification)

์„ค์ • ๋ณ€๊ฒฝ ํ›„์—๋Š” ์„œ๋ฒ„ ์žฌ๊ธฐ๋™์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

์žฌ๊ธฐ๋™ ๋ฐ ์ ‘์† ํ…Œ์ŠคํŠธ

  1. JBoss ์„œ๋ฒ„๋ฅผ ์žฌ๊ธฐ๋™ํ•ฉ๋‹ˆ๋‹ค.
  2. ๋ธŒ๋ผ์šฐ์ € ์ฃผ์†Œ์ฐฝ์— http://[์„œ๋ฒ„IP]:8080/ ์„ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค.
  3. JBoss ๊ธฐ๋ณธ ํ™˜์˜ ํŽ˜์ด์ง€๊ฐ€ ์•„๋‹Œ, ๋‚ด๊ฐ€ ๋ฐฐํฌํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ฉ”์ธ ํŽ˜์ด์ง€๊ฐ€ ๋œจ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

Next Step:
๋ฃจํŠธ ์ปจํ…์ŠคํŠธ ์„ค์ •์ด ์™„๋ฃŒ๋˜์—ˆ๋‹ค๋ฉด, Apache ์›น ์„œ๋ฒ„์™€์˜ ์—ฐ๋™ ์‹œ mod_jk์˜ JkMount ์„ค์ •๋„ /*๋กœ ๋ณ€๊ฒฝํ•˜์—ฌ ๋ชจ๋“  ์š”์ฒญ์„ WAS๋กœ ๋„˜๊ธฐ๋„๋ก ์กฐ์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

[JBoss EAP 6] Session Clustering ์™„๋ฒฝ ๊ฐ€์ด๋“œ: ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„ค์ •๋ถ€ํ„ฐ TCP ์œ ๋‹ˆ์บ์ŠคํŠธ ์ „ํ™˜๊นŒ์ง€

JBoss EAP 6์˜ HA(High Availability) ํ”„๋กœํŒŒ์ผ ํ™˜๊ฒฝ์—์„œ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์„ธ์…˜ ํด๋Ÿฌ์Šคํ„ฐ๋ง์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค. <distributable/> ์„ ์–ธ๋ถ€ํ„ฐ ๋ณต์ œ ํŠธ๋ฆฌ๊ฑฐ ์„ค์ •, ๊ทธ๋ฆฌ๊ณ  ์›น ์„œ๋ฒ„(Apache)์™€์˜ ์—ฐ๋™์„ ์œ„ํ•œ jvmRoute ๋ฐ JGroups ๋„คํŠธ์›Œํฌ ์„ค์ •๊นŒ์ง€ ๋‹ค๋ฃน๋‹ˆ๋‹ค.

Test Environment

  • Middleware: JBoss EAP 6.4 (Domain Mode)
  • Profile: ha ๋˜๋Š” full-ha (ํด๋Ÿฌ์Šคํ„ฐ๋ง ๋ชจ๋“ˆ์ด ํฌํ•จ๋œ ํ”„๋กœํŒŒ์ผ ํ•„์ˆ˜)

1. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„ค์ • (Application Config)

์„ธ์…˜ ํด๋Ÿฌ์Šคํ„ฐ๋ง์ด ์ž‘๋™ํ•˜๋ ค๋ฉด ๋จผ์ € ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด "๋‚˜๋Š” ๋ถ„์‚ฐ ๊ฐ€๋Šฅํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ž…๋‹ˆ๋‹ค"๋ผ๊ณ  ์„ ์–ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

1) web.xml ์„ค์ • (ํ•„์ˆ˜)

<distributable/> ํƒœ๊ทธ๊ฐ€ ์—†์œผ๋ฉด JBoss๋Š” ํ•ด๋‹น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์„ธ์…˜์„ ๋ฉ”๋ชจ๋ฆฌ์—๋งŒ ์ €์žฅํ•˜๊ณ  ๋ณต์ œํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" ...>
    
    <distributable/>

    <session-config>
        <session-timeout>30</session-timeout> </session-config>

</web-app>

2) jboss-web.xml ์„ค์ • (์˜ต์…˜/์ƒ์„ธ ํŠœ๋‹)

์„ธ์…˜ ๋ณต์ œ์˜ ๋นˆ๋„์™€ ๋ฒ”์œ„๋ฅผ ์„ธ๋ฐ€ํ•˜๊ฒŒ ์ œ์–ดํ•˜๋ ค๋ฉด WEB-INF/jboss-web.xml ํŒŒ์ผ์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

<jboss-web>
    <replication-config>
        <cache-name>web</cache-name>
        <!-- ๋ณต์ œ ์‹œ์  ๊ฒฐ์ • -->
        <replication-trigger>SET_AND_NON_PRIMITIVE_GET</replication-trigger>
        <!-- ๋ณต์ œ ๋‹จ์œ„ ๊ฒฐ์ • (SESSION: ์ „์ฒด / ATTRIBUTE: ๋ณ€๊ฒฝ๋œ ์†์„ฑ๋งŒ) -->
        <replication-granularity>SESSION</replication-granularity>
    </replication-config>
</jboss-web>
Replication Trigger ์„ค๋ช…:
  • SET: ์„ธ์…˜ ์†์„ฑ์ด ๋ณ€๊ฒฝ(setAttribute)๋  ๋•Œ๋งŒ ๋ณต์ œ (์„ฑ๋Šฅ ์šฐ์ˆ˜).
  • SET_AND_GET: ์„ธ์…˜์„ ์ฝ๊ธฐ๋งŒ ํ•ด๋„ ๋ณต์ œ (๋ฐ์ดํ„ฐ ์ผ๊ด€์„ฑ ์ตœ์šฐ์„ ).
  • SET_AND_NON_PRIMITIVE_GET: (Default) ๊ธฐ๋ณธํ˜•์ด ์•„๋‹Œ ๊ฐ์ฒด๋ฅผ ์ฝ๊ฑฐ๋‚˜ ๋ณ€๊ฒฝํ•  ๋•Œ ๋ณต์ œ.

2. Sticky Session ์„ค์ • (jvmRoute)

์›น ์„œ๋ฒ„(Apache mod_jk/mod_cluster)๊ฐ€ ๋กœ๋“œ๋ฐธ๋Ÿฐ์‹ฑ์„ ํ•  ๋•Œ, ์‚ฌ์šฉ์ž๊ฐ€ ์ฒ˜์Œ ์ ‘์†ํ•œ JBoss ์„œ๋ฒ„๋กœ ๊ณ„์† ์š”์ฒญ์„ ๋ณด๋‚ด๊ฒŒ ํ•˜๋ ค๋ฉด(Sticky Session), ์„ธ์…˜ ID ๋’ค์— ์„œ๋ฒ„ ์‹๋ณ„์ž(jvmRoute)๋ฅผ ๋ถ™์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

1) host.xml ์„ค์ • (์„œ๋ฒ„๋ณ„ ์‹๋ณ„์ž ๋ถ€์—ฌ)

๊ฐ ์„œ๋ฒ„ ์ธ์Šคํ„ด์Šค์— ๊ณ ์œ ํ•œ jvmRoute ๊ฐ’์„ ์‹œ์Šคํ…œ ํ”„๋กœํผํ‹ฐ๋กœ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

<servers>
    <server name="Server01" group="main-server-group" auto-start="true">
        <system-properties>
            <!-- ์ด ๊ฐ’์€ workers.properties์˜ ์›Œ์ปค ์ด๋ฆ„๊ณผ ์ผ์น˜ํ•ด์•ผ ํ•จ -->
            <property name="jvmRoute" value="Server01" boot-time="true"/>
        </system-properties>
    </server>
    
    <server name="Server02" ...>
        <system-properties>
            <property name="jvmRoute" value="Server02" boot-time="true"/>
        </system-properties>
    </server>
</servers>

2) domain.xml ์„ค์ • (Web Subsystem ์ ์šฉ)

์ •์˜ํ•œ ์‹œ์Šคํ…œ ํ”„๋กœํผํ‹ฐ(${jvmRoute})๋ฅผ ์›น ์„œ๋ธŒ์‹œ์Šคํ…œ์˜ instance-id๋กœ ๋งคํ•‘ํ•ฉ๋‹ˆ๋‹ค.

<subsystem xmlns="urn:jboss:domain:web:2.2" default-virtual-server="default-host" instance-id="${jvmRoute}" native="false">
    <connector name="http" protocol="HTTP/1.1" scheme="http" socket-binding="http"/>
    <!-- AJP ์ปค๋„ฅํ„ฐ ํ•„์ˆ˜ (mod_jk ์—ฐ๋™ ์‹œ) -->
    <connector name="ajp" protocol="AJP/1.3" scheme="http" socket-binding="ajp"/>
    ...
</subsystem>

3. JGroups ๋„คํŠธ์›Œํฌ ์„ค์ • (UDP vs TCP)

JBoss ํด๋Ÿฌ์Šคํ„ฐ๋ง ๋ฉค๋ฒ„ ๊ฐ„์˜ ํ†ต์‹ ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ UDP(Multicast)๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ํด๋ผ์šฐ๋“œ ํ™˜๊ฒฝ์ด๋‚˜ ๋„คํŠธ์›Œํฌ ์žฅ๋น„์—์„œ ๋ฉ€ํ‹ฐ์บ์ŠคํŠธ๋ฅผ ์ฐจ๋‹จํ•˜๋Š” ๊ฒฝ์šฐ ํด๋Ÿฌ์Šคํ„ฐ๋ง์ด ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋Ÿด ๋• TCP(Unicast)๋กœ ๋ณ€๊ฒฝํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

domain.xml ์ˆ˜์ •

jgroups ์„œ๋ธŒ์‹œ์Šคํ…œ์˜ default-stack ์†์„ฑ์„ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.

<!-- ๊ธฐ์กด UDP ์„ค์ • -->
<subsystem xmlns="urn:jboss:domain:jgroups:1.1" default-stack="udp">

<!-- TCP๋กœ ๋ณ€๊ฒฝ -->
<subsystem xmlns="urn:jboss:domain:jgroups:1.1" default-stack="tcp">
    <stack name="tcp">
        <transport type="TCP" socket-binding="jgroups-tcp"/>
        ...
    </stack>
</subsystem>
์ฃผ์˜: TCP๋กœ ๋ณ€๊ฒฝ ์‹œ, MPING(๋ฉ€ํ‹ฐ์บ์ŠคํŠธ ๊ธฐ๋ฐ˜ ๋ฉค๋ฒ„ ๊ฒ€์ƒ‰) ๋Œ€์‹  TCPPING์„ ์‚ฌ์šฉํ•˜์—ฌ ์ •์ ์œผ๋กœ IP ๋ฆฌ์ŠคํŠธ๋ฅผ ์ง€์ •ํ•ด์•ผ ์„œ๋กœ๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ๋Š” ํ™˜๊ฒฝ์ด ๋งŽ์Šต๋‹ˆ๋‹ค. ๋„คํŠธ์›Œํฌ ๊ตฌ์„ฑ์— ๋”ฐ๋ผ ์ถ”๊ฐ€ ์„ค์ •์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

4. ๊ฒ€์ฆ (Verification)

  1. ์„œ๋ฒ„ ๊ธฐ๋™ ํ™•์ธ: ์„œ๋ฒ„ ์‹œ์ž‘ ๋กœ๊ทธ์— Received new cluster view ๋ฉ”์‹œ์ง€๊ฐ€ ๋‚˜ํƒ€๋‚˜๋ฉฐ ๋ฉค๋ฒ„๋“ค์ด ์„œ๋กœ๋ฅผ ์ธ์‹ํ•˜๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
  2. ์„ธ์…˜ ID ํ™•์ธ: ๋ธŒ๋ผ์šฐ์ € ๊ฐœ๋ฐœ์ž ๋„๊ตฌ(F12)์—์„œ JSESSIONID ์ฟ ํ‚ค ๊ฐ’ ๋’ค์— .Server01 ์ฒ˜๋Ÿผ jvmRoute ๊ฐ’์ด ๋ถ™๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
  3. Failover ํ…Œ์ŠคํŠธ: ํ•œ ์ชฝ ์„œ๋ฒ„๋ฅผ ๊ฐ•์ œ๋กœ ๋‚ด๋ฆฐ ํ›„(Shutdown), ๋‹ค๋ฅธ ์„œ๋ฒ„์—์„œ ๋กœ๊ทธ์ธ ํ’€๋ฆผ ์—†์ด ์„ธ์…˜์ด ์œ ์ง€๋˜๋Š”์ง€ ํ…Œ์ŠคํŠธํ•ฉ๋‹ˆ๋‹ค.

[JBoss EAP 6] ๋„๋ฉ”์ธ ๋ชจ๋“œ(Domain Mode) ์„œ๋ฒ„ ๋กœ๊ทธ ๊ฒฝ๋กœ ๋ณ€๊ฒฝ ๋ฐ ๋ถ„๋ฆฌ ์„ค์ •

JBoss EAP 6๋ฅผ ๋„๋ฉ”์ธ ๋ชจ๋“œ(Domain Mode)๋กœ ์šด์˜ํ•  ๋•Œ, ๊ธฐ๋ณธ ๋กœ๊ทธ ๊ฒฝ๋กœ๊ฐ€ ์•„๋‹Œ ๋ณ„๋„์˜ ๋””์Šคํฌ ๊ฒฝ๋กœ๋กœ ๋กœ๊ทธ๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค. domain.xml์˜ paths ์„ค์ •๊ณผ logging ์„œ๋ธŒ์‹œ์Šคํ…œ์„ ์ˆ˜์ •ํ•˜์—ฌ ๊ฐ ์„œ๋ฒ„ ์ธ์Šคํ„ด์Šค๋ณ„๋กœ ๋กœ๊ทธ ํด๋”๋ฅผ ๋™์ ์œผ๋กœ ๋ถ„๋ฆฌํ•˜๋Š” ๊ตฌ์„ฑ์„ ๋‹ค๋ฃน๋‹ˆ๋‹ค.

0. ๋ฐฐ๊ฒฝ ์ง€์‹ (Context)

๋„๋ฉ”์ธ ๋ชจ๋“œ์—์„œ๋Š” ํ•˜๋‚˜์˜ ๋„๋ฉ”์ธ ์ปจํŠธ๋กค๋Ÿฌ(Domain Controller)๊ฐ€ ์—ฌ๋Ÿฌ ์„œ๋ฒ„ ๊ทธ๋ฃน๊ณผ ์ธ์Šคํ„ด์Šค๋ฅผ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ๋กœ๊ทธ ์„ค์ • ์‹œ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ์ ์€ "์—ฌ๋Ÿฌ ์„œ๋ฒ„๊ฐ€ ๋™์‹œ์— ์‹คํ–‰๋  ๋•Œ ๋กœ๊ทธ ํŒŒ์ผ์ด ์„ž์ด์ง€ ์•Š๊ฒŒ ํ•˜๋Š” ๊ฒƒ"์ž…๋‹ˆ๋‹ค.

์ด๋ฅผ ์œ„ํ•ด JBoss๋Š” ${jboss.server.name}์ด๋ผ๋Š” ์‹œ์Šคํ…œ ๋ณ€์ˆ˜๋ฅผ ์ œ๊ณตํ•˜์—ฌ, ์„ค์ •์€ ํ•œ ๋ฒˆ๋งŒ ํ•˜๋”๋ผ๋„ ์‹ค์ œ ๋กœ๊ทธ๋Š” ๊ฐ ์„œ๋ฒ„์˜ ์ด๋ฆ„์œผ๋กœ ๋œ ํด๋”์— ์Œ“์ด๋„๋ก ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


1. ์‚ฌ์ „ ์ค€๋น„ ๋ฐ ๋ฐฑ์—…

์„ค์ • ๋ณ€๊ฒฝ ์ค‘ ์˜คํƒ€๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด JBoss ๋„๋ฉ”์ธ ์ „์ฒด๊ฐ€ ๊ธฐ๋™๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž‘์—… ์ „ ๋ฐ˜๋“œ์‹œ ์„ค์ • ํŒŒ์ผ์„ ๋ฐฑ์—…ํ•˜์‹ญ์‹œ์˜ค.

๋ฐฑ์—… ๋Œ€์ƒ

  • ํŒŒ์ผ ๊ฒฝ๋กœ: [EAP_HOME]/domain/configuration/domain.xml
# ๋ฐฑ์—… ์˜ˆ์‹œ
cp domain.xml domain.xml.bak_YYYYMMDD

2. ๋กœ๊ทธ ๊ฒฝ๋กœ(Path) ์ •์˜

๋จผ์ € ๋กœ๊ทธ๋ฅผ ์ €์žฅํ•  ๋ฌผ๋ฆฌ์ ์ธ ๋””๋ ‰ํ† ๋ฆฌ ๊ฒฝ๋กœ๋ฅผ domain.xml ๋‚ด์— ๋…ผ๋ฆฌ์ ์ธ ์ด๋ฆ„์œผ๋กœ ์ •์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด ์„ค์ •์€ ํŒŒ์ผ์˜ ์ƒ๋‹จ <paths> ์„น์…˜์— ์œ„์น˜ํ•ฉ๋‹ˆ๋‹ค.

domain.xml ์ˆ˜์ •

๊ธฐ์กด <paths> ํƒœ๊ทธ ๋‚ด๋ถ€์— ์ƒˆ๋กœ์šด ๊ฒฝ๋กœ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

<paths>
    <!-- ๊ธฐ์กด ๊ฒฝ๋กœ๋“ค ... -->
    
    <!-- ์‹ ๊ทœ ๋กœ๊ทธ ๊ฒฝ๋กœ ์ •์˜ -->
    <!-- name: ์„ค์ •์—์„œ ์‚ฌ์šฉํ•  ๋…ผ๋ฆฌ์  ์ด๋ฆ„ / path: ์‹ค์ œ ํŒŒ์ผ ์‹œ์Šคํ…œ ๊ฒฝ๋กœ -->
    <path name="server.log.dir" path="D:\app\log"/>
</paths>
์ฃผ์˜: Windows ํ™˜๊ฒฝ์—์„œ๋Š” ๋ฐฑ์Šฌ๋ž˜์‹œ(\)๋ฅผ ์‚ฌ์šฉํ•˜๊ณ , Linux ํ™˜๊ฒฝ์—์„œ๋Š” ์Šฌ๋ž˜์‹œ(/)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฒฝ๋กœ๋ฅผ ์ง€์ •ํ•˜์‹ญ์‹œ์˜ค. ๋˜ํ•œ ํ•ด๋‹น ๊ฒฝ๋กœ์— JBoss ์‹คํ–‰ ๊ณ„์ •์ด ์“ฐ๊ธฐ ๊ถŒํ•œ์„ ๊ฐ€์ง€๊ณ  ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

3. ํ”„๋กœํŒŒ์ผ(Profile) ๋กœ๊น… ์„ค์ • ์ ์šฉ

์œ„์—์„œ ์ •์˜ํ•œ ๊ฒฝ๋กœ๋ฅผ ์‹ค์ œ๋กœ ์‚ฌ์šฉํ•˜๋„๋ก ๋กœ๊น… ์„œ๋ธŒ์‹œ์Šคํ…œ(Subsystem)์„ ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค. ๋„๋ฉ”์ธ ๋ชจ๋“œ์—๋Š” ์—ฌ๋Ÿฌ ํ”„๋กœํŒŒ์ผ(default, ha, full, full-ha ๋“ฑ)์ด ์กด์žฌํ•˜๋ฏ€๋กœ, ํ˜„์žฌ ์šด์˜ ์ค‘์ธ ์„œ๋ฒ„ ๊ทธ๋ฃน์ด ์‚ฌ์šฉํ•˜๋Š” ํ”„๋กœํŒŒ์ผ์„ ์ •ํ™•ํžˆ ์ฐพ์•„ ์ˆ˜์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

domain.xml ์ˆ˜์ • (logging subsystem)

<profile name="ha"> (์˜ˆ์‹œ) ๋‚ด๋ถ€์˜ ๋กœ๊น… ์„ค์ •์„ ์ฐพ์•„ file-handler ๋ถ€๋ถ„์„ ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค.

<profile name="ha">
    <subsystem xmlns="urn:jboss:domain:logging:1.2">
        <!-- Console Handler ์ƒ๋žต -->

        <!-- File Handler ์ˆ˜์ • -->
        <periodic-rotating-file-handler name="FILE" autoflush="true">
            <formatter>
                <named-formatter name="PATTERN"/>
            <formatter>
            
            <!-- ํ•ต์‹ฌ ์„ค์ • ๋ถ€๋ถ„ -->
            <!-- relative-to: ์œ„์—์„œ ์ •์˜ํ•œ ๊ฒฝ๋กœ ๋ณ€์ˆ˜ ์ฐธ์กฐ -->
            <!-- path: ์„œ๋ฒ„ ์ด๋ฆ„๋ณ„๋กœ ํด๋” ์ž๋™ ์ƒ์„ฑ -->
            <file relative-to="server.log.dir" path="${jboss.server.name}/server.log"/>
            
            <suffix value=".yyyy-MM-dd"/>
            <append value="true"/>
        </periodic-rotating-file-handler>
        
        <!-- ์ดํ•˜ ์ƒ๋žต -->
    </subsystem>
</profile>

์„ค์ • ์„ค๋ช…

  • relative-to="server.log.dir": 2๋ฒˆ ๋‹จ๊ณ„์—์„œ ์ •์˜ํ•œ D:\app\log๋ฅผ ๊ธฐ์ค€ ๊ฒฝ๋กœ๋กœ ์žก์Šต๋‹ˆ๋‹ค.
  • path="${jboss.server.name}/server.log": ๊ธฐ์ค€ ๊ฒฝ๋กœ ํ•˜์œ„์— ์„œ๋ฒ„ ์ธ์Šคํ„ด์Šค ์ด๋ฆ„(์˜ˆ: Server1, Server2)์œผ๋กœ ํด๋”๋ฅผ ๋งŒ๋“ค๊ณ  ๊ทธ ์•ˆ์— server.log๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

4. ์ ์šฉ ๋ฐ ๊ฒ€์ฆ (Verification)

domain.xml์€ ์ •์  ์„ค์ • ํŒŒ์ผ์ด๋ฏ€๋กœ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ ์šฉํ•˜๋ ค๋ฉด ๋„๋ฉ”์ธ ์ „์ฒด ์žฌ๊ธฐ๋™์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

์žฌ๊ธฐ๋™

# Linux
[EAP_HOME]/bin/domain.sh

# Windows
[EAP_HOME]\bin\domain.bat

๊ฒฐ๊ณผ ํ™•์ธ

์„œ๋ฒ„๊ฐ€ ๊ธฐ๋™๋œ ํ›„, ํƒ์ƒ‰๊ธฐ๋‚˜ ์‰˜์„ ํ†ตํ•ด ์ง€์ •ํ•œ ๊ฒฝ๋กœ(D:\app\log)์— ์„œ๋ฒ„๋ณ„ ํด๋”๊ฐ€ ์ƒ์„ฑ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

D:\app\log\
    ├── Server1\
    │     └── server.log
    └── Server2\
          └── server.log

Next Step:
๋กœ๊ทธ ๊ฒฝ๋กœ ๋ณ€๊ฒฝ์— ์„ฑ๊ณตํ–ˆ๋‹ค๋ฉด, ์šด์˜ ํŽธ์˜๋ฅผ ์œ„ํ•ด ๋กœ๊ทธ ํŒŒ์ผ์˜ ๋ณด๊ด€ ์ฃผ๊ธฐ(Retention Policy)๋ฅผ ์„ค์ •ํ•˜๊ฑฐ๋‚˜, ๋กœ๊ทธ ํฌ๋งท(Formatter)์„ ๋ณ€๊ฒฝํ•˜์—ฌ ๊ฐ€๋…์„ฑ์„ ๋†’์ด๋Š” ์ž‘์—…์„ ๊ณ ๋ คํ•ด ๋ณด์‹ญ์‹œ์˜ค.