[Apache/IHS] ์„œ๋ฒ„ ์„ฑ๋Šฅ ํŠœ๋‹์˜ ํ•ต์‹ฌ: MaxRequestWorkers ๊ณ„์‚ฐ๋ฒ• ๋ฐ MPM ์„ค์ • ์™„๋ฒฝ ๊ฐ€์ด๋“œ

"์‚ฌ์šฉ์ž๊ฐ€ ๋ชฐ๋ฆฌ๋ฉด ์„œ๋ฒ„๊ฐ€ ์‘๋‹ต์ด ์—†์–ด์š”." ์ด๋Ÿฐ ๋ฌธ์ œ์˜ 90%๋Š” ๋™์‹œ ์ ‘์†์ž ์ฒ˜๋ฆฌ ์„ค์ •์ธ MPM(Multi-Processing Module) ํŠœ๋‹์œผ๋กœ ํ•ด๊ฒฐ๋ฉ๋‹ˆ๋‹ค. ๋ฌผ๋ฆฌ ๋ฉ”๋ชจ๋ฆฌ ํ•œ๊ณ„ ๋‚ด์—์„œ ์ตœ๋Œ€ ์„ฑ๋Šฅ์„ ๋Œ์–ด๋‚ด๋Š” MaxRequestWorkers ์„ค์ •๋ฒ•๊ณผ ServerLimit์˜ ๊ด€๊ณ„๋ฅผ ๋‹จ๊ณ„๋ณ„๋กœ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

0. ํŠœ๋‹์˜ ํ•ต์‹ฌ ๊ณต์‹ (The Formula)

ํŠœ๋‹์€ '๊ฐ'์œผ๋กœ ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค. ๋ฉ”๋ชจ๋ฆฌ ๋ถ€์กฑ์œผ๋กœ ์ธํ•œ ์Šค์™‘(Swap) ๋ฐœ์ƒ์„ ๋ง‰๋Š” ๊ฒƒ์ด ์ตœ์šฐ์„  ๋ชฉํ‘œ์ด๋ฉฐ, ์ด๋Š” ์ •ํ™•ํ•œ ๊ณ„์‚ฐ์—์„œ ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค.

MaxRequestWorkers = (์ด RAM - OS/DB ์‚ฌ์šฉ RAM) / (Apache ํ”„๋กœ์„ธ์Šค 1๊ฐœ์˜ ํ‰๊ท  ๋ฉ”๋ชจ๋ฆฌ)

1. 3๋‹จ๊ณ„ ๊ณ„์‚ฐ๋ฒ•: ๋‚ด ์„œ๋ฒ„์˜ ํ•œ๊ณ„๊ฐ’ ์ฐพ๊ธฐ

Step 1: Apache ํ”„๋กœ์„ธ์Šค ํ‰๊ท  ๋ฉ”๋ชจ๋ฆฌ ์ธก์ •

๋จผ์ €, ํ˜„์žฌ ๊ตฌ๋™ ์ค‘์ธ httpd(๋˜๋Š” apache2) ํ”„๋กœ์„ธ์Šค ํ•˜๋‚˜๊ฐ€ ์‹ค์ œ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ(RSS)์˜ ํ‰๊ท ์„ ๊ตฌํ•ฉ๋‹ˆ๋‹ค.

# SSH ์ ‘์† ํ›„ ์‹คํ–‰ (๊ฒฐ๊ณผ ๋‹จ์œ„: MB)
ps -ylC httpd --sort:rss | awk '{sum+=$8; ++n} END {print "Average RSS: " sum/n/1024 " MB"}'

(์˜ˆ์‹œ ๊ฒฐ๊ณผ: 45.5 MB)

Step 2: Apache ๊ฐ€์šฉ RAM ์‚ฐ์ •

์„œ๋ฒ„์˜ ์ „์ฒด ๋ฉ”๋ชจ๋ฆฌ์—์„œ OS์™€ ๋‹ค๋ฅธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜(DB ๋“ฑ)์ด ์‚ฌ์šฉํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ œ์™ธํ•ฉ๋‹ˆ๋‹ค.

# ์ „์ฒด ๋ฉ”๋ชจ๋ฆฌ ํ™•์ธ
free -m

(์˜ˆ์‹œ: 16GB ์„œ๋ฒ„์—์„œ OS/DB๊ฐ€ 6GB ์‚ฌ์šฉ ์ค‘ -> Apache์šฉ ๊ฐ€์šฉ ๋ฉ”๋ชจ๋ฆฌ 10GB (10,240 MB))

Step 3: ์ตœ์ข… ์„ค์ •๊ฐ’ ๋„์ถœ

์œ„์—์„œ ๊ตฌํ•œ ๊ฐ’์„ ๊ณต์‹์— ๋Œ€์ž…ํ•ฉ๋‹ˆ๋‹ค.

  • ๊ณ„์‚ฐ: 10,240 MB / 45.5 MB = 225.05
  • ๊ฒฐ๋ก : ์†Œ์ˆ˜์ ์€ ๋ฒ„๋ฆฌ๊ณ  225๋ฅผ MaxRequestWorkers ๊ฐ’์œผ๋กœ ์„ ์ •ํ•ฉ๋‹ˆ๋‹ค.

2. ๋ณด์ด์ง€ ์•Š๋Š” ๋ฒฝ: Limit ์ง€์‹œ์–ด์˜ ์ดํ•ด

MaxRequestWorkers ๊ฐ’๋งŒ ๋†’์ธ๋‹ค๊ณ  ๋์ด ์•„๋‹™๋‹ˆ๋‹ค. ์ด ๊ฐ’์€ ์ƒ์œ„ ์ œํ•œ(Hard Limit) ์„ค์ •์ธ ServerLimit๊ณผ ThreadLimit ์•ˆ์—์„œ๋งŒ ์œ ํšจํ•ฉ๋‹ˆ๋‹ค.

  • ๊ทœ์น™: MaxRequestWorkers ≤ (ServerLimit × ThreadsPerChild)

๋งŒ์•ฝ ๊ณ„์‚ฐ๋œ ๊ฐ’์ด ๊ธฐ๋ณธ ํ•œ๊ณ„(๋ณดํ†ต ServerLimit 16)๋ฅผ ์ดˆ๊ณผํ•œ๋‹ค๋ฉด, ๋ฐ˜๋“œ์‹œ ์„ค์ • ํŒŒ์ผ์— ServerLimit์„ ๋ช…์‹œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.


3. ํŠœ๋‹ ์ „๋žต: ์•ˆ์ •์„ฑ vs ํšจ์œจ์„ฑ

Event/Worker MPM์„ ์‚ฌ์šฉํ•  ๋•Œ, ์„ฑ๋Šฅ์„ ๋†’์ด๋Š” ๋ฐฉํ–ฅ์€ ๋‘ ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค.

๊ตฌ๋ถ„ ServerLimit ์ฆ๊ฐ€ (ํ”„๋กœ์„ธ์Šค ↑) ThreadsPerChild ์ฆ๊ฐ€ (์Šค๋ ˆ๋“œ ↑)
์•ˆ์ •์„ฑ ๋†’์Œ (ํ•˜๋‚˜๊ฐ€ ์ฃฝ์–ด๋„ ๋‚˜๋จธ์ง€๋Š” ์ƒ์กด) ๋‚ฎ์Œ (์Šค๋ ˆ๋“œ ํ•˜๋‚˜๊ฐ€ ์ฃฝ์œผ๋ฉด ํ”„๋กœ์„ธ์Šค ์ „์ฒด ๋‹ค์šด)
๋ฉ”๋ชจ๋ฆฌ ํšจ์œจ ๋‚ฎ์Œ (๋…๋ฆฝ ๋ฉ”๋ชจ๋ฆฌ ํ•„์š”) ๋†’์Œ (๋ฉ”๋ชจ๋ฆฌ ๊ณต์œ )
๊ถŒ์žฅ ✅ ์ ๊ทน ๊ถŒ์žฅ ⚠️ ์‹ ์ค‘ํ•œ ์ ‘๊ทผ ํ•„์š” (๋ณดํ†ต 25~64 ๊ณ ์ •)

4. ์ตœ์ข… ์„ค์ • ์˜ˆ์‹œ (httpd.conf)

์œ„์˜ ๊ณ„์‚ฐ ๊ฒฐ๊ณผ(MaxRequestWorkers 1000 ๊ฐ€์ •)๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ํ•œ Event MPM ์ตœ์ข… ์„ค์ • ์˜ˆ์‹œ์ž…๋‹ˆ๋‹ค.

<IfModule mpm_event_module>
    # 1. ์Šค๋ ˆ๋“œ ์ˆ˜๋Š” ์•ˆ์ •์ ์ธ ๊ฐ’์œผ๋กœ ๊ณ ์ • (25)
    ThreadsPerChild         25

    # 2. ํ•„์š”ํ•œ ํ”„๋กœ์„ธ์Šค ์ˆ˜ ๊ณ„์‚ฐ (1000 / 25 = 40)
    # ๊ธฐ๋ณธ๊ฐ’(16)๋ณด๋‹ค ํฌ๋ฏ€๋กœ ๋ฐ˜๋“œ์‹œ ๋ช…์‹œํ•ด์•ผ ํ•จ
    ServerLimit             40

    # 3. ๋ชฉํ‘œ ๋™์‹œ ์ฒ˜๋ฆฌ ์ˆ˜ (40 * 25 = 1000)
    MaxRequestWorkers       1000

    # 4. ๊ธฐํƒ€ ํ”„๋กœ์„ธ์Šค ๊ด€๋ฆฌ ์˜ต์…˜
    StartServers            4
    MinSpareThreads         75
    MaxSpareThreads         250
    MaxConnectionsPerChild  0
</IfModule>
Check Point: ์„ค์ •์„ ๋งˆ์นœ ํ›„์—๋Š” ๋ฐ˜๋“œ์‹œ apachectl -t ๋˜๋Š” httpd -t ๋ช…๋ น์–ด๋กœ ๋ฌธ๋ฒ• ์˜ค๋ฅ˜๊ฐ€ ์—†๋Š”์ง€ ํ™•์ธํ•˜๊ณ  ์žฌ๊ธฐ๋™ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

[Apache] ๋ณด์•ˆ ์ทจ์•ฝ์  ์กฐ์น˜: ์„œ๋ฒ„ ๋ฒ„์ „ ์ •๋ณด ์ˆจ๊ธฐ๊ธฐ (ServerTokens, ServerSignature)

Apache ์›น ์„œ๋ฒ„ ์šด์˜ ์‹œ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋…ธ์ถœ๋˜๋Š” ์„œ๋ฒ„ ๋ฒ„์ „(Version), ์šด์˜์ฒด์ œ(OS), ๋ชจ๋“ˆ(Module) ์ •๋ณด๋ฅผ ์ˆจ๊ฒจ ๋ณด์•ˆ์„ฑ์„ ๋†’์ด๋Š” ๋ฐฉ๋ฒ•์„ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค. httpd.conf ํŒŒ์ผ์˜ ServerTokens ๋ฐ ServerSignature ์ง€์‹œ์–ด๋ฅผ ์ตœ์ ํ™”ํ•˜์—ฌ ์ •๋ณด ์œ ์ถœ ์ทจ์•ฝ์ ์„ ์กฐ์น˜ํ•ฉ๋‹ˆ๋‹ค.

0. ๋ฐฐ๊ฒฝ ๋ฐ ์ทจ์•ฝ์  (Context)

๊ณต๊ฒฉ์ž๋Š” Banner Grabbing ๊ธฐ๋ฒ•์„ ํ†ตํ•ด ๋Œ€์ƒ ์„œ๋ฒ„์˜ ๊ตฌ์ฒด์ ์ธ ๋ฒ„์ „ ์ •๋ณด๋ฅผ ์ˆ˜์ง‘ํ•˜๊ณ , ํ•ด๋‹น ๋ฒ„์ „์— ์•Œ๋ ค์ง„ ์ทจ์•ฝ์ (CVE)์„ ์ด์šฉํ•ด ๊ณต๊ฒฉ์„ ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์„œ๋ฒ„ ์ •๋ณด ๋…ธ์ถœ์„ ์ตœ์†Œํ™”ํ•˜๋Š” ๊ฒƒ์€ ๋ณด์•ˆ ๊ฐ•ํ™”(Hardening)์˜ ์ฒซ๊ฑธ์Œ์ž…๋‹ˆ๋‹ค.


1. ํ•„์ˆ˜ ์„ค์ • (Basic Configuration)

Apache ์„ค์ • ํŒŒ์ผ(httpd.conf ๋˜๋Š” security.conf)์—์„œ ๋‹ค์Œ ๋‘ ๊ฐ€์ง€ ์ง€์‹œ์–ด๋ฅผ ์ฐพ์•„ ์ˆ˜์ •ํ•˜๊ฑฐ๋‚˜ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

1) ํ—ค๋” ์ •๋ณด ์ œํ•œ (ServerTokens)

HTTP ์‘๋‹ต ํ—ค๋”์˜ Server ํ•„๋“œ์— ํ‘œ์‹œ๋˜๋Š” ์ •๋ณด๋Ÿ‰์„ ์ œ์–ดํ•ฉ๋‹ˆ๋‹ค.

  • ๊ธฐ๋ณธ๊ฐ’ (Full): Apache/2.4.6 (CentOS) OpenSSL/1.0.2k-fips PHP/7.0 ... (๋ชจ๋‘ ๋…ธ์ถœ)
  • ๊ถŒ์žฅ๊ฐ’ (Prod): Apache (์ œํ’ˆ๋ช…๋งŒ ๋…ธ์ถœ)
# Server ํ—ค๋”์— ์ œํ’ˆ๋ช…(Apache)๋งŒ ํ‘œ์‹œ
ServerTokens Prod

2) ์—๋Ÿฌ ํŽ˜์ด์ง€ ์„œ๋ช… ์ œ๊ฑฐ (ServerSignature)

404 Not Found, 403 Forbidden ๋“ฑ ์—๋Ÿฌ ํŽ˜์ด์ง€ ํ•˜๋‹จ์— ํ‘œ์‹œ๋˜๋Š” ์„œ๋ฒ„ ์ •๋ณด๋ฅผ ์ œ์–ดํ•ฉ๋‹ˆ๋‹ค.

  • ๊ธฐ๋ณธ๊ฐ’ (On): ์—๋Ÿฌ ๋ฉ”์‹œ์ง€ ํ•˜๋‹จ์— ์„œ๋ฒ„ ๋ฒ„์ „๊ณผ ํฌํŠธ ์ •๋ณด๊ฐ€ ํ‘œ์‹œ๋จ
  • ๊ถŒ์žฅ๊ฐ’ (Off): ํ•˜๋‹จ ์„œ๋ช… ๋ผ์ธ์„ ์ œ๊ฑฐํ•จ
# ์—๋Ÿฌ ํŽ˜์ด์ง€ ํ•˜๋‹จ์— ์„œ๋ฒ„ ์ •๋ณด ์ˆจ๊น€
ServerSignature Off

2. ์‹ฌํ™” ์„ค์ • (Advanced Configuration)

์œ„์˜ ServerTokens Prod ์„ค์ •์„ ์ ์šฉํ•ด๋„ Server: Apache๋ผ๋Š” ์ •๋ณด๋Š” ์—ฌ์ „ํžˆ ๋‚จ์Šต๋‹ˆ๋‹ค. ๋ณด์•ˆ ๊ฐ์‚ฌ๋ฅผ ์œ„ํ•ด ์ด ํ—ค๋”์กฐ์ฐจ ์•„์˜ˆ ์‚ญ์ œํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด mod_headers ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Pre-check: ์ด ์„ค์ •์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด LoadModule headers_module modules/mod_headers.so ๋ผ์ธ์˜ ์ฃผ์„์ด ํ•ด์ œ๋˜์–ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
<IfModule mod_headers.c>
    # Server ํ—ค๋” ์ž์ฒด๋ฅผ ์‘๋‹ต์—์„œ ์ œ๊ฑฐ (๊ถŒ์žฅ)
    Header unset Server
    
    # ๋˜๋Š” ๋‹ค๋ฅธ ์ด๋ฆ„์œผ๋กœ ์œ„์žฅ (Security by Obscurity)
    # Header set Server "MySecureServer"
</IfModule>

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

์„œ๋น„์Šค ์žฌ๊ธฐ๋™

# Syntax ๊ฒ€์‚ฌ
apachectl -t

# ์„œ๋น„์Šค ์žฌ๊ธฐ๋™ (CentOS/RHEL)
systemctl restart httpd

# ์„œ๋น„์Šค ์žฌ๊ธฐ๋™ (Ubuntu/Debian)
systemctl restart apache2

์ ์šฉ ํ™•์ธ (curl)

curl -I ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ์‘๋‹ต ํ—ค๋”๋งŒ ์กฐํšŒํ•ด ๋ด…๋‹ˆ๋‹ค.

# ๋ช…๋ น ์‹คํ–‰
curl -I http://localhost

# [Before]
HTTP/1.1 200 OK
Server: Apache/2.4.6 (CentOS) ... (์ทจ์•ฝ)

# [After 1 - Prod ์ ์šฉ]
Server: Apache

# [After 2 - Header unset ์ ์šฉ]
(Server ํ—ค๋”๊ฐ€ ์•„์˜ˆ ๋ณด์ด์ง€ ์•Š์Œ)

Next Step:
์„œ๋ฒ„ ์ •๋ณด ์ˆจ๊น€ ์กฐ์น˜๊ฐ€ ์™„๋ฃŒ๋˜์—ˆ๋‹ค๋ฉด, ์ถ”๊ฐ€์ ์ธ ๋ณด์•ˆ ๊ฐ•ํ™”๋ฅผ ์œ„ํ•ด X-Content-Type-Options, X-Frame-Options ๋“ฑ ๋ณด์•ˆ ํ—ค๋” ์ ์šฉ์„ ๊ฒ€ํ† ํ•ด ๋ณด์‹ญ์‹œ์˜ค.

[Apache] CentOS 7 ์†Œ์Šค ์ปดํŒŒ์ผ ์„ค์น˜ ์™„๋ฒฝ ๊ฐ€์ด๋“œ: ์˜์กด์„ฑ(APR, PCRE, OpenSSL) ํฌํ•จ

CentOS 7 ํ™˜๊ฒฝ์—์„œ Apache HTTP Server 2.4๋ฅผ ์†Œ์Šค ์ฝ”๋“œ๋กœ ์ปดํŒŒ์ผํ•˜์—ฌ ์„ค์น˜ํ•˜๋Š” ์ „์ฒด ๊ณผ์ •์„ ๋‹ค๋ฃน๋‹ˆ๋‹ค. APR, APR-Util, PCRE, OpenSSL ๋“ฑ ํ•„์ˆ˜ ์˜์กด์„ฑ ํŒจํ‚ค์ง€๋ฅผ ๋ณ„๋„ ๊ฒฝ๋กœ(Custom Path)์— ์„ค์น˜ํ•˜๊ณ  ์ด๋ฅผ Apache์™€ ์—ฐ๋™ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ค‘์ ์ ์œผ๋กœ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

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

์†Œ์Šค ์ปดํŒŒ์ผ์„ ์œ„ํ•ด ํ•„์š”ํ•œ C ์ปดํŒŒ์ผ๋Ÿฌ์™€ ๊ธฐ๋ณธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค.

OS ๋ฐ ์ปดํŒŒ์ผ ๋„๊ตฌ ํ™•์ธ

  • OS: CentOS 7 (Kernel 3.10.0)
  • ํŒจํ‚ค์ง€ ์„ค์น˜: yum -y install gcc make gcc-c++ pcre-devel expat-devel

1. ์˜์กด์„ฑ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์„ค์น˜ (Dependencies)

Apache 2.4 ๊ตฌ๋™์— ํ•„์š”ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค์„ /SW/web/tools ํ•˜์œ„์— ๊ฒฉ๋ฆฌํ•˜์—ฌ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์‹œ์Šคํ…œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€์˜ ์ถฉ๋Œ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•จ์ž…๋‹ˆ๋‹ค.

1) APR (Apache Portable Runtime)

OS ๊ฐ„์˜ ์ฐจ์ด๋ฅผ ์ถ”์ƒํ™”ํ•ด ์ฃผ๋Š” ํ•ต์‹ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ž…๋‹ˆ๋‹ค.

# ๋‹ค์šด๋กœ๋“œ ๋ฐ ์••์ถ• ํ•ด์ œ ํ›„ ์ด๋™
./configure --prefix=/SW/web/tools/apr
make && make install

2) APR-Util

APR์˜ ์œ ํ‹ธ๋ฆฌํ‹ฐ ํ™•์žฅํŒ์ด๋ฉฐ, ๋ฐ˜๋“œ์‹œ APR์ด ๋จผ์ € ์„ค์น˜๋˜์–ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

# --with-apr ์˜ต์…˜์œผ๋กœ ์œ„์—์„œ ์„ค์น˜ํ•œ ๊ฒฝ๋กœ ์ง€์ • ํ•„์ˆ˜
./configure --prefix=/SW/web/tools/apr-util --with-apr=/SW/web/tools/apr
make && make install

3) PCRE (Perl Compatible Regular Expressions)

URL ์žฌ์ž‘์„ฑ(Rewrite) ๋ชจ๋“ˆ ๋“ฑ ์ •๊ทœ ํ‘œํ˜„์‹ ์ฒ˜๋ฆฌ์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

./configure --prefix=/SW/web/tools/pcre
make && make install

4) OpenSSL (HTTPS ์ง€์›)

๋ณด์•ˆ ํ†ต์‹ (SSL/TLS)์„ ์œ„ํ•ด OpenSSL ์†Œ์Šค๋ฅผ ์ปดํŒŒ์ผํ•ฉ๋‹ˆ๋‹ค.

# config ๋ช…๋ น์–ด๋กœ ๊ฒฝ๋กœ ์„ค์ •
./config --prefix=/SW/web/tools/openssl --openssldir=/SW/web/tools/openssl

make && make install

2. Apache (HTTPD) ์ปดํŒŒ์ผ ๋ฐ ์„ค์น˜

๋ชจ๋“  ์˜์กด์„ฑ์ด ์ค€๋น„๋˜์—ˆ์œผ๋ฏ€๋กœ Apache๋ฅผ ์ปดํŒŒ์ผํ•ฉ๋‹ˆ๋‹ค. configure ๋‹จ๊ณ„์—์„œ ์•ž์„œ ์„ค์น˜ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค์˜ ๊ฒฝ๋กœ๋ฅผ ์ •ํ™•ํžˆ ์ง€์ •ํ•˜๋Š” ๊ฒƒ์ด ํ•ต์‹ฌ์ž…๋‹ˆ๋‹ค.

Configure ์‹คํ–‰

tar -zxvf httpd-2.4.41.tar.gz
cd httpd-2.4.41

# ์„ค์ • (ํ•œ ์ค„๋กœ ์ž…๋ ฅ)
./configure \
--prefix=/SW/web/httpd24 \
--enable-so \
--enable-rewrite \
--enable-proxy \
--enable-ssl \
--enable-mods-shared=all \
--enable-modules=shared \
--enable-mpms-shared=all \
--with-mpm=worker \
--with-apr=/SW/web/tools/apr \
--with-apr-util=/SW/web/tools/apr-util \
--with-pcre=/SW/web/tools/pcre \
--with-ssl=/SW/web/tools/openssl \
--enable-unique-id

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

  • --enable-so: DSO(Dynamic Shared Object) ๋ชจ๋“ˆ ์ ์žฌ ๊ธฐ๋Šฅ ํ™œ์„ฑํ™” (ํ•„์ˆ˜)
  • --enable-mods-shared=all: ๋ชจ๋“  ๋ชจ๋“ˆ์„ ๋™์  ๋ชจ๋“ˆ๋กœ ์ปดํŒŒ์ผ
  • --with-mpm=worker: ๋ฉ€ํ‹ฐ ํ”„๋กœ์„ธ์Šค ๋ชจ๋“ˆ(MPM)์„ Worker ๋ฐฉ์‹์œผ๋กœ ์ง€์ • (์„ฑ๋Šฅ ์œ ๋ฆฌ)
  • --with-[lib]: ์•ž์„œ ์„ค์น˜ํ•œ ์˜์กด์„ฑ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๊ฒฝ๋กœ ์—ฐ๊ฒฐ

์ปดํŒŒ์ผ ๋ฐ ์„ค์น˜

make && make install

3. ๊ตฌ๋™ ๋ฐ ๊ฒ€์ฆ (Verification)

์„ค์น˜๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด ์„œ๋น„์Šค๋ฅผ ๊ธฐ๋™ํ•˜๊ณ  ๋ธŒ๋ผ์šฐ์ € ์ ‘์†์„ ํ…Œ์ŠคํŠธํ•ฉ๋‹ˆ๋‹ค.

์„œ๋น„์Šค ๊ธฐ๋™

# Apache ์ปจํŠธ๋กค๋Ÿฌ ์‹คํ–‰
/SW/web/httpd24/bin/apachectl start

# ํ”„๋กœ์„ธ์Šค ํ™•์ธ
ps -ef | grep httpd
netstat -anotp | grep :80

๋ฐฉํ™”๋ฒฝ ์„ค์ • (CentOS 7)

ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋–  ์žˆ์–ด๋„ ๋ฐฉํ™”๋ฒฝ์ด ๋ง‰ํ˜€์žˆ์œผ๋ฉด ์ ‘์†์ด ์•ˆ ๋ฉ๋‹ˆ๋‹ค. 80 ํฌํŠธ๋ฅผ ์—ด์–ด์ค๋‹ˆ๋‹ค.

firewall-cmd --permanent --zone=public --add-port=80/tcp
firewall-cmd --reload

์ ‘์† ํ™•์ธ

๋ธŒ๋ผ์šฐ์ € ์ฃผ์†Œ์ฐฝ์— ์„œ๋ฒ„ IP๋ฅผ ์ž…๋ ฅํ•˜์—ฌ "It works!" ํŽ˜์ด์ง€๊ฐ€ ๋œจ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

Apache It Works Page

[๊ทธ๋ฆผ] ์„ค์น˜ ์„ฑ๊ณต ์‹œ ํ™•์ธ ๊ฐ€๋Šฅํ•œ ๊ธฐ๋ณธ ํŽ˜์ด์ง€


Next Step:
๊ธฐ๋ณธ ์„ค์น˜๊ฐ€ ์™„๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด์ œ ์šด์˜ ํ™˜๊ฒฝ์— ๋งž์ถฐ httpd.conf์—์„œ ServerName ๊ฒฝ๊ณ ๋ฅผ ํ•ด๊ฒฐํ•˜๊ณ , httpd-mpm.conf์—์„œ Worker ํ”„๋กœ์„ธ์Šค ํŠœ๋‹์„ ์ง„ํ–‰ํ•ด ๋ณด์‹ญ์‹œ์˜ค.

[Apache/IHS] IP ์ ‘์† ๋ฐ ๋ฏธ๋“ฑ๋ก ๋„๋ฉ”์ธ ์š”์ฒญ ์ฐจ๋‹จ ์„ค์ • (Default VirtualHost)

Apache(IHS) ์›น ์„œ๋ฒ„์—์„œ ๋„๋ฉ”์ธ๋ช…์ด ์•„๋‹Œ IP ์ฃผ์†Œ๋กœ ์ ‘์†ํ•˜๊ฑฐ๋‚˜, ServerName์— ์ •์˜๋˜์ง€ ์•Š์€ ์š”์ฒญ์ด ๋“ค์–ด์˜ฌ ๊ฒฝ์šฐ ์ด๋ฅผ ์ฐจ๋‹จํ•˜๊ฑฐ๋‚˜ ์—๋Ÿฌ ํŽ˜์ด์ง€๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ๋ฐฉ๋ฒ•์„ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ๊ฐ€์žฅ ๋จผ์ € ๋กœ๋”ฉ๋˜๋Š” Dummy VirtualHost๋ฅผ ํ™œ์šฉํ•˜๋Š” ๊ฒƒ์ด ํ•ต์‹ฌ์ž…๋‹ˆ๋‹ค.

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

Apache๋Š” ํด๋ผ์ด์–ธํŠธ ์š”์ฒญ์˜ Host ํ—ค๋”์™€ ์ผ์น˜ํ•˜๋Š” ServerName(๋˜๋Š” ServerAlias)์„ ์ฐพ์ง€ ๋ชปํ•  ๊ฒฝ์šฐ, ์„ค์ • ํŒŒ์ผ์—์„œ ๊ฐ€์žฅ ๋จผ์ € ์ •์˜๋œ VirtualHost๋ฅผ ๊ธฐ๋ณธ๊ฐ’(Default)์œผ๋กœ ์‚ฌ์šฉํ•˜์—ฌ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

์ด ์›๋ฆฌ๋ฅผ ์ด์šฉํ•˜์—ฌ, ์ตœ์ƒ๋‹จ์— ์•„๋ฌด๋Ÿฐ ServerName์„ ๊ฐ–์ง€ ์•Š๋Š”(ํ˜น์€ ๋”๋ฏธ ๊ฐ’์„ ๊ฐ€์ง„) VirtualHost๋ฅผ ๋ฐฐ์น˜ํ•˜๊ณ  403 Forbidden ๋“ฑ์„ ๋ฐ˜ํ™˜ํ•˜๊ฒŒ ํ•˜๋ฉด, ์ง€์ •๋œ ๋„๋ฉ”์ธ ์™ธ์˜ ๋ชจ๋“  ์ ‘๊ทผ์„ ์ฐจ๋‹จํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Test Environment

  • OS: CentOS 7.2
  • Web Server: IBM HTTPServer v8.5 (Apache 2.2 Base)

1. httpd.conf ์„ค์ • (VirtualHost ๊ตฌ์„ฑ)

ํ•ต์‹ฌ์€ ์ˆœ์„œ์ž…๋‹ˆ๋‹ค. ์ฐจ๋‹จ์šฉ(Dummy) ์„ค์ •์„ ์ •์ƒ ์„œ๋น„์Šค ์„ค์ •๋ณด๋‹ค ๋ฐ˜๋“œ์‹œ ์œ„์ชฝ์— ์ž‘์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

1) ๊ธฐ๋ณธ ์„ค์ • ๋ฐ ํฌํŠธ ๋ฆฌ์Šจ

Listen 80
Listen 4958

# Apache 2.2 / IHS 8.5 ์ดํ•˜ ํ•„์ˆ˜ (IP ๊ธฐ๋ฐ˜ ๊ฐ€์ƒํ˜ธ์ŠคํŠธ ํ™œ์„ฑํ™”)
NameVirtualHost *:80
NameVirtualHost *:4958

2) ์ฐจ๋‹จ์šฉ Dummy VirtualHost (์ตœ์ƒ๋‹จ ๋ฐฐ์น˜)

์ด ๋ธ”๋ก์—๋Š” ServerName์„ ์ง€์ •ํ•˜์ง€ ์•Š๊ฑฐ๋‚˜ ์˜๋ฏธ ์—†๋Š” ๊ฐ’์„ ๋„ฃ์Šต๋‹ˆ๋‹ค. ์ด๊ณณ์œผ๋กœ ๋“ค์–ด์˜ค๋Š” ์š”์ฒญ์€ ๋ชจ๋‘ ์—๋Ÿฌ ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

# [80 ํฌํŠธ] ๋ฏธ๋“ฑ๋ก ๋„๋ฉ”์ธ/IP ์ ‘์† ์ฐจ๋‹จ
<VirtualHost *:80>
    DocumentRoot /app/was/htdocs
    
    # ์ ‘๊ทผ ๊ฑฐ๋ถ€ ๋ฉ”์‹œ์ง€ ์„ค์ • (๋ณด์•ˆ์ƒ ์ƒ์„ธ ์ •๋ณด ์ˆจ๊น€ ๊ถŒ์žฅ)
    ErrorDocument 403 "Forbidden: Access is denied."
    ErrorDocument 404 "Not Found."
    ErrorDocument 500 "Internal Server Error."
    
    # ๋ชจ๋“  ์š”์ฒญ์— ๋Œ€ํ•ด 403 Forbidden ๊ฐ•์ œ ๋ฐ˜ํ™˜ (mod_rewrite ์‚ฌ์šฉ ์‹œ)
    # RewriteEngine On
    # RewriteRule .* - [R=403,L]
    
    # ๋˜๋Š” ๋””๋ ‰ํ† ๋ฆฌ ์ ‘๊ทผ ๊ถŒํ•œ ์ œ์–ด
    <Directory "/app/was/htdocs">
        Order allow,deny
        Deny from all
    </Directory>
</VirtualHost>

# [4958 ํฌํŠธ] ๋ฏธ๋“ฑ๋ก ๋„๋ฉ”์ธ/IP ์ ‘์† ์ฐจ๋‹จ
<VirtualHost *:4958>
    DocumentRoot /app/was/htdocs
    ErrorDocument 403 "Forbidden: Access is denied."
    # ... (์ƒ๋™)
</VirtualHost>

3) ์‹ค์ œ ์„œ๋น„์Šค VirtualHost

์ •์ƒ์ ์ธ ๋„๋ฉ”์ธ(ServerName)์„ ๊ฐ€์ง„ ์š”์ฒญ๋งŒ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ธ”๋ก์ž…๋‹ˆ๋‹ค. Proxy ์„ค์ •์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.

# Reverse Proxy ์‚ฌ์šฉ ์‹œ Open Relay ๋ฐฉ์ง€
ProxyRequests Off

# [80 ํฌํŠธ] ์ •์ƒ ์„œ๋น„์Šค
<VirtualHost *:80>
    ServerName test.apache.com
    
    # WAS ๋˜๋Š” ๋ฐฑ์—”๋“œ ์„œ๋ฒ„๋กœ ํ”„๋ก์‹œ
    ProxyPass / http://172.31.98.155/ Keepalive=on
    ProxyPassReverse / http://172.31.98.155/
    
    # Host ํ—ค๋” ์œ ์ง€ (WAS๊ฐ€ ๋„๋ฉ”์ธ์„ ์ธ์‹ํ•˜๋„๋ก ํ•จ)
    ProxyPreserveHost On
    
    ErrorLog /app/was/HTTPServer/logs/test_proxy_error.log
    CustomLog /app/was/HTTPServer/logs/test_proxy_access.log combined
</VirtualHost>

# [4958 ํฌํŠธ] ์ •์ƒ ์„œ๋น„์Šค
<VirtualHost *:4958>
    ServerName test.httpserver.com
    
    ProxyPass / http://172.31.98.209/ Keepalive=on
    ProxyPassReverse / http://172.31.98.209/
    ProxyPreserveHost On
    
    ErrorLog /app/was/HTTPServer/logs/http_proxy_error.log
    CustomLog /app/was/HTTPServer/logs/http_proxy_access.log combined
</VirtualHost>
Tip: ProxyPreserveHost On ์˜ต์…˜์€ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์š”์ฒญํ•œ ๋„๋ฉ”์ธ ์ •๋ณด(Host Header)๋ฅผ ๋ฐฑ์—”๋“œ ์„œ๋ฒ„(WAS)๊นŒ์ง€ ๊ทธ๋Œ€๋กœ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. WAS์—์„œ ๊ฐ€์ƒ ํ˜ธ์ŠคํŠธ๋ฅผ ๊ตฌ๋ถ„ํ•ด์•ผ ํ•œ๋‹ค๋ฉด ํ•„์ˆ˜ ์˜ต์…˜์ž…๋‹ˆ๋‹ค.

2. ๊ฒ€์ฆ (Verification)

์„ค์ • ์ ์šฉ ํ›„ ์›น ์„œ๋ฒ„๋ฅผ ์žฌ๊ธฐ๋™ํ•˜๊ณ  curl์„ ์ด์šฉํ•˜์—ฌ ํ…Œ์ŠคํŠธํ•ฉ๋‹ˆ๋‹ค.

1) ์ •์ƒ ๋„๋ฉ”์ธ ์ ‘์† ํ…Œ์ŠคํŠธ

# ์ •์ƒ ์‘๋‹ต(200 OK)์ด ์™€์•ผ ํ•จ
curl -v -H "Host: test.apache.com" http://localhost:80/

2) IP ์ ‘์† ๋ฐ ๋ฏธ๋“ฑ๋ก ๋„๋ฉ”์ธ ํ…Œ์ŠคํŠธ

# 1. IP๋กœ ์ง์ ‘ ์š”์ฒญ -> 403 ๋˜๋Š” ์„ค์ •ํ•œ ์—๋Ÿฌ ๋ฉ”์‹œ์ง€ ์ถœ๋ ฅ๋˜์–ด์•ผ ํ•จ
curl -v http://localhost:80/

# 2. ์—‰๋šฑํ•œ ๋„๋ฉ”์ธ ์š”์ฒญ -> 403 ์ถœ๋ ฅ๋˜์–ด์•ผ ํ•จ
curl -v -H "Host: unknown.com" http://localhost:80/

Next Step:
Apache 2.4 (IHS 9.0 ์ด์ƒ)๋ฅผ ์‚ฌ์šฉ ์ค‘์ด๋ผ๋ฉด, NameVirtualHost ์ง€์‹œ์–ด๋Š” ๋” ์ด์ƒ ํ•„์š”ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์‚ญ์ œํ•˜๊ณ , ์ ‘๊ทผ ์ œ์–ด ๊ตฌ๋ฌธ์„ Require all denied ๋“ฑ์œผ๋กœ ๋ณ€๊ฒฝํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

[OpenSSL/Apache] ์‚ฌ์„ค ์ธ์ฆ์„œ(Self-Signed Certificate) ์ƒ์„ฑ ๋ฐ ์ ์šฉ ์™„๋ฒฝ ๊ฐ€์ด๋“œ

๊ฐœ๋ฐœ ๋ฐ ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ์˜ HTTPS ๊ตฌํ˜„์„ ์œ„ํ•ด OpenSSL๋กœ ์‚ฌ์„ค ์ธ์ฆ์„œ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์‹ค๋ฌด์—์„œ ํ˜ผ๋™ํ•˜๊ธฐ ์‰ฌ์šด Key, CSR, CRT ํŒŒ์ผ์˜ ์ •ํ™•ํ•œ ์—ญํ•  ์ •์˜๋ถ€ํ„ฐ, ๊ฐœ์ธํ‚ค ํŒจ์Šค์›Œ๋“œ ์ œ๊ฑฐ ๋ฐ Apache ์ ์šฉ๊นŒ์ง€์˜ ์ „์ฒด ํ”„๋กœ์„ธ์Šค๋ฅผ ๋‹ค๋ฃน๋‹ˆ๋‹ค.

0. ๋ฐฐ๊ฒฝ ์ง€์‹: ์ธ์ฆ์„œ ํŒŒ์ผ์˜ ์ข…๋ฅ˜์™€ ์—ญํ• 

SSL ์ธ์ฆ์„œ ๋ฐœ๊ธ‰ ๊ณผ์ •์€ ๊ฐœ์ธํ‚ค ์ƒ์„ฑ → ์ธ์ฆ ์š”์ฒญ(CSR) → ์ธ์ฆ์„œ ๋ฐœ๊ธ‰(CRT)์˜ ์ˆœ์„œ๋กœ ์ง„ํ–‰๋ฉ๋‹ˆ๋‹ค. ๊ฐ ๋‹จ๊ณ„์—์„œ ์ƒ์„ฑ๋˜๋Š” ํŒŒ์ผ์˜ ์—ญํ• ์„ ๋ช…ํ™•ํžˆ ์ดํ•ดํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • 1. Private Key (.key):
    • ์„œ๋ฒ„๊ฐ€ ๊ฐ–๋Š” ๋น„๋ฐ€ ์—ด์‡ ์ž…๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ๋ฅผ ์•”ํ˜ธํ™”/๋ณตํ˜ธํ™”ํ•˜๋Š” ํ•ต์‹ฌ ํŒŒ์ผ๋กœ, ์ ˆ๋Œ€ ์™ธ๋ถ€๋กœ ์œ ์ถœ๋˜์–ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค.
    • ์ด ํ‚ค๋ฅผ ๋ถ„์‹คํ•˜๋ฉด ์ธ์ฆ์„œ๋ฅผ ์žฌ๋ฐœ๊ธ‰๋ฐ›์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • 2. CSR (.csr - Certificate Signing Request):
    • ์ธ์ฆ ๊ธฐ๊ด€(CA)์— "๋‚ด ์ธ์ฆ์„œ๋ฅผ ๋งŒ๋“ค์–ด ๋‹ฌ๋ผ"๊ณ  ๋ณด๋‚ด๋Š” ์‹ ์ฒญ์„œ์ž…๋‹ˆ๋‹ค.
    • ๊ณต๊ฐœํ‚ค(Public Key) ์ •๋ณด์™€ ๋„๋ฉ”์ธ, ํšŒ์‚ฌ ์ •๋ณด(DN)๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
  • 3. Certificate (.crt):
    • ์ตœ์ข…์ ์œผ๋กœ ๋ฐœ๊ธ‰๋œ ์ธ์ฆ์„œ(์‹ ๋ถ„์ฆ)์ž…๋‹ˆ๋‹ค.
    • CSR ๋‚ด์šฉ์„ ๋ฐ”ํƒ•์œผ๋กœ CA(ํ˜น์€ ๋ณธ์ธ)๊ฐ€ ์ „์ž ์„œ๋ช…์„ ํ•œ ํŒŒ์ผ์ด๋ฉฐ, ํด๋ผ์ด์–ธํŠธ(๋ธŒ๋ผ์šฐ์ €)์—๊ฒŒ ์ „์†ก๋ฉ๋‹ˆ๋‹ค.

Test Environment

  • OS: CentOS 7.2
  • Web Server: Apache HTTP Server
  • Tool: OpenSSL

1. ๊ฐœ์ธํ‚ค(Private Key) ์ƒ์„ฑ

๊ฐ€์žฅ ๋จผ์ € ๋ชจ๋“  ์•”ํ˜ธํ™” ํ†ต์‹ ์˜ ๊ธฐ๋ฐ˜์ด ๋˜๋Š” ๊ฐœ์ธํ‚ค๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

1) ์•”ํ˜ธํ™”๋œ ๊ฐœ์ธํ‚ค ์ƒ์„ฑ

des3 ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•˜์—ฌ 2048๋น„ํŠธ ๊ธธ์ด์˜ RSA ํ‚ค๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ด๋•Œ ์„ค์ •ํ•˜๋Š” ํŒจ์Šค์›Œ๋“œ(Pass Phrase)๋Š” ํ‚ค๋ฅผ ๋ณดํ˜ธํ•˜๊ธฐ ์œ„ํ•œ ์žฅ์น˜์ž…๋‹ˆ๋‹ค.

[root@web01 test]# openssl genrsa -des3 -out test.vn.key 2048

Generating RSA private key, 2048 bit long modulus
..........................+++
e is 65537 (0x10001)
Enter pass phrase for test.vn.key: [ํŒจ์Šค์›Œ๋“œ ์ž…๋ ฅ]
Verifying - Enter pass phrase for test.vn.key: [ํŒจ์Šค์›Œ๋“œ ํ™•์ธ]

2) ๊ฐœ์ธํ‚ค ํŒจ์Šค์›Œ๋“œ ์ œ๊ฑฐ (ํ•„์ˆ˜ ๊ถŒ์žฅ)

ํŒจ์Šค์›Œ๋“œ๊ฐ€ ๊ฑธ๋ฆฐ ํ‚ค๋ฅผ ์›น ์„œ๋ฒ„์— ๊ทธ๋Œ€๋กœ ์ ์šฉํ•˜๋ฉด, ์„œ๋ฒ„๊ฐ€ ์žฌ๊ธฐ๋™๋  ๋•Œ๋งˆ๋‹ค ๊ด€๋ฆฌ์ž๊ฐ€ ๋งค๋ฒˆ ํŒจ์Šค์›Œ๋“œ๋ฅผ ์ž…๋ ฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ž๋™ ์šด์˜์„ ์œ„ํ•ด ํŒจ์Šค์›Œ๋“œ๋ฅผ ์ œ๊ฑฐํ•œ ํ‚ค๋ฅผ ๋‹ค์‹œ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

# 1. ์›๋ณธ ํ‚ค ๋ฐฑ์—…
cp test.vn.key test.vn.key.orig

# 2. ํŒจ์Šค์›Œ๋“œ๊ฐ€ ์ œ๊ฑฐ๋œ ํ‚ค ์ƒ์„ฑ (๋ฎ์–ด์“ฐ๊ธฐ)
openssl rsa -in test.vn.key.orig -out test.vn.key

# ๊ฒฐ๊ณผ ๋ฉ”์‹œ์ง€
Enter pass phrase for test.vn.key.orig: [๊ธฐ์กด ํŒจ์Šค์›Œ๋“œ ์ž…๋ ฅ]
writing RSA key

2. ์ธ์ฆ ์š”์ฒญ์„œ(CSR) ์ƒ์„ฑ

์ƒ์„ฑ๋œ ๊ฐœ์ธํ‚ค(.key)๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ์ธ์ฆ์„œ ๋ฐœ๊ธ‰ ์‹ ์ฒญ์„œ(.csr)๋ฅผ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.

CSR ์ƒ์„ฑ ๋ช…๋ น์–ด

openssl req -new -key test.vn.key -out test.vn.csr

์ฃผ์š” ์ž…๋ ฅ ์ •๋ณด (DN: Distinguished Name)

๋ช…๋ น ์‹คํ–‰ ํ›„ ์ž…๋ ฅํ•ด์•ผ ํ•  ์ •๋ณด์ž…๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์ •๋ณด๋Š” ์ž„์˜๋กœ ์ž…๋ ฅํ•ด๋„ ๋˜์ง€๋งŒ, Common Name์€ ๋ฐ˜๋“œ์‹œ ์ •ํ™•ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • Country Name: ๊ตญ๊ฐ€ ์ฝ”๋“œ (์˜ˆ: KR, VN)
  • State / Locality: ์ง€์—ญ ์ •๋ณด (์˜ˆ: Seoul)
  • Organization: ํšŒ์‚ฌ๋ช…/๋ถ€์„œ๋ช… (์˜ˆ: IT Team)
  • Common Name (CN): ์„œ๋น„์Šค ๋„๋ฉ”์ธ ์ฃผ์†Œ (๊ฐ€์žฅ ์ค‘์š”! ์˜ˆ: *.test.vn)
Note: ์ถ”๊ฐ€ ์ •๋ณด์ธ 'Challenge password' ๋“ฑ์€ ์ž…๋ ฅํ•˜์ง€ ์•Š๊ณ  Enter๋ฅผ ๋ˆŒ๋Ÿฌ ๋„˜์–ด๊ฐ€๋„ ๋ฌด๋ฐฉํ•ฉ๋‹ˆ๋‹ค.

3. ์‚ฌ์„ค ์ธ์ฆ์„œ(CRT) ์ƒ์„ฑ (Self-Signing)

์šฐ๋ฆฌ๋Š” ๊ณต์ธ ์ธ์ฆ ๊ธฐ๊ด€(VeriSign ๋“ฑ)์ด ์—†์œผ๋ฏ€๋กœ, ์ƒ์„ฑํ•œ CSR์— ๋‚ด ๊ฐœ์ธํ‚ค๋กœ ์ง์ ‘ ์„œ๋ช…(Self-Sign)ํ•˜์—ฌ ์ธ์ฆ์„œ(CRT)๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

์ธ์ฆ์„œ ์ƒ์„ฑ

์œ ํšจ๊ธฐ๊ฐ„์„ 365์ผ๋กœ ์„ค์ •ํ•˜์—ฌ ์ตœ์ข… ์ธ์ฆ์„œ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

# -req : CSR์„ ์ž…๋ ฅ๋ฐ›์Œ
# -signkey : ์Šค์Šค๋กœ ์„œ๋ช…ํ•  ํ‚ค ์ง€์ •
openssl x509 -req -days 365 -in test.vn.csr -signkey test.vn.key -out test.vn.crt

# ์„ฑ๊ณต ์‹œ ์ถœ๋ ฅ ๋ฉ”์‹œ์ง€
Signature ok
subject=/C=VN/ST=Hanoi/L=lotte/O=admin/OU=admin/CN=*.test.vn
Getting Private key

์ตœ์ข… ํŒŒ์ผ ํ™•์ธ

์ž‘์—…์ด ์™„๋ฃŒ๋˜๋ฉด ๋‹ค์Œ 3๊ฐœ์˜ ํŒŒ์ผ์ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • test.vn.key: ๊ฐœ์ธํ‚ค (ํŒจ์Šค์›Œ๋“œ ์ œ๊ฑฐ๋จ, ์„œ๋ฒ„ ์„ค์ •์— ์‚ฌ์šฉ)
  • test.vn.crt: ์ธ์ฆ์„œ (์„œ๋ฒ„ ์„ค์ •์— ์‚ฌ์šฉ)
  • test.vn.csr: ์‹ ์ฒญ์„œ (๋ฐœ๊ธ‰ ์™„๋ฃŒ ํ›„์—๋Š” ๋ถˆํ•„์š”)

4. Apache ์„ค์ • ๋ฐ ๊ฒ€์ฆ

์ƒ์„ฑ๋œ ํ‚ค์™€ ์ธ์ฆ์„œ๋ฅผ Apache ์„ค์ • ํŒŒ์ผ(httpd.conf ๋˜๋Š” ssl.conf)์— ๋“ฑ๋กํ•˜์—ฌ HTTPS๋ฅผ ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค.

์„ค์ • ์ ์šฉ

# SSL ์—”์ง„ ํ™œ์„ฑํ™”
SSLEngine on

# 1. ์ธ์ฆ์„œ ํŒŒ์ผ ๊ฒฝ๋กœ ์ง€์ • (.crt)
SSLCertificateFile /etc/httpd/conf/ssl/test.vn.crt

# 2. ๊ฐœ์ธํ‚ค ํŒŒ์ผ ๊ฒฝ๋กœ ์ง€์ • (.key)
SSLCertificateKeyFile /etc/httpd/conf/ssl/test.vn.key

๊ฒ€์ฆ (Verification)

Apache๋ฅผ ์žฌ๊ธฐ๋™ํ•˜๊ณ  ๋ธŒ๋ผ์šฐ์ €๋กœ ์ ‘์†ํ•ด ๋ด…๋‹ˆ๋‹ค. ํŒจ์Šค์›Œ๋“œ๋ฅผ ๋ฌป์ง€ ์•Š๊ณ  ๊ธฐ๋™๋˜์–ด์•ผ ์ •์ƒ์ž…๋‹ˆ๋‹ค.

  1. ์žฌ๊ธฐ๋™: systemctl restart httpd
  2. ๋ธŒ๋ผ์šฐ์ € ์ ‘์†: https://test.vn
์ฃผ์˜ (Warning):
์‚ฌ์„ค ์ธ์ฆ์„œ๋Š” ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์‹ ๋ขฐํ•˜๋Š” ๊ธฐ๊ด€(CA) ๋ชฉ๋ก์— ์—†์œผ๋ฏ€๋กœ, ์ ‘์† ์‹œ "์ฃผ์˜ ์š”ํ•จ" ๋˜๋Š” "์•ˆ์ „ํ•˜์ง€ ์•Š์Œ" ๊ฒฝ๊ณ ๊ฐ€ ๋œจ๋Š” ๊ฒƒ์ด ์ •์ƒ์ž…๋‹ˆ๋‹ค. ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ์—์„œ๋Š” ์˜ˆ์™ธ๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ์ง„ํ–‰ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

[Apache/Tomcat] ๋‹ค์ค‘ ๋„๋ฉ”์ธ ๊ตฌ์„ฑ์„ ์œ„ํ•œ VirtualHost ๋ฐ AJP ํฌํŠธ ๋งคํ•‘ ๊ฐ€์ด๋“œ

ํ•˜๋‚˜์˜ ๋ฌผ๋ฆฌ ์„œ๋ฒ„์—์„œ ์—ฌ๋Ÿฌ ๋„๋ฉ”์ธ(์˜ˆ: aaa.com, bbb.com)์„ ์„œ๋น„์Šคํ•˜๊ธฐ ์œ„ํ•ด Apache์˜ VirtualHost์™€ Tomcat์˜ ๋ฉ€ํ‹ฐ Service ๊ตฌ์„ฑ์„ ์—ฐ๋™ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ๋„๋ฉ”์ธ๋ณ„๋กœ ๋‹ค๋ฅธ AJP ํฌํŠธ๋ฅผ ํ• ๋‹นํ•˜์—ฌ ์š”์ฒญ์„ ๋ถ„๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ํ•ต์‹ฌ์ž…๋‹ˆ๋‹ค.

1. ์•„ํ‚คํ…์ฒ˜ ๋ฐ ์›๋ฆฌ (Context)

์„ค์ •์˜ ๋ชฉํ‘œ๋Š” ์š”์ฒญ ํ๋ฆ„์„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ถ„๋ฆฌํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

  • AAA.test.com (Apache:80) → Worker(aaa) → Tomcat AJP(8009) → Service A
  • BBB.test.com (Apache:80) → Worker(bbb) → Tomcat AJP(8010) → Service B
  • CCC.test.com (Apache:80) → Worker(ccc) → Tomcat AJP(8011) → Service C

2. Apache ์„ค์ • (httpd-vhosts.conf)

๊ฐ€์žฅ ๋จผ์ € Apache๊ฐ€ ๋“ค์–ด์˜ค๋Š” ๋„๋ฉ”์ธ(ServerName)์„ ๊ตฌ๋ถ„ํ•˜์—ฌ ์ ์ ˆํ•œ mod_jk ์›Œ์ปค์—๊ฒŒ ํ† ์Šคํ•˜๋„๋ก ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

์„ค์ • ํ™œ์„ฑํ™” (httpd.conf)

# ์ฃผ์„ ํ•ด์ œํ•˜์—ฌ vhosts ์„ค์ • ํŒŒ์ผ ๋กœ๋“œ
Include conf/extra/httpd-vhosts.conf

๊ฐ€์ƒ ํ˜ธ์ŠคํŠธ ์ •์˜ (httpd-vhosts.conf)

๊ฐ ๋„๋ฉ”์ธ๋ณ„๋กœ VirtualHost ๋ธ”๋ก์„ ์ƒ์„ฑํ•˜๊ณ  JkMount๋ฅผ ํ†ตํ•ด ์„œ๋กœ ๋‹ค๋ฅธ ์›Œ์ปค ์ด๋ฆ„์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

# 1. AAA ๋„๋ฉ”์ธ ์„ค์ •
<VirtualHost *:80>
    ServerName AAA.test.com
    DocumentRoot "/WAS/apps/test1"
    
    ErrorLog "logs/aaa-error_log"
    CustomLog "logs/aaa-access_log" common
    
    # ์›Œ์ปค 'aaa'์—๊ฒŒ ๋ชจ๋“  ์š”์ฒญ ์ „๋‹ฌ
    JkMount /* aaa
</VirtualHost>

# 2. BBB ๋„๋ฉ”์ธ ์„ค์ •
<VirtualHost *:80>
    ServerName BBB.test.com
    DocumentRoot "/WAS/apps/test2"
    
    ErrorLog "logs/bbb-error_log"
    CustomLog "logs/bbb-access_log" common
    
    # ์›Œ์ปค 'bbb'์—๊ฒŒ ๋ชจ๋“  ์š”์ฒญ ์ „๋‹ฌ
    JkMount /* bbb
</VirtualHost>

# 3. CCC ๋„๋ฉ”์ธ ์„ค์ •
<VirtualHost *:80>
    ServerName CCC.test.com
    DocumentRoot "/WAS/apps/test3"
    
    ErrorLog "logs/ccc-error_log"
    CustomLog "logs/ccc-access_log" common
    
    # ์›Œ์ปค 'ccc'์—๊ฒŒ ๋ชจ๋“  ์š”์ฒญ ์ „๋‹ฌ
    JkMount /* ccc
</VirtualHost>

3. mod_jk ์›Œ์ปค ์„ค์ • (workers.properties)

Apache์—์„œ ์ง€์ •ํ•œ ์›Œ์ปค ์ด๋ฆ„(aaa, bbb, ccc)์ด ์‹ค์ œ๋กœ ํ†ต์‹ ํ•  Tomcat์˜ AJP ํฌํŠธ๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

# ์›Œ์ปค ๋ฆฌ์ŠคํŠธ ์ •์˜
worker.list=aaa,bbb,ccc

# [aaa] ์›Œ์ปค ์ •์˜ (๊ธฐ๋ณธ ํฌํŠธ 8009)
worker.aaa.port=8009
worker.aaa.host=localhost
worker.aaa.type=ajp13

# [bbb] ์›Œ์ปค ์ •์˜ (ํฌํŠธ 8010)
worker.bbb.port=8010
worker.bbb.host=localhost
worker.bbb.type=ajp13

# [ccc] ์›Œ์ปค ์ •์˜ (ํฌํŠธ 8011)
worker.ccc.port=8011
worker.ccc.host=localhost
worker.ccc.type=ajp13

4. Tomcat ์„ค์ • (server.xml)

Tomcat ํ•˜๋‚˜์—์„œ ์—ฌ๋Ÿฌ ํฌํŠธ๋ฅผ ๋ฆฌ์Šจํ•˜๊ธฐ ์œ„ํ•ด <Service> ํƒœ๊ทธ๋ฅผ ๋ณต์ œํ•˜์—ฌ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๊ฐ ์„œ๋น„์Šค๋งˆ๋‹ค ํฌํŠธ(HTTP, HTTPS, AJP)๊ฐ€ ๊ฒน์น˜์ง€ ์•Š๋„๋ก ์ฃผ์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์„œ๋น„์Šค A (AAA) ์„ค์ •

<Service name="CatalinaA">
    <!-- HTTP Port: 8080 -->
    <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
    
    <!-- AJP Port: 8009 (workers.properties์˜ aaa์™€ ๋งคํ•‘) -->
    <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />

    <Engine name="CatalinaA" defaultHost="localhost">
        <Host name="localhost" appBase="/WAS/apps/aaa" unpackWARs="true" autoDeploy="true">
            <Context path="" docBase="." reloadable="true"/>
        </Host>
    </Engine>
</Service>

์„œ๋น„์Šค B (BBB) ์„ค์ •

<Service name="CatalinaB">
    <!-- HTTP Port: 8081 (์ถฉ๋Œ ๋ฐฉ์ง€) -->
    <Connector port="8081" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8444" />
    
    <!-- AJP Port: 8010 (workers.properties์˜ bbb์™€ ๋งคํ•‘) -->
    <Connector port="8010" protocol="AJP/1.3" redirectPort="8443" />

    <Engine name="CatalinaB" defaultHost="localhost">
        <Host name="localhost" appBase="/WAS/apps/bbb" unpackWARs="true" autoDeploy="true">
            <Context path="" docBase="." reloadable="true"/>
        </Host>
    </Engine>
</Service>

์„œ๋น„์Šค C (CCC) ์„ค์ •

<Service name="CatalinaC">
    <!-- HTTP Port: 8082 (์ถฉ๋Œ ๋ฐฉ์ง€) -->
    <Connector port="8082" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8445" />
    
    <!-- AJP Port: 8011 (workers.properties์˜ ccc์™€ ๋งคํ•‘) -->
    <Connector port="8011" protocol="AJP/1.3" redirectPort="8443" />

    <Engine name="CatalinaC" defaultHost="localhost">
        <Host name="localhost" appBase="/WAS/apps/ccc" unpackWARs="true" autoDeploy="true">
            <Context path="" docBase="." reloadable="true"/>
        </Host>
    </Engine>
</Service>
Tip (docBase ์„ค์ •):
appBase์™€ Context docBase ์„ค์ •์ด ๊ผฌ์ผ ๊ฒฝ์šฐ 404 ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ€์žฅ ํ™•์‹คํ•œ ๋ฐฉ๋ฒ•์€ docBase์— ์ ˆ๋Œ€ ๊ฒฝ๋กœ๋ฅผ ๋ช…์‹œํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์˜ˆ: docBase="/WAS/apps/ccc"

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

  1. Tomcat ์žฌ๊ธฐ๋™: server.xml ์ˆ˜์ • ํ›„ ์žฌ๊ธฐ๋™.
    netstat -anotp | grep java 
    # 8009, 8010, 8011 ํฌํŠธ๊ฐ€ ๋ชจ๋‘ LISTEN ์ƒํƒœ์ธ์ง€ ํ™•์ธ
  2. Apache ์žฌ๊ธฐ๋™: ์„ค์ • ์ ์šฉ.
    ./apachectl restart
  3. ๋ธŒ๋ผ์šฐ์ € ์ ‘์†: ๊ฐ ๋„๋ฉ”์ธ์œผ๋กœ ์ ‘์†ํ•˜์—ฌ ์„œ๋กœ ๋‹ค๋ฅธ ํŽ˜์ด์ง€๊ฐ€ ๋œจ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
Apache Tomcat VirtualHost mapping test result

[๊ทธ๋ฆผ] ๋„๋ฉ”์ธ๋ณ„ ์—ฐ๋™ ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ ํ™”๋ฉด

[Apache/Tomcat] ์›น ์„œ๋ฒ„ ์—ฐ๋™ ๊ฐ€์ด๋“œ: mod_jk (AJP) ์„ค์ • ์™„๋ฒฝ ์ •๋ฆฌ

Apache HTTP Server์™€ Tomcat์„ ์—ฐ๋™(Interlink)ํ•˜์—ฌ ์ •์  ์ปจํ…์ธ  ์ฒ˜๋ฆฌ ์„ฑ๋Šฅ์„ ๋†’์ด๊ณ  ๋ถ€ํ•˜ ๋ถ„์‚ฐ(Load Balancing) ํ™˜๊ฒฝ์„ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๊ฐ€์žฅ ๋„๋ฆฌ ์‚ฌ์šฉ๋˜๋Š” mod_jk ๋ชจ๋“ˆ์˜ ์„ค์น˜(์ปดํŒŒ์ผ)๋ถ€ํ„ฐ workers.properties ์„ค์ •๊นŒ์ง€์˜ ์ „์ฒด ๊ณผ์ •์„ ๋‹ค๋ฃน๋‹ˆ๋‹ค.

0. ๊ธฐ๋ณธ ๊ฐœ๋… (Concepts)

  • mod_jk: Apache๊ฐ€ Tomcat๊ณผ ํ†ต์‹ ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ํ”Œ๋Ÿฌ๊ทธ์ธ ๋ชจ๋“ˆ์ž…๋‹ˆ๋‹ค.
  • AJP (Apache JServ Protocol): ์›น ์„œ๋ฒ„์™€ WAS ๊ฐ„์˜ ํšจ์œจ์ ์ธ ํ†ต์‹ ์„ ์œ„ํ•ด ์ตœ์ ํ™”๋œ ๋ฐ”์ด๋„ˆ๋ฆฌ ํ”„๋กœํ† ์ฝœ์ž…๋‹ˆ๋‹ค. (Tomcat ๊ธฐ๋ณธ AJP ํฌํŠธ: 8009)

1. mod_jk ์„ค์น˜ (Compile)

mod_jk๋Š” Apache ๋ฐฐํฌํŒ์— ๊ธฐ๋ณธ ํฌํ•จ๋˜์–ด ์žˆ์ง€ ์•Š์œผ๋ฏ€๋กœ, ์†Œ์Šค๋ฅผ ๋‹ค์šด๋กœ๋“œํ•˜์—ฌ ์ปดํŒŒ์ผํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ณผ์ •์—์„œ Apache์˜ ํ™•์žฅ ๋„๊ตฌ์ธ apxs๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์šด๋กœ๋“œ ๋ฐ ์••์ถ• ํ•ด์ œ

์ตœ์‹  ๋ฒ„์ „์€ Tomcat Connectors ๋‹ค์šด๋กœ๋“œ ํŽ˜์ด์ง€์—์„œ ํ™•์ธ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

# 1. ์†Œ์Šค ๋‹ค์šด๋กœ๋“œ (๋ฒ„์ „์€ ์‹œ์ ์— ๋”ฐ๋ผ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์Œ)
wget http://apache.mirror.cdnetworks.com/tomcat/tomcat-connectors/jk/tomcat-connectors-1.2.41-src.tar.gz

# 2. ์••์ถ• ํ•ด์ œ
tar -zxvf tomcat-connectors-1.2.41-src.tar.gz

Configure ๋ฐ ์ปดํŒŒ์ผ

native ๋””๋ ‰ํ† ๋ฆฌ๋กœ ์ด๋™ํ•˜์—ฌ ์ปดํŒŒ์ผ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ฃผ์˜: --with-apxs ์˜ต์…˜์—๋Š” ํ˜„์žฌ ์„ค์น˜๋œ Apache์˜ apxs ๋ฐ”์ด๋„ˆ๋ฆฌ ์ ˆ๋Œ€ ๊ฒฝ๋กœ๋ฅผ ์ •ํ™•ํžˆ ์ž…๋ ฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

cd tomcat-connectors-1.2.41-src/native

# Apache ์„ค์น˜ ๊ฒฝ๋กœ์— ๋งž์ถฐ apxs ๊ฒฝ๋กœ ์ง€์ • (/WAS/apache/bin/apxs)
./configure --with-apxs=/WAS/apache/bin/apxs

# ์ปดํŒŒ์ผ ๋ฐ ์„ค์น˜
make && make install

์„ค์น˜ ํ™•์ธ (Verification)

์„ค์น˜๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด Apache์˜ modules ๋””๋ ‰ํ† ๋ฆฌ์— mod_jk.so ํŒŒ์ผ์ด ์ƒ์„ฑ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

ls -l /WAS/apache/modules/mod_jk.so

2. ์›Œ์ปค ์„ค์ • (workers.properties)

Apache์—๊ฒŒ "์–ด๋–ค Tomcat ์ธ์Šคํ„ด์Šค์™€ ํ†ต์‹ ํ• ์ง€" ์•Œ๋ ค์ฃผ๋Š” ์„ค์ • ํŒŒ์ผ์ž…๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ conf ๋””๋ ‰ํ† ๋ฆฌ์— ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

ํŒŒ์ผ ์ƒ์„ฑ

vi /WAS/apache/conf/workers.properties

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

# Tomcat ๋ฐ Java ๊ฒฝ๋กœ (ํ™˜๊ฒฝ์— ๋งž๊ฒŒ ์ˆ˜์ •)
workers.tomcat_home="/WAS/tomcat8"
workers.java_home="/usr/bin/java"
ps=/

# ์›Œ์ปค ๋ชฉ๋ก ์ •์˜ (์ฝค๋งˆ๋กœ ๊ตฌ๋ถ„ํ•˜์—ฌ ๋‹ค์ˆ˜ ์ •์˜ ๊ฐ€๋Šฅ)
worker.list=test1

# [test1] ์›Œ์ปค ์ƒ์„ธ ์„ค์ •
worker.test1.port=8009
worker.test1.host=localhost
worker.test1.type=ajp13
# worker.test1.lbfactor=1 (๋กœ๋“œ๋ฐธ๋Ÿฐ์‹ฑ ์‹œ ์‚ฌ์šฉ)
Note: worker.test1.port๋Š” Tomcat์˜ server.xml ๋‚ด <Connector protocol="AJP/1.3" ... /> ์— ์„ค์ •๋œ ํฌํŠธ์™€ ์ผ์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. (๊ธฐ๋ณธ๊ฐ’: 8009)

3. Apache ์„ค์ • (httpd.conf)

๋งˆ์ง€๋ง‰์œผ๋กœ Apache๊ฐ€ mod_jk ๋ชจ๋“ˆ์„ ๋กœ๋“œํ•˜๊ณ , ํŠน์ • ์š”์ฒญ์„ Tomcat(์›Œ์ปค)์œผ๋กœ ๋ณด๋‚ด๋„๋ก ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

ํŒŒ์ผ ์ˆ˜์ •

vi /WAS/apache/conf/httpd.conf

์ถ”๊ฐ€ ๋‚ด์šฉ

# 1. mod_jk ๋ชจ๋“ˆ ๋กœ๋“œ
LoadModule jk_module modules/mod_jk.so

<IfModule jk_module>
    # 2. ์›Œ์ปค ์„ค์ • ํŒŒ์ผ ์œ„์น˜ ์ง€์ •
    JkWorkersFile "conf/workers.properties"

    # 3. ๋กœ๊ทธ ์„ค์ • (ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ…์„ ์œ„ํ•ด ํ•„์ˆ˜)
    JkLogFile "logs/mod_jk.log"
    JkLogLevel info
    JkLogStampFormat "[%a %b %d %H:%M:%S %Y] "
    JkRequestLogFormat "%w %V %T"
    
    # 4. URL ๋งคํ•‘ (JkMount)
    # /* : ๋ชจ๋“  ์š”์ฒญ์„ test1 ์›Œ์ปค(Tomcat)๋กœ ์ „๋‹ฌ
    # ํŠน์ • ํ™•์žฅ์ž๋งŒ ๋ณด๋‚ด๋ ค๋ฉด: JkMount *.jsp test1
    JkMount /* test1
</IfModule>

4. ๊ธฐ๋™ ๋ฐ ์—ฐ๋™ ํ…Œ์ŠคํŠธ

์„ค์ •์ด ์™„๋ฃŒ๋˜๋ฉด Apache์™€ Tomcat์„ ์žฌ๊ธฐ๋™ํ•ฉ๋‹ˆ๋‹ค. ์ˆœ์„œ๋Š” Tomcat ๊ตฌ๋™ -> Apache ๊ตฌ๋™ ์ˆœ์„œ๋ฅผ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.

์„ค์ • ๊ฒ€์ฆ (Syntax Check)

# Apache ์„ค์ • ๋ฌธ๋ฒ• ๊ฒ€์‚ฌ
/WAS/apache/bin/apachectl -t
# "Syntax OK" ์ถœ๋ ฅ ํ™•์ธ

์„œ๋น„์Šค ์žฌ๊ธฐ๋™

# Tomcat ์žฌ๊ธฐ๋™
/WAS/tomcat8/bin/shutdown.sh
/WAS/tomcat8/bin/startup.sh

# Apache ์žฌ๊ธฐ๋™
/WAS/apache/bin/apachectl restart

์ตœ์ข… ํ™•์ธ

๋ธŒ๋ผ์šฐ์ €์—์„œ Apache ํฌํŠธ(๋ณดํ†ต 80)๋กœ ์ ‘์†ํ–ˆ์„ ๋•Œ, Tomcat์˜ ํŽ˜์ด์ง€๊ฐ€ ๋ณด์ธ๋‹ค๋ฉด ์—ฐ๋™์— ์„ฑ๊ณตํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

Apache Tomcat ์—ฐ๋™ ์„ฑ๊ณต ํ™”๋ฉด


Next Step:
์—ฐ๋™์— ์„ฑ๊ณตํ–ˆ๋‹ค๋ฉด ์ •์  ํŒŒ์ผ(์ด๋ฏธ์ง€, CSS, JS)์€ Apache๊ฐ€ ์ฒ˜๋ฆฌํ•˜๊ณ , ๋™์  ํŒŒ์ผ(JSP)๋งŒ Tomcat์ด ์ฒ˜๋ฆฌํ•˜๋„๋ก JkMount์™€ JkUnMount ์„ค์ •์„ ํŠœ๋‹ํ•˜์—ฌ ์„ฑ๋Šฅ์„ ์ตœ์ ํ™”ํ•ด ๋ณด์„ธ์š”.

[Apache] Linux ์†Œ์Šค ์ปดํŒŒ์ผ ์„ค์น˜ ๊ฐ€์ด๋“œ (httpd, apr, pcre)

Linux ํ™˜๊ฒฝ์—์„œ yum์ด๋‚˜ apt ๊ฐ™์€ ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ € ๋Œ€์‹ , Apache HTTP Server(httpd)๋ฅผ ์†Œ์Šค ์ฝ”๋“œ๋กœ ์ง์ ‘ ์ปดํŒŒ์ผํ•˜์—ฌ ์„ค์น˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ํŠน์ • ๋ฒ„์ „์ด ํ•„์š”ํ•˜๊ฑฐ๋‚˜, ๋ชจ๋“ˆ์„ ์ปค์Šคํ„ฐ๋งˆ์ด์ง•ํ•ด์•ผ ํ•  ๋•Œ ํ•„์ˆ˜์ ์ธ ๊ธฐ์ˆ ์ž…๋‹ˆ๋‹ค.

0. ์‹œ์ž‘ํ•˜๊ธฐ ์ „์— (Why & Prerequsite)

์™œ ์†Œ์Šค ์ปดํŒŒ์ผ์„ ํ•˜๋‚˜์š”?

  • ๋ฒ„์ „ ๊ด€๋ฆฌ: OS ์ €์žฅ์†Œ(Repository)์—์„œ ์ œ๊ณตํ•˜๋Š” ๊ตฌ๋ฒ„์ „์ด ์•„๋‹Œ, ์ตœ์‹  ๋ณด์•ˆ ํŒจ์น˜๊ฐ€ ์ ์šฉ๋œ ๋ฒ„์ „์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ตœ์ ํ™”: ๋ถˆํ•„์š”ํ•œ ๋ชจ๋“ˆ์„ ๋นผ๊ฑฐ๋‚˜, ๊ฒฝ๋กœ๋ฅผ /usr/local์ด ์•„๋‹Œ /WAS ๋“ฑ ์›ํ•˜๋Š” ๊ณณ์œผ๋กœ ์ง€์ •ํ•˜์—ฌ ๊ด€๋ฆฌ ํšจ์œจ์„ฑ์„ ๋†’์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•„์ˆ˜ ์ปดํŒŒ์ผ ๋„๊ตฌ ์„ค์น˜

์†Œ์Šค ์ฝ”๋“œ๋ฅผ ๊ธฐ๊ณ„์–ด๋กœ ๋ฒˆ์—ญํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ปดํŒŒ์ผ๋Ÿฌ(gcc)์™€ ๋นŒ๋“œ ๋„๊ตฌ(make)๊ฐ€ ๋ฐ˜๋“œ์‹œ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์„ค์น˜ ์ „ ์•„๋ž˜ ๋ช…๋ น์–ด๋กœ ํ™˜๊ฒฝ์„ ์ค€๋น„ํ•ด์ฃผ์„ธ์š”.

# CentOS/RHEL ๊ธฐ์ค€
yum install -y gcc gcc-c++ make expat-devel

1. ์†Œ์Šค ํŒŒ์ผ ๋‹ค์šด๋กœ๋“œ

๊ฐ ํ”„๋กœ์ ํŠธ์˜ ๊ณต์‹ ํ™ˆํŽ˜์ด์ง€์—์„œ Stable(์•ˆ์ •) ๋ฒ„์ „์„ ๋‹ค์šด๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค. ๋ณดํ†ต /usr/local/src ๋‚˜ ์ž„์‹œ ๋””๋ ‰ํ† ๋ฆฌ์—์„œ ์ž‘์—…ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์šด๋กœ๋“œ ๋งํฌ

※ Apache 2.4 ๋ฒ„์ „๋ถ€ํ„ฐ๋Š” APR(Apache Portable Runtime)๊ณผ PCRE(์ •๊ทœํ‘œํ˜„์‹ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ)๊ฐ€ ๋‚ด์žฅ๋˜์–ด ์žˆ์ง€ ์•Š์•„ ๋ณ„๋„ ์„ค์น˜๊ฐ€ ํ•„์ˆ˜์ž…๋‹ˆ๋‹ค.


2. ์˜์กด์„ฑ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์„ค์น˜

Apache ๋ณธ์ฒด๋ฅผ ์„ค์น˜ํ•˜๊ธฐ ์ „์— ๊ธฐ์ดˆ๊ฐ€ ๋˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋จผ์ € ๊น”์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ด€๋ฆฌ ํŽธ์˜๋ฅผ ์œ„ํ•ด ๋ชจ๋“  ๊ฒฝ๋กœ๋Š” /WAS ํ•˜์œ„๋กœ ํ†ต์ผํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

1) APR (Apache Portable Runtime) ์„ค์น˜

OS(Linux, Windows ๋“ฑ)์— ์ƒ๊ด€์—†์ด Apache๊ฐ€ ์‹คํ–‰๋  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” ํ”Œ๋žซํผ ์ถ”์ƒํ™” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ž…๋‹ˆ๋‹ค.

tar -zxvf apr-1.5.2.tar.gz
cd apr-1.5.2

# --prefix ์˜ต์…˜์œผ๋กœ ์„ค์น˜ ๊ฒฝ๋กœ ์ง€์ •
./configure --prefix=/WAS/apr
make && make install

2) APR-Util ์„ค์น˜

APR์˜ ์œ ํ‹ธ๋ฆฌํ‹ฐ ํ™•์žฅํŒ์ž…๋‹ˆ๋‹ค. ๋ฐ˜๋“œ์‹œ ์œ„์—์„œ ์„ค์น˜ํ•œ APR์˜ ๊ฒฝ๋กœ๋ฅผ ์ง€์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

tar -zxvf apr-util-1.5.4.tar.gz
cd apr-util-1.5.4

# --with-apr ์˜ต์…˜ ์ค‘์š”!
./configure --prefix=/WAS/aprutil --with-apr=/WAS/apr
make && make install

3) PCRE (Perl Compatible Regular Expressions) ์„ค์น˜

Apache์˜ URL ์žฌ์ž‘์„ฑ(Rewrite) ๋ชจ๋“ˆ ๋“ฑ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์ •๊ทœํ‘œํ˜„์‹ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ž…๋‹ˆ๋‹ค.

tar -zxvf pcre-8.37.tar.gz
cd pcre-8.37

./configure --prefix=/WAS/pcre
make && make install

3. Apache HTTP Server ์„ค์น˜

์ด์ œ ์ฃผ์ธ๊ณต์ธ Apache๋ฅผ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค. configure ๋‹จ๊ณ„์—์„œ ์•ž์„œ ์„ค์น˜ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค์˜ ๊ฒฝ๋กœ๋ฅผ ์—ฐ๊ฒฐํ•ด์ฃผ๋Š” ๊ฒƒ์ด ํ•ต์‹ฌ์ž…๋‹ˆ๋‹ค.

Configuration ์‹คํ–‰

tar -zxvf httpd-2.4.16.tar.gz
cd httpd-2.4.16

# ํ•œ ์ค„์”ฉ ์˜ต์…˜์„ ํ™•์ธํ•˜๋ฉฐ ์ž…๋ ฅํ•˜์„ธ์š”.
./configure \
--prefix=/WAS/apache \
--enable-mods-shared=all \
--enable-so \
--enable-rewrite \
--enable-auth-digest \
--with-apr=/WAS/apr \
--with-apr-util=/WAS/aprutil \
--with-pcre=/WAS/pcre

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

  • --enable-mods-shared=all: ๋ชจ๋“ˆ์„ ๋™์ (Dynamic)์œผ๋กœ ์ปดํŒŒ์ผํ•˜์—ฌ, ์ถ”ํ›„ httpd.conf์—์„œ Load/Unload๊ฐ€ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.
  • --enable-rewrite: URL ์ฃผ์†Œ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” Rewrite ๊ธฐ๋Šฅ์„ ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค. (์‹ค๋ฌด ํ•„์ˆ˜)

์ปดํŒŒ์ผ ๋ฐ ์„ค์น˜

# ์—๋Ÿฌ ์—†์ด ์™„๋ฃŒ๋˜๋ฉด ์‹คํ–‰
make && make install

4. ๊ธฐ๋™ ๋ฐ ๊ฒ€์ฆ (Verification)

์„ค์น˜๊ฐ€ ๋๋‚ฌ๋‹ค๊ณ  ๋ฐ”๋กœ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์—ด๋ฆฌ๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ํ”„๋กœ์„ธ์Šค๋ฅผ ๋„์šฐ๊ณ  ํฌํŠธ๋ฅผ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

1) ์„œ๋น„์Šค ๊ธฐ๋™

# Apache ๊ธฐ๋™ ์Šคํฌ๋ฆฝํŠธ ์‹คํ–‰
/WAS/apache/bin/apachectl start

# ํ”„๋กœ์„ธ์Šค ํ™•์ธ (httpd ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋ณด์—ฌ์•ผ ํ•จ)
ps -ef | grep httpd

2) ํฌํŠธ ๋ฆฌ์Šจ ํ™•์ธ

์›น ์„œ๋ฒ„์˜ ๊ธฐ๋ณธ ํฌํŠธ์ธ 80๋ฒˆ์ด ์—ด๋ ค์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

netstat -anotp | grep :80

3) ๋ฐฉํ™”๋ฒฝ ์„ค์ • (์ค‘์š”!)

ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋–ด๋Š”๋ฐ ๋ธŒ๋ผ์šฐ์ € ์ ‘์†์ด ์•ˆ ๋œ๋‹ค๋ฉด 99%๋Š” ๋ฐฉํ™”๋ฒฝ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•ด ๋ฐฉํ™”๋ฒฝ์„ ์ž ์‹œ ๋„๊ฑฐ๋‚˜ 80ํฌํŠธ๋ฅผ ์—ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

# CentOS 7 (firewalld) ํฌํŠธ ์˜คํ”ˆ ์˜ˆ์‹œ
firewall-cmd --permanent --zone=public --add-port=80/tcp
firewall-cmd --reload

4) ์ตœ์ข… ์ ‘์† ํ…Œ์ŠคํŠธ

PC ๋ธŒ๋ผ์šฐ์ € ์ฃผ์†Œ์ฐฝ์— http://[์„œ๋ฒ„IP]๋ฅผ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค. ํ™”๋ฉด์— "It works!"๊ฐ€ ๋ณด์ธ๋‹ค๋ฉด ์„ฑ๊ณต์ž…๋‹ˆ๋‹ค.


Next Step:
์ด์ œ /WAS/apache/conf/httpd.conf ํŒŒ์ผ์„ ์—ด์–ด ServerName ๊ฒฝ๊ณ  ๋ฉ”์‹œ์ง€๋ฅผ ํ•ด๊ฒฐํ•˜๊ณ , DocumentRoot(์›น ๋ฌธ์„œ ์œ„์น˜)๋ฅผ ์‹ค์ œ ์šด์˜ ๊ฒฝ๋กœ๋กœ ๋ณ€๊ฒฝํ•ด ๋ณด์„ธ์š”.