1 λΆ„ μ†Œμš”

μ›Ή μ„œλ²„λž€?

ν”νžˆ μš°λ¦¬κ°€ μ›Ήμ„œλ²„λΌκ³  ν•˜λ©΄ λ‹€μŒ 두가지 쀑 ν•˜λ‚˜λ₯Ό μ˜λ―Έν•¨.

μ†Œν”„νŠΈμ›¨μ–΄μ  관점
λΈŒλΌμš°μ €μ™€ 같은 ν΄λΌμ΄μ–ΈνŠΈλ‘œλΆ€ν„° http μš”μ²­μ„ λ°›κ³ , html λ¬Έμ„œμ™€ 같은 μ›Ή νŽ˜μ΄μ§€λ₯Ό λ°˜ν™˜ν•˜λŠ” 컴퓨터 ν”„λ‘œκ·Έλž¨
ν•˜λ“œμ›¨μ–΄μ  관점
μ†Œν”„νŠΈμ›¨μ–΄μ  κ΄€μ μ—μ„œ λ™μž‘ν•˜λŠ” κΈ°λŠ₯을 μˆ˜ν–‰ν•˜λŠ” 물리적 컴퓨터

Apache(μ•„νŒŒμΉ˜)

μ•„νŒŒμΉ˜λŠ” μ•„νŒŒμΉ˜ μ†Œν”„νŠΈμ›¨μ–΄ μž¬λ‹¨μ—μ„œ κ°œλ°œν•˜κ³  κ΄€λ¦¬ν•˜λŠ” 무료 http μ›Ή μ„œλ²„ μ†Œν”„νŠΈμ›¨μ–΄μž„.
기본적인 λ™μž‘ 방식은 μ‚¬μš©μžμ˜ httpμš”μ²­μ΄ 올 λ•Œλ§ˆλ‹€ ν”„λ‘œμ„ΈμŠ€λ‚˜ μŠ€λ ˆλ“œλ₯Ό μƒˆλ‘œ 생성함.
단일 μš”μ²­ - 단인 μŠ€λ ˆλ“œ/ν”„λ‘œμ„ΈμŠ€μ΄λ―€λ‘œ, μ‚¬μš©μžμ˜ μš”μ²­μ΄ λ§Žμ•„μ§ˆ 수둝 λ©”λͺ¨λ¦¬λ₯Ό 많이 μ°¨μ§€ν•œλ‹€λŠ” 단점이 μžˆλ‹€.
κ·ΈλŸ¬λ‹€λ³΄λ©΄, ν•˜λ‚˜μ˜ CPUκ°€ μ—¬λŸ¬ ν”„λ‘œμ„ΈμŠ€λ₯Ό 맑아 μ²˜λ¦¬ν•΄μ•Ό ν•˜λ―€λ‘œ λΆ€ν•˜κ°€ λ§Žμ•„μ§ˆ μˆ˜κ°€ μžˆλ‹€.

Apache λ™μž‘ 방식

Prefork MPM(Multi Processing Module)방식

  • http μš”μ²­μ΄ 올 λ•Œλ§ˆλ‹€ ν”„λ‘œμ„ΈμŠ€λ₯Ό 맀번 λ³΅μ œν•΄μ„œ ν”„λ‘œμ„ΈμŠ€μ—μ„œ μ‹±κΈ€ μŠ€λ ˆλ“œλ‘œ μ‚¬μš©μž μš”μ²­μ„ μ²˜λ¦¬ν•¨.
    • μ‚¬μš©μž μš”μ²­ = ν”„λ‘œμ„ΈμŠ€ 개수

Worker MPM방식
ν•œ 개의 ν”„λ‘œμ„ΈμŠ€κ°€ μ—¬λŸ¬ μŠ€λ ˆλ“œλ₯Ό μƒμ„±ν•˜μ—¬ ν•΄λ‹Ή HTTP μš”μ²­μ„ μ²˜λ¦¬ν•˜λ―€λ‘œ Prefork 방식보닀 λ©”λͺ¨λ¦¬ μ†Œλͺ¨κ°€ 적음.
ν•˜μ§€λ§Œ λ©€ν‹° μŠ€λ ˆλ“œ 방식은 CPU μŠ€μΌ€μ€„λ§μ„ μœ„ν•œ 처리 μ‹œκ°„κ³Ό λ¬Έλ§₯ μ „ν™˜ λΉ„μš©μ΄ λ°œμƒν•˜λŠ” 단점이 μžˆλ‹€.
μŠ€λ ˆλ“œλ₯Ό λΆ„λ°°ν•˜κΈ° μœ„ν•΄ μ‚¬μš©λ˜λŠ” CPU μŠ€μΌ€μ€„λ§μ— λŒ€ν•œ μ—°μ‚° μž‘μ—…κ³Ό μ“°λ ˆλ“œ κ°„μ˜ μ „ν™˜μ„ μœ„ν•΄ μ „ν™˜ν•˜κΈ° μ§μ „μ˜ μ“°λ ˆλ“œλ₯Ό λ‚˜μ€‘μ— λ³΅κ·€μ‹œν‚¬ λ•Œλ₯Ό λŒ€λΉ„ν•˜μ—¬ μƒνƒœλ₯Ό μ €μž₯해두기 μœ„ν•œ CPU μ—°μ‚° μž‘μ—…μœΌλ‘œ 인해 μŠ€λ ˆλ“œκ°€ λ§Žμ•„μ§ˆμˆ˜λ‘ μ„±λŠ₯ μ €ν•˜κ°€ λ°œμƒν•¨.

Nginx(μ—”μ§„μ—‘μŠ€)

NginxλŠ” μ›Ή μ„œλ²„ μ†Œν”„νŠΈμ›¨μ–΄μ΄λ‹€.
μ‚¬μš©μž μš”μ²­μ— μ‘λ‹΅ν•˜κΈ° μœ„ν•΄ 비동기 이벀트 기반의 ꡬ쑰λ₯Ό 가진닀.

비동기 이벀트
httpμš”μ²­μ΄ 수 μ²œκ°œμ™€ 같이 많이 듀어와도 정해진 수의 ν”„λ‘œμ„ΈμŠ€κ°€ 이 μš”μ²­λ“€μ„ 이벀트둜 λ“±λ‘ν•˜κ³  비동기 λ°©μ‹μœΌλ‘œ λŒ€κΈ°μ‹œμΌœ μ™„λ£Œλ˜λŠ” μš”μ²­λΆ€ν„° 처리(응닡)ν•΄μ£ΌλŠ” 것을 말함.

Nginx λ™μž‘ 방식

NGINXμ—μ„œλŠ” 컀λ„₯μ…˜ 생성 및 컀λ„₯μ…˜ 제거, 그리고 μƒˆλ‘œμš΄ μš”μ²­μ„ μ²˜λ¦¬ν•˜λŠ” 것을 이벀트라고 λΆ€λ₯Έλ‹€.
이 μ΄λ²€νŠΈλ“€μ€ OS컀널이 큐 ν˜•μ‹μœΌλ‘œ worker ν”„λ‘œμ„ΈμŠ€μ—κ²Œ 전달해주고, μ΄λ²€νŠΈκ°€ 큐에 λ‹΄κΈ΄ μƒνƒœμ—μ„œ worker ν”„λ‘œμ„ΈμŠ€κ°€ μ²˜λ¦¬ν•  λ•ŒκΉŒμ§€ 비동기 λ°©μ‹μœΌλ‘œ λŒ€κΈ°ν•œλ‹€.
그리고 μ›Œμ»€ ν”„λ‘œμ„ΈμŠ€λŠ” ν•˜λ‚˜μ˜ μŠ€λ ˆλ“œλ‘œ 이벀트λ₯Ό κΊΌλ‚΄μ„œ μ²˜λ¦¬ν•΄ λ‚˜κ°„λ‹€.
μ΄λ ‡κ²Œ 되면 μ›Œμ»€ ν”„λ‘œμ„ΈμŠ€κ°€ μ‰΄ν‹ˆμ—†μ΄ μΌν•˜κΈ° λ•Œλ¬Έμ— μ•„νŒŒμΉ˜ μ„œλ²„μ—μ„œ μš”μ²­μ΄ μ—†λ‹€λ©΄ 방치되던 ν”„λ‘œμ„ΈμŠ€λ³΄λ‹€ μ„œλ²„ μžμ›μ„ 더 효율적으둜 μ“Έ 수 있게 λ˜λŠ” 것이닀.
κ·ΈλŸ¬λ‚˜ λ„€λͺ¨ μΉΈ(큐)에 μžˆλŠ” μš”μ²­(이벀트) 쀑 ν•˜λ‚˜κ°€ μ‹œκ°„μ΄ μ˜€λž˜κ±Έλ¦¬λŠ” μž‘μ—…(ex. Disk I/O)이면 μ–΄λ–»κ²Œ 될까?
κ·Έ 뒀에 μžˆλŠ” μ΄λ²€νŠΈλŠ” μš”μ²­μ„ μ²˜λ¦¬ν•˜λŠ” κΈ΄ μ‹œκ°„λ™μ•ˆ λΈ”λ‘œν‚Ήμ΄ λœλ‹€.
κ·Έλž˜μ„œ NGINXλŠ” μ‹œκ°„μ΄ 였래 κ±Έλ¦¬λŠ” μž‘μ—…μ€ λ”°λ‘œ μˆ˜ν–‰ν•˜λŠ” μŠ€λ ˆλ“œ ν’€(Thread Pool)을 λ§Œλ“€μ–΄λ†“κ³ , μ›Œμ»€ ν”„λ‘œμ„ΈμŠ€λŠ” μ§€κΈˆ μ²˜λ¦¬ν•  μš”μ²­μ΄ μ‹œκ°„μ΄ 많이 걸릴 것 κ°™λ‹€λ©΄ μŠ€λ ˆλ“œ 풀에 κ·Έ 이벀트λ₯Ό μœ„μž„ν•˜κ³  큐 μ•ˆμ— μžˆλŠ” λ‹€λ₯Έ 이벀트λ₯Ό μ²˜λ¦¬ν•˜λŸ¬ κ°€κ²Œ λœλ‹€.

νƒœκ·Έ:

μΉ΄ν…Œκ³ λ¦¬:

μ—…λ°μ΄νŠΈ:

λŒ“κΈ€λ‚¨κΈ°κΈ°