Tomcat / NginX

niireymikΒ·2024λ…„ 1μ›” 28일

πŸ’‘
'ν†°μΊ£', WAS 등은 μ•žμ„œ λ‹€λ₯Έ 곡뢀λ₯Ό ν•˜λ©° μ’…μ’… λ“€μ–΄μ™”λ˜ 것인데, μ •μž‘ λ¬΄μ—‡μΈμ§€λŠ” μ •ν™•νžˆ λͺ¨λ₯΄κ³  λŒ€κ°• λ„˜κ²¨μ™”λ‹€. μš°μ„  μ›Ή μ„œλ²„μ™€ WASκ°€ 무엇인지뢀터 μ œλŒ€λ‘œ μ•Œμ•„λ³΄κ³ , 또 Tomcatκ³Ό NginXλŠ” 각각 무엇에 ν•΄λ‹Ήν•˜λŠ”μ§€, μ–΄λ–€ νŠΉμ§•μ„ κ°€μ§€λŠ”μ§€ 꼼꼼히 μ•Œμ•„λ³΄μž! :>



πŸ“Œ WEB / WAS

WEB : μ›Ή μ„œλ²„(Web Server)

  • μ›Ή μ„œλ²„(μ†Œν”„νŠΈμ›¨μ–΄) : μ›Ή λΈŒλΌμš°μ €μ™€ 같은 ν΄λΌμ΄μ–ΈνŠΈλ‘œλΆ€ν„° HTTP μš”μ²­μ„ 받아듀이고, HTML λ¬Έμ„œμ™€ 같은 μ›Ή νŽ˜μ΄μ§€λ₯Ό λ°˜ν™˜ν•˜λŠ” 컴퓨터 ν”„λ‘œκ·Έλž¨
  • μ›Ή μ„œλ²„(ν•˜λ“œμ›¨μ–΄) : μœ„μ˜ κΈ°λŠ₯을 μ œκ³΅ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μ‹€ν–‰ν•˜λŠ” 컴퓨터

: μš°λ¦¬κ°€ μ–ΈκΈ‰ν•˜κ³  λ‹€λ£° μ›Ή μ„œλ²„λŠ” μ†Œν”„νŠΈμ›¨μ–΄ μ›Ή μ„œλ²„μ΄λ‹€. μ΄λ•Œ μ›Ή μ„œλ²„κ°€ μ œκ³΅ν•˜λŠ” 것은 λ‹¨μˆœ HTML λ¬Έμ„œ, CSS, 이미지, 파일 λ“± μ¦‰μ‹œ 응닡 κ°€λŠ₯ν•œ 정적 컨텐츠이닀. μ›Ή μ„œλ²„κ°€ 정적 컨텐츠가 μ•„λ‹Œ 동적 컨텐츠에 λŒ€ν•œ μš”μ²­μ„ λ°›μœΌλ©΄, WASμ—κ²Œ ν•΄λ‹Ή μš”μ²­μ„ λ„˜κ²¨μ£Όκ³  WASμ—μ„œ μ²˜λ¦¬ν•œ κ²°κ³Όλ₯Ό ν΄λΌμ΄μ–ΈνŠΈμ—κ²Œ μ „λ‹¬ν•˜λŠ” 역할도 ν•΄ μ€€λ‹€. μ΄λŸ¬ν•œ μ›Ή μ„œλ²„μ—λŠ” Apache, NginX 등이 μžˆλ‹€.

WAS : μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ„œλ²„(Web Application Server)

WAS = μ›Ή μ„œλ²„ + μ›Ή μ»¨ν…Œμ΄λ„ˆ

: WASλŠ” DB 쑰회 ν˜Ήμ€ λ‹€μ–‘ν•œ 둜직 처리λ₯Ό μš”κ΅¬ν•˜λŠ” 동적 컨텐츠λ₯Ό μ œκ³΅ν•˜κΈ° μœ„ν•΄ λ§Œλ“€μ–΄μ§„ μ„œλ²„μ΄λ‹€. μ΄λŠ” HTTP ν”„λ‘œν† μ½œμ„ 기반으둜 μ‚¬μš©μž μ»΄ν“¨ν„°λ‚˜ μž₯μΉ˜μ— μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ μˆ˜ν–‰ν•΄ μ£ΌλŠ” λ―Έλ“€μ›¨μ–΄λ‘œμ„œ, 주둜 λ°μ΄ν„°λ² μ΄μŠ€ μ„œλ²„μ™€ 같이 μˆ˜ν–‰λœλ‹€.

WASλŠ” Web Server와 Web Container의 역할을 λͺ¨λ‘ ν•  수 μžˆλ‹€. μ—¬κΈ°μ„œ μ»¨ν…Œμ΄λ„ˆλŠ” JSP, Servlet의 ꡬ동 ν™˜κ²½μ„ μ œκ³΅ν•΄ μ£ΌλŠ” μ†Œν”„νŠΈμ›¨μ–΄λ₯Ό λ§ν•œλ‹€. μ΄λŸ¬ν•œ WASμ—λŠ” Tomcat, JBoss, WebSphere 등이 있으며, κ·Έ νŠΉμ§•μ€ λ‹€μŒκ³Ό κ°™λ‹€.

WAS의 νŠΉμ§•

  • 동적 컨텐츠λ₯Ό μ œκ³΅ν•˜κΈ° μœ„ν•΄ λ§Œλ“€μ–΄μ‘Œλ‹€.
  • μ›Ή μ„œλ²„μ™€ μ›Ή μ»¨ν…Œμ΄λ„ˆμ˜ κ²°ν•©μœΌλ‘œ 이루어진 μ†Œν”„νŠΈμ›¨μ–΄μ΄κΈ° λ•Œλ¬Έμ— μ›Ή μ„œλ²„μ²˜λŸΌ μ‚¬μš©ν•  μˆ˜λ„ μžˆλ‹€.
  • μžλ°”, JSP λ“±μœΌλ‘œ λ§Œλ“  μ›Ή λ˜λŠ” API μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ μ‹€ν–‰ν•  λ•Œ μ‚¬μš©ν•œλ‹€.
  • μΈν„°λ„·μƒμ—μ„œ HTTPλ₯Ό 톡해 μ‚¬μš©μž μ»΄ν“¨ν„°λ‚˜ μž₯μΉ˜μ— μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ μˆ˜ν–‰ν•΄ μ£ΌλŠ” 미듀웨어 (μ†Œν”„νŠΈμ›¨μ–΄ μ—”μ§„)둜 λ³Ό 수 μžˆλ‹€.
  • ν”„λ‘œκ·Έλž¨ μ‹€ν–‰ ν™˜κ²½κ³Ό DB 접속 κΈ°λŠ₯을 μ œκ³΅ν•œλ‹€.
  • μ—¬λŸ¬ 개의 νŠΈλžœμž­μ…˜μ„ 관리할 수 μžˆλ‹€.
    (νŠΈλžœμž­μ…˜ : μͺΌκ°€ 수 μ—†λŠ” 업무 처리의 μ΅œμ†Œ λ‹¨μœ„)
  • 업무λ₯Ό μ²˜λ¦¬ν•˜λŠ” λΉ„μ¦ˆλ‹ˆμŠ€ λ‘œμ§μ„ μˆ˜ν–‰ν•œλ‹€.

πŸ’‘
그런데 WASκ°€ μ›Ή μ„œλ²„(정적 컨텐츠 제곡)와 μ›Ή μ»¨ν…Œμ΄λ„ˆ(동적 컨텐츠 제곡)의 κΈ°λŠ₯을 λͺ¨λ‘ μˆ˜ν–‰ν•  수 μžˆλ‹€λ©΄, Apacheλ‚˜ NginX와 같은 μ›Ή μ„œλ²„λŠ” ν•„μš”κ°€ μ—†λŠ” κ²ƒμΌκΉŒ? 닡은 "No"이닀. 즉, μ›Ή μ„œλ²„μ™€ WASλ₯Ό 뢄리해야 ν•œλ‹€. μ•„λž˜μ— κ·Έ 이유λ₯Ό 정리해 λ³΄μ•˜λ‹€.



πŸ”Ž μ›Ή μ„œλ²„μ™€ WASλ₯Ό 뢄리해야 ν•˜λŠ” 이유

: 기본적으둜 생각할 수 μžˆλŠ” μ΄μœ λŠ” 'μ„œλ²„ λΆ€ν•˜ λ°©μ§€λ₯Ό μœ„ν•΄μ„œ'이닀. λ§Œμ•½ WASκ°€ 정적 μ½˜ν…μΈ  μš”μ²­κΉŒμ§€ μ²˜λ¦¬ν•˜κ²Œ λœλ‹€λ©΄, λΆ€ν•˜κ°€ 컀지고 동적 컨텐츠 μ²˜λ¦¬κ°€ μ§€μ—°λ˜μ–΄ νš¨μœ¨μ„±μ΄ λ–¨μ–΄μ§„λ‹€λŠ” 것이닀. κ·ΈλŸ¬λ‚˜, μ›Ή μ„œλ²„μ™€ WASλ₯Ό λΆ„λ¦¬ν•˜λŠ” 더 μžμ„Έν•œ μ΄μœ λŠ” 'μ›Ή μ„œλ²„μ˜ μ—­ν• '에 μžˆλ‹€. 이λ₯Ό μˆ˜μ›”νžˆ μ΄ν•΄ν•˜κΈ° μœ„ν•΄μ„œλŠ” λ¦¬λ²„μŠ€ ν”„λ‘μ‹œ(reverse proxy) μ„œλ²„μ— λŒ€ν•œ 이해가 μš°μ„ λ˜λ‹ˆ, ν•„μš”ν•˜λ‹€λ©΄ μ•„λž˜μ˜ μΈμš©λ¬Έμ„ μ°Έκ³ ν•˜μž.

βœ… λ¦¬λ²„μŠ€ ν”„λ‘μ‹œ μ„œλ²„?


ν”„λ‘μ‹œ μ„œλ²„(proxy server)
: ν΄λΌμ΄μ–ΈνŠΈκ°€ μžμ‹ μ„ ν†΅ν•΄μ„œ λ‹€λ₯Έ λ„€νŠΈμ›Œν¬ μ„œλΉ„μŠ€μ— κ°„μ ‘μ μœΌλ‘œ 접속할 수 있게 ν•΄ μ£ΌλŠ” 컴퓨터 μ‹œμŠ€ν…œμ΄λ‚˜ μ‘μš© ν”„λ‘œκ·Έλž¨μ„ 가리킨닀. μ„œλ²„μ™€ ν΄λΌμ΄μ–ΈνŠΈ 사이에 μ€‘κ³„κΈ°λ‘œμ„œ λŒ€λ¦¬λ‘œ 톡신을 μˆ˜ν–‰ν•˜λŠ” 것을 'ν”„λ‘μ‹œ', κ·Έ 쀑계 κΈ°λŠ₯을 ν•˜λŠ” 것을 ν”„λ‘μ‹œ μ„œλ²„λΌκ³  λΆ€λ₯Έλ‹€.


ν¬μ›Œλ“œ ν”„λ‘μ‹œ μ„œλ²„(forward proxy server)
: μš°λ¦¬κ°€ ν”νžˆ λ§ν•˜λŠ” 'ν”„λ‘μ‹œ μ„œλ²„'λŠ” ν¬μ›Œλ“œ ν”„λ‘μ‹œ μ„œλ²„λ₯Ό μ˜λ―Έν•œλ‹€. ν”„λ‘μ‹œ μ„œλ²„λŠ” μ•„λž˜ 그림처럼 ν΄λΌμ΄μ–ΈνŠΈ μ•žμ— 놓여 μžˆλ‹€. 그림을 보면, ν΄λΌμ΄μ–ΈνŠΈκ°€ 인터넷 μ›Ή μ„œλ²„μ— μš”μ²­μ„ 보내면 μ€‘κ°„μ—μ„œ κ·Έ μš”μ²­μ„ ν”„λ‘μ‹œκ°€ κ°€λ‘œμ±ˆλ‹€. 이후 ν”„λ‘μ‹œ μ„œλ²„λŠ” ν•΄λ‹Ή μš”μ²­μ„ μ›Ή μ„œλ²„μ—κ²Œ λ‹€μ‹œ 보내고 μ›Ή μ„œλ²„μ— 받은 응닡을 λ‹€μ‹œ ν΄λΌμ΄μ–ΈνŠΈμ—κ²Œ μ „λ‹¬ν•œλ‹€. μ΄λŠ” ν•΄λ‹Ή 기관에 μ†ν•œ μ‚¬λžŒλ“€μ΄ μ›Ήμ‚¬μ΄νŠΈμ— μ§μ ‘μ μœΌλ‘œ λ°©λ¬Έν•˜λŠ” 것을 λ°©μ§€ν•˜κ³ , νŠΉμ • μ‚¬μ΄νŠΈμ— μ ‘μ†ν•˜λŠ” 것을 κΈˆμ§€ν•˜κ³ , μ‚¬μš©μžμ˜ 정보λ₯Ό 감좔기 μœ„ν•΄ μ‚¬μš©λœλ‹€.


λ¦¬λ²„μŠ€ ν”„λ‘μ‹œ μ„œλ²„(reverse proxy server)
: λ¦¬λ²„μŠ€ ν”„λ‘μ‹œ μ„œλ²„λŠ” μ•„λž˜ 그림처럼 μ›Ή μ„œλ²„ μ•žμ— 놓여 μžˆλ‹€. ν¬μ›Œλ“œ ν”„λ‘μ‹œ μ„œλ²„λŠ” ν΄λΌμ΄μ–ΈνŠΈ μ•žμ— 놓여 μžˆλŠ” 반면, λ¦¬λ²„μŠ€ ν”„λ‘μ‹œλŠ” μ›Ή μ„œλ²„ μ•žμ— 놓여 μžˆλŠ” 것이닀. λ¦¬λ²„μŠ€ ν”„λ‘μ‹œ μ„œλ²„λ₯Ό μ‚¬μš©ν•˜λŠ” μ΄μœ λŠ”, 본문의 'μ›Ή μ„œλ²„μ™€ WASλ₯Ό ν•¨κ»˜ μ‚¬μš©ν•˜λŠ” 이유 - μ›Ή μ„œλ²„μ˜ μ—­ν• 'μ—μ„œ 확인할 수 μžˆμ„ 것이닀.

πŸ‘‰ κ·Έλž˜μ„œ, μ›Ή μ„œλ²„μ˜ μ—­ν•  (WAS와 뢄리해야 ν•˜λŠ” 이유) 은?

1. λ‘œλ“œ λ°ΈλŸ°μ‹±(load balancing)
: μ›Ή μ„œλ²„λŠ” λ¦¬λ²„μŠ€ ν”„λ‘μ‹œ μ„œλ²„λ‘œμ„œ λ‘œλ“œ λ°ΈλŸ°μ‹±(load balancing)에 μ‚¬μš©λœλ‹€. μ΄λŠ” 'λΆ€ν•˜ λΆ„μ‚°'을 λœ»ν•˜λ©°, 말 κ·ΈλŒ€λ‘œ ν•˜λ‚˜μ˜ μ›Ή μ„œλ²„μ— μ—¬λŸ¬ 개의 WASλ₯Ό μ—°κ²°ν•¨μœΌλ‘œμ¨ λŒ€λŸ‰μ˜ μš”μ²­μ΄ λ“€μ–΄μ˜€λ”λΌλ„ νŠΉμ • WASκ°€ κ³ΌλΆ€ν™” λ˜μ§€ μ•Šλ„λ‘ ν•˜λŠ” 것이닀. κ³ΌλΆ€ν•˜λ₯Ό λ§‰λŠ” 것과 λ”λΆˆμ–΄, λ‘œλ“œ λ°ΈλŸ°μ‹±μœΌλ‘œ 지속성, μž₯μ•  극볡 κΈ°λŠ₯을 확보할 수 μžˆλ‹€.

예λ₯Ό λ“€μ–΄, Spring으둜 λ§Œλ“  μ›Ή λ“±μ˜ μ„œλΉ„μŠ€μ— μƒˆ κΈ°λŠ₯을 μΆ”κ°€ν•΄ 동적 λΆ€λΆ„κΉŒμ§€ μ—…λ°μ΄νŠΈν•΄ μ£Όμ–΄μ•Ό ν•˜λŠ” κ²½μš°μ—λŠ” μ‹€ν–‰λ˜λ˜ μ„œλΉ„μŠ€λ₯Ό μ’…λ£Œν•˜κ³  λ‹€μ‹œ 싀행을 ν•΄ μ€˜μ•Ό ν•œλ‹€. 이 μˆœκ°„μ€ μ§§μ§€λ§Œ, κ·Έ 사이에도 μ‚¬μš©μžκ°€ μ„œλΉ„μŠ€μ— μ ‘κ·Όν•˜λ©΄ 였λ₯˜κ°€ 생길 것이닀. μ΄λ•Œ μ›Ή μ„œλ²„κ°€ 쀑간 맀개체 μ—­ν• , 즉 λ¦¬λ²„μŠ€ ν”„λ‘μ‹œ μ„œλ²„λ‘œμ„œ μ‘΄μž¬ν•΄ μ—¬λŸ¬ WAS(ν†°μΊ£)와 μ—°κ²°λ˜μ–΄ μžˆλ‹€λ©΄ ν•˜λ‚˜μ”© μ°¨λ‘€λ‘œ μ—…λ°μ΄νŠΈν•΄μ„œ ν•˜λ‚˜κ°€ μž¬λΆ€νŒ…λ˜λŠ” λ™μ•ˆ μ›Ή μ„œλ²„κ°€ λ‹€λ₯Έ ν†°μΊ£λ“€λ‘œ λΆ„μ‚°μ‹œμΌœμ£ΌλŠ” 'λ‘œλ“œ λ°ΈλŸ°μ‹±'을 ν•œλ‹€. 이둜써 μ‚¬μš©μžλŠ” μ„œλΉ„μŠ€λ₯Ό λŠκΉ€ 없이 μ΄μš©ν•  수 μžˆλŠ” '지속성'을 보μž₯λ°›λŠ”λ‹€.

λ§ˆμ°¬κ°€μ§€λ‘œ, ν•œ WASμ—μ„œ λ¬Έμ œκ°€ 생겨 WASλ₯Ό μž¬μ‹œμž‘ν•΄μ•Ό ν•˜λŠ” κ²½μš°κ°€ 생긴닀면 μ•žλ‹¨μ˜ μ›Ή μ„œλ²„μ—μ„œ ν•΄λ‹Ή WASλ₯Ό μ‚¬μš©ν•˜μ§€ λͺ»ν•˜λ„둝 μš”μ²­μ„ μ°¨λ‹¨ν•œ ν›„ WASλ₯Ό μž¬μ‹œμž‘ν•œλ‹€. 그러면 μ›Ή μ„œλ²„λŠ” ν•΄λ‹Ή WASλ₯Ό μ œμ™Έν•œ λ‹€λ₯Έ WAS둜만 λΆ„μ‚°μ‹œν‚€κ³ , 결과적으둜 μ‚¬μš©μžλ“€μ€ WAS에 λ¬Έμ œκ°€ λ°œμƒν•œμ§€κ³  λͺ¨λ₯΄κ³  μ΄μš©ν•  수 μžˆλ‹€. μ΄λŸ¬ν•œ 처리λ₯Ό 'μž₯μ•  극볡 κΈ°λŠ₯'이라 ν•œλ‹€.
(μž₯μ•  극볡 κΈ°λŠ₯ : 컴퓨터 μ„œλ²„, μ‹œμŠ€ν…œ, λ„€νŠΈμ›Œν¬ λ“±μ—μ„œ 이상이 생겼을 λ•Œ μ˜ˆλΉ„ μ‹œμŠ€ν…œμœΌλ‘œ μžλ™ μ „ν™˜λ  수 μžˆλ„λ‘ μ²˜λ¦¬ν•˜λŠ” κΈ°λŠ₯)

2. λ³΄μ•ˆ
: λ¦¬λ²„μŠ€ ν”„λ‘μ‹œ μ„œλ²„μ˜ 역할을 ν•˜λŠ” μ›Ή μ„œλ²„λŠ”, λ³΄μ•ˆ μΈ‘λ©΄μ—μ„œλ„ μž₯점이 μžˆλ‹€. μ΄λŸ¬ν•œ μ›Ή μ„œλ²„λ₯Ό μ‚¬μš©ν•˜λ©΄ μ—°κ²°λœ WAS의 IP μ£Όμ†Œλ₯Ό ν΄λΌμ΄μ–ΈνŠΈλ‘œλΆ€ν„° 감좜 수 μžˆλ‹€. λ”°λΌμ„œ ν•΄μ»€λ“€μ˜ DDoS 곡격과 같은 곡격을 λ§‰λŠ” 데 μœ μš©ν•˜λ‹€.

3. μΊμ‹œ 데이터 μ €μž₯
: λ¦¬λ²„μŠ€ ν”„λ‘μ‹œ μ„œλ²„μ˜ 역할을 ν•˜λŠ” μ›Ή μ„œλ²„μ—λŠ” μ„±λŠ₯ ν–₯상을 μœ„ν•΄ μΊμ‹œ 데이터λ₯Ό μ €μž₯ν•  수 μžˆλ‹€.

λ§Œμ•½ ν•œκ΅­μ— μžˆλŠ” μ–΄λ–€ μœ μ €κ°€ 미ꡭ에 μ›Ή μ„œλ²„λ₯Ό 두고 μžˆλŠ” μ‚¬μ΄νŠΈμ— 접속할 λ•Œ, λ¦¬λ²„μŠ€ ν”„λ‘μ‹œ μ„œλ²„κ°€ ν•œκ΅­μ— μžˆλ‹€κ³  κ°€μ •ν•΄ 보자. 그러면 ν•œκ΅­μ— μžˆλŠ” μœ μ €λŠ” ν•œκ΅­μ— μžˆλŠ” λ¦¬λ²„μŠ€ ν”„λ‘μ‹œ μ„œλ²„μ™€ ν†΅μ‹ ν•œλ‹€. λ”°λΌμ„œ λ¦¬λ²„μŠ€ ν”„λ‘μ‹œ μ„œλ²„μ— 캐싱(μž„μ‹œ μ €μž₯) λ˜μ–΄ μžˆλŠ” 데이터λ₯Ό μ‚¬μš©ν•  κ²½μš°μ—λŠ” (미ꡭ의 μ„œλ²„κΉŒμ§€ 맀번 λ‹Ώμ§€ μ•Šμ•„λ„ λ˜κΈ°μ—) 더 λΉ λ₯Έ μ„±λŠ₯을 보여쀄 수 μžˆλ‹€.
(μ˜ˆμ‹œλ₯Ό λ―Έκ΅­κ³Ό ν•œκ΅­μ˜ μ„œλ²„λ‘œ λ“€μ—ˆμœΌλ‚˜, μ΄λŠ” 거리감을 λ‚˜νƒ€λ‚΄κΈ° μœ„ν•œ μ˜ˆμ‹œμΌ 뿐이닀.)

결둠은, μ›Ή μ„œλ²„κ°€ μΊμ‹œ 데이터λ₯Ό μ €μž₯ν•  수 μžˆμœΌλ―€λ‘œ ν΄λΌμ΄μ–ΈνŠΈλŠ” μ €μž₯λ˜μ–΄ μžˆλŠ” μΊμ‹œ 데이터에 λŒ€ν•΄μ„œλŠ” 더 λΉ λ₯΄κ²Œ μ ‘κ·Όν•  수 μžˆλ‹€λŠ” 것이닀. μ΄λŠ” μ„œλ²„λ‘œ μ°Ύμ•„μ˜€λŠ” ν΄λΌμ΄μ–ΈνŠΈλ“€μ΄ 자주, 반볡적으둜 μš”μ²­ν•˜λŠ” λ¦¬μ†ŒμŠ€λ“€μ„ ν”„λ‘μ‹œ μ„œλ²„μ— μ €μž₯ν•˜κ³  μ œκ³΅ν•˜λŠ” λ°©μ‹μœΌλ‘œ ν™œμš©λœλ‹€.

4. SSL μ•”ν˜Έν™”
: 본래 μ„œλ²„κ°€ ν΄λΌμ΄μ–ΈνŠΈλ“€κ³Ό 톡신을 ν•  λ•Œ SSL(or TSL)둜 μ•”ν˜Έν™”, λ³΅ν˜Έν™”λ₯Ό ν•  경우 λΉ„μš©μ΄ 많이 λ“ λ‹€. κ·ΈλŸ¬λ‚˜ λ¦¬λ²„μŠ€ ν”„λ‘μ‹œ μ„œλ²„λ‘œμ„œ μ›Ή μ„œλ²„λ₯Ό μ΄μš©ν•˜λ©΄, λ“€μ–΄μ˜€λŠ” μš”μ²­μ„ λͺ¨λ‘ λ³΅ν˜Έν™”ν•˜κ³  λ‚˜κ°€λŠ” 응닡을 μ•”ν˜Έν™”ν•¨μœΌλ‘œμ¨ ν΄λΌμ΄μ–ΈνŠΈμ™€ μ•ˆμ „ν•œ 톡신을 ν•  수 있으며 본래 μ„œλ²„μ˜ 뢀담을 쀄여쀀닀.

/
WAS에 μž₯μ• κ°€ λ°œμƒν•˜λ”λΌλ„ Web μ„œλ²„κ°€ 였λ₯˜ ν™”λ©΄ HTML을 제곡 => 정적 λ¦¬μ†ŒμŠ€λ§Œμ„ μ œκ³΅ν•˜λŠ” Webμ„œλ²„λŠ” 잘 μ£½μ§€ μ•Šμ§€λ§Œ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ λ‘œμ§μ„ μˆ˜ν–‰ν•˜λŠ” WAS μ„œλ²„λŠ” 잘 죽음.
효율적인 λ¦¬μ†ŒμŠ€ 관리 => 정적 λ¦¬μ†ŒμŠ€κ°€ 많이 μ‚¬μš©λ˜λ©΄ Web μ„œλ²„ 증섀, 동적 λ¦¬μ†ŒμŠ€κ°€ 많이 μ‚¬μš©λ˜λ©΄ WAS 증섀
/


πŸ’‘
κ°„λ‹¨νžˆ μ •λ¦¬ν•˜μžλ©΄, `μ›Ή μ„œλ²„λŠ” μš”μ²­μ— λŒ€ν•΄ 정적 μ»¨ν…μΈ λ‘œ, WASλŠ” 정적+동적 μ»¨ν…μΈ λ‘œ 응닡할 수 μžˆλŠ” ν”„λ‘œκ·Έλž¨μ΄λ©°, μ›Ή μ„œλ²„λŠ” 정적인 컨텐츠, WASλŠ” 동적인 컨텐츠λ₯Ό λ‹΄λ‹Ήν•˜λ©΄μ„œ κ°μžκ°€ νŠΉν™”λœ κΈ°λŠ₯을 μ΅œλŒ€ν•œμœΌλ‘œ ν™œμš©ν•œλ‹€λŠ” 것이닀.

μ›Ή μ„œλ²„λŠ” WAS의 μ•ž λ‹¨μ—μ„œ 전체적인 운영과 λ³΄μ•ˆ μΈ‘λ©΄μ—μ„œ κΈ°λŠ₯ν•˜κ³ , WASλŠ” λ’€ λ‹¨μ—μ„œ DB와 μ—°κ²°ν•˜κ±°λ‚˜ 데이터λ₯Ό μ‘°μž‘ν•΄ 동적인 컨텐츠λ₯Ό λ§Œλ“€μ–΄λ‚΄λŠ” 것을 μ€‘μ‹¬μœΌλ‘œ λ™μž‘ν•œλ‹€. 이둜써 λ”μš± μ–‘μ§ˆμ˜ 컨텐츠λ₯Ό 효율적으둜 μ œκ³΅ν•  수 μžˆλ„λ‘ ν•œλ‹€.



πŸ“Œ NginX (μ›Ή μ„œλ²„)

: λ™μ‹œ 접속 μ²˜λ¦¬μ— νŠΉν™”λœ κ²½λŸ‰ μ›Ή μ„œλ²„λ‘œ, ν΄λΌμ΄μ–ΈνŠΈλ‘œλΆ€ν„° HTTP μš”μ²­μ„ λ°›μ•„ μš”μ²­μ— ν•΄λ‹Ήν•˜λŠ” 정적 νŒŒμΌμ„ 응닡해 μ£ΌλŠ” ν”„λ‘œκ·Έλž¨μ΄λ‹€. μ΄λŠ” λ¦¬λ²„μŠ€ ν”„λ‘μ‹œ μ„œλ²„(Reverse proxy server)λ‘œμ„œ WAS μ„œλ²„μ˜ λΆ€ν•˜λ₯Ό 쀄일 수 μžˆλŠ” λ‘œλ“œ λ°ΈλŸ°μ„œλ‘œ ν™œμš©λ˜κΈ°λ„ ν•œλ‹€.

NginX의 λ“±μž₯ λ°°κ²½ : Apache

NginX 이전에 μ‚¬μš©λ˜λ˜ μ•„νŒŒμΉ˜ μ„œλ²„λŠ” μƒˆλ‘œμš΄ μš”μ²­μ΄ λ“€μ–΄μ˜¬ λ•Œλ§ˆλ‹€ ν”„λ‘œμ„ΈμŠ€λ₯Ό μƒˆλ‘œ μƒμ„±ν–ˆλ‹€. ν”„λ‘œμ„ΈμŠ€ μƒμ„±μ—λŠ” μ‹œκ°„μ΄ 였래 κ±Έλ¦¬λ―€λ‘œ μš”μ²­μ΄ λ“€μ–΄μ˜€κΈ° 전에 미리 μƒμ„±ν•˜λŠ” 방식을 μ‚¬μš©ν–ˆκ³ , μš”μ²­μ΄ λ“€μ–΄μ˜€λ©΄ λ§Œλ“€μ–΄ λ‘μ—ˆλ˜ ν”„λ‘œμ„ΈμŠ€λ₯Ό κ°€μ Έλ‹€ μ‚¬μš©ν–ˆλ‹€. μ΄λŸ¬ν•œ κ΅¬μ‘°λŠ” κ°œλ°œν•˜κΈ° μ‰½λ‹€λŠ” 'ν™•μž₯μ„±'μ΄λž€ μž₯점을 κ°€μ‘Œλ‹€.

κ·ΈλŸ¬λ‚˜ 1999λ…„λΆ€ν„°λŠ” μ„œλ²„ νŠΈλž˜ν”½λŸ‰μ΄ λ†’μ•„μ Έμ„œ μ„œλ²„μ— λ™μ‹œ μ—°κ²°λœ 컀λ„₯μ…˜μ΄ λ§Žμ•„μ‘Œμ„ λ•Œ 더 이상 컀λ„₯μ…˜μ„ ν˜•μ„±ν•˜μ§€ λͺ»ν•˜λŠ” λ¬Έμ œκ°€ 생겼고, 이λ₯Ό C10K 문제라고 ν•œλ‹€. μ•„νŒŒμΉ˜λŠ” λ‹€μŒκ³Ό 같은 치λͺ…적인 문제점이 μžˆμ—ˆλ‹€.

  • 컀λ„₯μ…˜λ§ˆλ‹€ ν”„λ‘œμ„ΈμŠ€λ₯Ό ν• λ‹Ήν•˜κΈ°μ— λ©”λͺ¨λ¦¬ λΆ€μ‘±μœΌλ‘œ 이어짐
  • ν™•μž₯μ„±μ΄λΌλŠ” μž₯점이 ν”„λ‘œμ„ΈμŠ€μ˜ λ¦¬μ†ŒμŠ€ 양을 λŠ˜λ €μ„œ 무거운 ν”„λ‘œκ·Έλž¨μ΄ 됨
  • λ§Žμ€ 컀λ„₯μ…˜μ—μ„œ μš”μ²­μ΄ λ“€μ–΄μ˜€λ©΄ CPU λΆ€ν•˜κ°€ 높아짐

즉, μˆ˜λ§Žμ€ λ™μ‹œ 컀λ„₯μ…˜μ„ κ°λ‹Ήν•˜κΈ°μ—” Apache μ„œλ²„μ˜ ꡬ쑰가 μ ν•©ν•˜μ§€ μ•Šμ•˜λ‹€. 이후 2004년에 μ•„νŒŒμΉ˜ μ„œλ²„λ₯Ό λ³΄μ™„ν•˜κΈ° μœ„ν•œ μ†Œν”„νŠΈμ›¨μ–΄κ°€ λ‚˜μ™”λŠ”λ°, 이것이 NginX이닀.


NginX의 νŠΉμ§•

  • Event-Driven ꡬ쑰
    : 이벀트의 λ°œμƒμ— 따라 μž‘μ—…μ„ μ§„ν–‰ν•˜λŠ” 이벀트 기반 ꡬ쑰λ₯Ό μ‚¬μš©ν•œλ‹€. (μžμ„Έν•œ μ„€λͺ…은 μ•„λž˜μ˜ 'ꡬ쑰' νŒŒνŠΈμ—μ„œ ν™•μΈν•˜μž!)

  • 높은 μ„±λŠ₯κ³Ό 적은 λ©”λͺ¨λ¦¬ μ‚¬μš©
    : NginXλŠ” 비동기 I/O 처리 방식을 μ‚¬μš©ν•˜μ—¬ 높은 μ„±λŠ₯을 μ œκ³΅ν•œλ‹€. 이λ₯Ό 톡해, λŒ€κ·œλͺ¨ μ›Ή μ‚¬μ΄νŠΈμ—μ„œλ„ λΉ λ₯Έ 응닡 μ‹œκ°„μ„ 보μž₯ν•  수 μžˆλ‹€. λ˜ν•œ NginXλŠ” μƒˆλ‘œμš΄ μš”μ²­μ΄ λ“€μ–΄μ˜€λ”λΌλ„ μƒˆλ‘œμš΄ ν”„λ‘œμ„ΈμŠ€μ™€ μŠ€λ ˆλ“œλ₯Ό μƒμ„±ν•˜μ§€ μ•ŠκΈ°μ— 적은 λ©”λͺ¨λ¦¬ μ‚¬μš©λŸ‰μœΌλ‘œλ„ 효율적인 운용이 κ°€λŠ₯ν•˜λ‹€.

  • λ¦¬λ²„μŠ€ ν”„λ‘μ‹œ(Reverse Proxy) μ‚¬μš© κ°€λŠ₯
    : μœ„μ—μ„œ μ„€λͺ…ν•œ 것과 같이, 인터넷과 λ°±μ—”λ“œ μ‚¬μ΄μ˜ μ„œλ²„ μ˜μ—­μœΌλ‘œμ„œ 맀개체의 역할을 맑을 수 μžˆλ‹€. λ‘œλ“œ λ°ΈλŸ°μ‹±μ΄ κ°€λŠ₯ν•˜κ³ , 캐싱 μ„œλ²„λ‘œ 이용(동일 μš”μ²­ μ‹œ μΊμ‹œ μ„œλ²„λ‘œλΆ€ν„° 전달) κ°€λŠ₯ν•˜κ³ , λ³΄μ•ˆ νš¨κ³Όλ„ μžˆλ‹€.

  • SSL 지원
    : λ³΄μ•ˆ ν”„λ‘œν† μ½œμΈ SSL을 지원해 μ›Ή μ„œλ²„μ™€ ν΄λΌμ΄μ–ΈνŠΈ 간에 λ³΄μ•ˆ 연결을 μ„€μ •ν•˜κ³ , SSL μΈμ¦μ„œλ‘œ μ„œλ²„μ˜ 신원을 인증할 수 μžˆλ‹€.

  • 데이터 μ••μΆ•
    : ν΄λΌμ΄μ–ΈνŠΈκ°€ λ³΄λ‚΄λŠ” μš”μ²­μ΄ ν…μŠ€νŠΈμΌ 경우, gzip을 μ‚¬μš©ν•΄ ν•΄λ‹Ή 데이터λ₯Ό μ••μΆ•μ‹œν‚¬ 수 μžˆλ‹€.


NginX의 ꡬ쑰

NginXλŠ” ν•˜λ‚˜μ˜ λ§ˆμŠ€ν„° ν”„λ‘œμ„ΈμŠ€(master process)와 μ—¬λŸ¬ μ›Œμ»€ ν”„λ‘œμ„ΈμŠ€(worker process)둜 이루어진닀.

μ‹€μ œλ‘œ 일을 ν•˜λŠ” 건 μ›Œμ»€ ν”„λ‘œμ„ΈμŠ€μ΄λ‹€. μ›Œμ»€ ν”„λ‘œμ„ΈμŠ€λŠ” 생성될 λ•Œ 각자 μ§€μ •λœ listen μ†ŒμΌ“μ„ λ°°μ •λ°›κ³ , κ·Έ μ†ŒμΌ“μ— μƒˆλ‘œμš΄ ν΄λΌμ΄μ–ΈνŠΈ μš”μ²­μ΄ λ“€μ–΄μ˜€λ©΄ 컀λ„₯μ…˜μ„ ν˜•μ„±ν•˜κ³  μ²˜λ¦¬ν•˜λŠ” 방식이닀.

컀λ„₯μ…˜μ€ μ •ν•΄μ§„ μ‹œκ°„(Keep Alive μ‹œκ°„) 만큼 μœ μ§€λ˜λŠ”λ°, μ΄λ ‡κ²Œ 컀λ„₯μ…˜μ΄ ν˜•μ„±λ˜μ—ˆλ‹€κ³  ν•΄μ„œ 컀λ„₯μ…˜ ν•˜λ‚˜λ§Œ λ‹΄λ‹Ήν•˜μ§€λŠ” μ•ŠλŠ”λ‹€. ν˜•μ„±λœ 컀λ„₯μ…˜μ— μ•„λ¬΄λŸ° μš”μ²­μ΄ μ—†μœΌλ©΄ μƒˆλ‘œμš΄ 컀λ„₯μ…˜μ„ ν˜•μ„±ν•˜κ±°λ‚˜ 이미 λ§Œλ“€μ–΄μ§„ λ‹€λ₯Έ 컀λ„₯μ…˜μœΌλ‘œλΆ€ν„° λ“€μ–΄μ˜¨ μš”μ²­μ„ μ²˜λ¦¬ν•œλ‹€. NginXμ—μ„œλŠ” 이런 컀λ„₯μ…˜ ν˜•μ„±κ³Ό 제거, μƒˆλ‘œμš΄ μš”μ²­μ„ μ²˜λ¦¬ν•˜λŠ” 것을 이벀트(event)라고 λΆ€λ₯Έλ‹€.

μ΄λ²€νŠΈλ“€μ€ 큐 ν˜•μ‹μœΌλ‘œ μ›Œμ»€ ν”„λ‘œμ„ΈμŠ€μ— μ „λ‹¬λ˜λŠ”λ°, 큐에 λ‹΄κΈ΄ μƒνƒœμ—μ„œ μ›Œμ»€ ν”„λ‘œμ„ΈμŠ€κ°€ μ²˜λ¦¬ν•  λ•ŒκΉŒμ§€ 비동기 λ°©μ‹μœΌλ‘œ λŒ€κΈ°ν•œλ‹€. 그리고 μ›Œμ»€ ν”„λ‘œμ„ΈμŠ€λŠ” ν•˜λ‚˜μ˜ μŠ€λ ˆλ“œλ‘œ 이벀트λ₯Ό κΊΌλ‚΄μ„œ μ²˜λ¦¬ν•΄ λ‚˜κ°„λ‹€. (μ•„νŒŒμΉ˜ μ„œλ²„μ™€ 달리 NginXλŠ” 컀λ„₯μ…˜ μ—°κ²° ν›„ μš”μ²­μ΄ μ—†μœΌλ©΄ λ‹€λ₯Έ 컀λ„₯μ…˜μ˜ μš”μ²­μ„ μ²˜λ¦¬ν•˜κ±°λ‚˜ μƒˆλ‘œμš΄ 컀λ„₯μ…˜μ„ ν˜•μ„±ν•˜λ―€λ‘œ μ•„νŒŒμΉ˜ μ„œλ²„μ— λΉ„ν•΄ μžμ›μ„ 효율적으둜 μ‚¬μš©ν•œλ‹€.)

λ§Œμ•½ 큐에 λ‹΄κΈ΄ μš”μ²­ 쀑 ν•˜λ‚˜κ°€ μ‹œκ°„μ΄ 였래 걸릴 경우, μŠ€λ ˆλ“œ ν’€(Thread Pool)을 λ§Œλ“€μ–΄ κ·Έ μš”μ²­μ€ λ”°λ‘œ μˆ˜ν–‰ν•œλ‹€. μŠ€λ ˆλ“œ 풀에 이벀트λ₯Ό μœ„μž„ν•˜κ³  λ‹€λ₯Έ 이벀트λ₯Ό μ²˜λ¦¬ν•˜λŠ” 방식을 μ‚¬μš©ν•΄, μž‘μ—… 처리의 νš¨μœ¨μ„ 높인닀.

μ΄λŸ¬ν•œ μ›Œμ»€ ν”„λ‘œμ„ΈμŠ€λŠ” 보톡 CPU μ½”μ–΄ 수만큼 μƒμ„±ν•΄μ„œ, μ½”μ–΄κ°€ λ‹΄λ‹Ήν•˜λŠ” ν”„λ‘œμ„ΈμŠ€λ₯Ό λ°”κΎΈλŠ” 횟수λ₯Ό 쀄이기에 CPU의 μ»¨ν…μŠ€νŠΈ μŠ€μœ„μΉ­μ„ μ€„μ΄κ²Œ λœλ‹€. 이게 λ°”λ‘œ NginXκ°€ μ‚¬μš©ν•˜λŠ” Event-Driven Model(이벀트 기반 ꡬ쑰)이닀.


NginX의 μž₯단점

단점

  • 동적 컨텐츠λ₯Ό 기본적으둜 μ²˜λ¦¬ν•  수 μ—†μŒ
  • 동적 컨텐츠에 λŒ€ν•œ PHP 및 기타 μš”μ²­μ„ μ²˜λ¦¬ν•˜λ €λ©΄ ν”„λ‘œμ„ΈμŠ€ 속도가 μ €ν•˜λ¨

μž₯점

  • 이벀트 기반 ꡬ쑰λ₯Ό μ‚¬μš©
  • 단일 μŠ€λ ˆλ“œλ₯Ό 톡해 μ—¬λŸ¬ 연결을 처리 κ°€λŠ₯


πŸ“Œ Tomcat (WAS)

: ν†°μΊ£(Tomcat)은 μ•„νŒŒμΉ˜ μ†Œν”„νŠΈμ›¨μ–΄ μž¬λ‹¨μ˜ μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ„œλ²„(WAS)λ‘œμ„œ, 일반적으둜 Java Servletκ³Ό JSP의 μ‹€ν–‰ ν™˜κ²½μ„ μ œκ³΅ν•΄μ„œ 동적인 μ›Ή νŽ˜μ΄μ§€λ₯Ό μƒμ„±ν•˜λŠ” μ»¨ν…Œμ΄λ„ˆμ˜ κΈ°λŠ₯을 λ‹΄λ‹Ήν•œλ‹€. μ΄λŠ” DB μ—°κ²° 및 데이터 μ‘°μž‘, λ‹€λ₯Έ μ‘μš©ν”„λ‘œκ·Έλž¨κ³Όμ˜ μƒν˜Έ μž‘μš©μ΄ κ°€λŠ₯ν•˜λ‹€.

(톰캣은 λŒ€ν‘œμ μΈ WAS둜, μœ„μ—μ„œ 닀룬 WAS의 νŠΉμ§•μ„ λͺ¨λ‘ ν¬ν•¨ν•œλ‹€.)

  • 자체적으둜 λ³΄μœ ν•˜κ³  μžˆλŠ” λ‚΄λΆ€ μ›Ή μ„œλ²„μ™€ ν•¨κ»˜ λ…λ¦½μ μœΌλ‘œ μ‚¬μš©ν•  수 있음
  • Apacheλ‚˜ IIS λ“± λ‹€λ₯Έ μ›Ή μ„œλ²„μ™€ ν•¨κ»˜ μ‚¬μš©ν•˜λŠ” 것도 κ°€λŠ₯
  • 톰캣을 μ‹€ν–‰ν•˜λ €λ©΄ JRE1.1 μ΄μƒμ˜ μžλ°” λŸ°νƒ€μž„ ν™˜κ²½μ΄ ν•„μš”

Tomcat의 디렉터리 ꡬ쑰

  • Bin: ν†°μΊ£ μ„œλ²„μ˜ λ™μž‘μ„ μ œμ–΄ν•  수 μžˆλŠ” 슀크립트 및 μ‹€ν–‰ 파일
  • Conf: ν†°μΊ£μ˜ 기본적인 μ„€μ • 파일
  • Lib: μ•„νŒŒμΉ˜μ™€ 같은 λ‹€λ₯Έ μ›Ή μ„œλ²„μ™€ 톰캣을 μ—°κ²°ν•΄ μ£ΌλŠ” λ°”μ΄λ„ˆλ¦¬ λͺ¨λ“ˆλ“€
  • Webapps: 톰캣이 μ œκ³΅ν•˜λŠ” μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ κΈ°λ³Έ μœ„μΉ˜
  • Logs: μ„œλ²„μ˜ 둜그 파일이 μ €μž₯
  • Work: jsp μ»¨ν…Œμ΄λ„ˆμ™€ λ‹€λ₯Έ νŒŒμΌλ“€μ΄ μƒμ„±ν•˜λŠ” μž„μ‹œ 디렉토리
  • Temp: μž„μ‹œ μ €μž₯ 폴더

0개의 λŒ“κΈ€