--- /dev/null
+# μλ² μ컀 - ꡬλμ½κ³Ό μ λΉμ½
+
+μ λ¨κ³μμμ λ°°ν¬ κ°λ
λ€μ λ€μ νμΈν΄λ³΄κ² μ΅λλ€:
+
+* 보μ - HTTPS
+* μλ² μμκ³Ό λμμ μ€ννκΈ°
+* μ¬μμ
+* **볡μ λ³Έ (μ€ν μ€μΈ νλ‘μΈμ€μ μ«μ)**
+* λ©λͺ¨λ¦¬
+* μμνκΈ° μ μ μ¬λ¬ λ¨κ³λ€
+
+μ§κΈκΉμ§ λ¬Έμμ λͺ¨λ νν 리μΌμ μ°Έκ³ νμ¬ **λ¨μΌ νλ‘μΈμ€**λ‘ Uvicornκ³Ό κ°μ **μλ² νλ‘κ·Έλ¨**μ μ€ννμ κ²μ
λλ€.
+
+μ ν리μΌμ΄μ
μ λ°°ν¬ν λ **λ€μ€ μ½μ΄**λ₯Ό νμ©νκ³ λ λ§μ μμ²μ μ²λ¦¬ν μ μλλ‘ **νλ‘μΈμ€ 볡μ λ³Έ**μ΄ νμν©λλ€.
+
+μ κ³Όμ μ΄μλ [λ°°ν¬ κ°λ
λ€](./concepts.md){.internal-link target=_blank}μμ λ³Έ κ²μ²λΌ μ¬λ¬κ°μ§ λ°©λ²μ΄ μ‘΄μ¬ν©λλ€.
+
+μ§κΈλΆν° <a href="https://gunicorn.org/" class="external-link" target="_blank">**ꡬλμ½**</a>μ **μ λΉμ½ μ컀 νλ‘μΈμ€**μ ν¨κ» μ¬μ©νλ λ°©λ²μ μλ €λλ¦¬κ² μ΅λλ€.
+
+!!! μ 보
+ λ§μ½ λ컀μ μΏ λ²λ€ν°μ€ κ°μ 컨ν
μ΄λλ₯Ό μ¬μ©νκ³ μλ€λ©΄ λ€μ μ±ν° [FastAPIμ 컨ν
μ΄λ - λ컀](./docker.md){.internal-link target=_blank}μμ λ λ§μ μ 보λ₯Ό μ»μ μ μμ΅λλ€.
+
+ νΉν, μΏ λ²λ€ν°μ€μμ μ€νν λλ ꡬλμ½μ μ¬μ©νμ§ μκ³ λμ 컨ν
μ΄λλΉ νλμ μ λΉμ½ νλ‘μΈμ€λ₯Ό μ€ννλ κ²μ΄ μ’μ΅λλ€. μ΄ μ₯μ λ·λΆλΆμμ μ€λͺ
νκ² μ΅λλ€.
+
+## ꡬλμ½κ³Ό μ λΉμ½ μ컀
+
+**Gunicorn**μ **WSGI νμ€**μ μ£Όλ‘ μ¬μ©νλ μ ν리μΌμ΄μ
μλ²μ
λλ€. μ΄κ²μ ꡬλμ½μ΄ νλΌμ€ν¬μ μκ³ μ κ°μ μ ν리μΌμ΄μ
μ μ 곡ν μ μλ€λ κ²μ μλ―Έν©λλ€. ꡬλμ½ μ체λ μ΅μ **<a href="https://asgi.readthedocs.io/en/latest/" class="external-link" target="_blank">ASGI νμ€</a>**μ μ¬μ©νκΈ° λλ¬Έμ FastAPIμ νΈνλμ§ μμ΅λλ€.
+
+νμ§λ§ ꡬλμ½μ **νλ‘μΈμ€ κ΄λ¦¬μ**μν μ νκ³ μ¬μ©μμκ² νΉμ **μ컀 νλ‘μΈμ€ ν΄λμ€**λ₯Ό μλ €μ€λλ€. κ·Έλ° λ€μ ꡬλμ½μ ν΄λΉ ν΄λμ€λ₯Ό μ¬μ©νμ¬ νλ μ΄μμ **μ컀 νλ‘μΈμ€**λ₯Ό μμν©λλ€.
+
+κ·Έλ¦¬κ³ **μ λΉμ½**μ **ꡬλμ½κ³Ό νΈνλλ μ컀 ν΄λμ€**κ° μμ΅λλ€.
+
+μ΄ μ‘°ν©μ μ¬μ©νμ¬ κ΅¬λμ½μ **νλ‘μΈμ€ κ΄λ¦¬μ** μν μ νλ©° **ν¬νΈ**μ **IP**λ₯Ό κ΄μ°°νκ³ , **μ λΉμ½ ν΄λμ€**λ₯Ό μ€ννλ μ컀 νλ‘μΈμ€λ‘ ν΅μ μ 보λ₯Ό **μ μ‘**ν©λλ€.
+
+κ·Έλ¦¬κ³ λμ ꡬλμ½κ³Ό νΈνλλ **μ λΉμ½ μ컀** ν΄λμ€λ ꡬλμ½μ΄ λ³΄λΈ λ°μ΄ν°λ₯Ό FastAPIμμ μ¬μ©νκΈ° μν ASGI νμ€μΌλ‘ λ³ννλ μΌμ λ΄λΉν©λλ€.
+
+## ꡬλμ½κ³Ό μ λΉμ½ μ€μΉνκΈ°
+
+<div class="termy">
+
+```console
+$ pip install "uvicorn[standard]" gunicorn
+
+---> 100%
+```
+
+</div>
+
+μ΄ λͺ
λ Ήμ΄λ μ λΉμ½ `standard` μΆκ° ν¨ν€μ§(μ’μ μ±λ₯μ μν)μ ꡬλμ½μ μ€μΉν κ²μ
λλ€.
+
+## ꡬλμ½μ μ λΉμ½ μ컀μ ν¨κ» μ€ννκΈ°
+
+μ€μΉ ν ꡬλμ½ μ€ννκΈ°:
+
+<div class="termy">
+
+```console
+$ gunicorn main:app --workers 4 --worker-class uvicorn.workers.UvicornWorker --bind 0.0.0.0:80
+
+[19499] [INFO] Starting gunicorn 20.1.0
+[19499] [INFO] Listening at: http://0.0.0.0:80 (19499)
+[19499] [INFO] Using worker: uvicorn.workers.UvicornWorker
+[19511] [INFO] Booting worker with pid: 19511
+[19513] [INFO] Booting worker with pid: 19513
+[19514] [INFO] Booting worker with pid: 19514
+[19515] [INFO] Booting worker with pid: 19515
+[19511] [INFO] Started server process [19511]
+[19511] [INFO] Waiting for application startup.
+[19511] [INFO] Application startup complete.
+[19513] [INFO] Started server process [19513]
+[19513] [INFO] Waiting for application startup.
+[19513] [INFO] Application startup complete.
+[19514] [INFO] Started server process [19514]
+[19514] [INFO] Waiting for application startup.
+[19514] [INFO] Application startup complete.
+[19515] [INFO] Started server process [19515]
+[19515] [INFO] Waiting for application startup.
+[19515] [INFO] Application startup complete.
+```
+
+</div>
+
+κ° μ΅μ
μ΄ λ¬΄μμ μλ―Ένλμ§ μ΄ν΄λ΄
μλ€:
+
+* μ΄κ²μ μ λΉμ½κ³Ό λκ°μ λ¬Έλ²μ
λλ€. `main`μ νμ΄μ¬ λͺ¨λ λ€μ "`main`"μ μλ―Ένλ―λ‘ `main.py`νμΌμ λ»ν©λλ€. κ·Έλ¦¬κ³ `app`μ **FastAPI** μ΄ν리μΌμ΄μ
μ΄ λ€μ΄ μλ λ³μμ μ΄λ¦μ
λλ€.
+ * `main:app`μ΄ νμ΄μ¬μ `import` λ¬Έλ²κ³Ό ν‘μ¬ν λ©΄μ΄ μλ€λ κ±Έ μ μ μμ΅λλ€:
+
+ ```Python
+ from main import app
+ ```
+
+ * κ³§, `main:app`μμ μλ μ½λ‘ μ μλ―Έλ νμ΄μ¬μμ `from main import app`μμμ `import`μ κ°μ΅λλ€.
+* `--workers`: μ¬μ©ν μ컀 νλ‘μΈμ€μ κ°μμ΄λ©° μ«μλ§νΌμ μ λΉμ½ μ컀λ₯Ό μ€νν©λλ€. μ΄ μμ μμλ 4κ°μ μ컀λ₯Ό μ€νν©λλ€.
+* `--worker-class`: μ컀 νλ‘μΈμ€μμ μ¬μ©νκΈ° μν ꡬλμ½κ³Ό νΈνλλ μ컀ν΄λμ€.
+ * μ΄λ°μμΌλ‘ ꡬλμ½μ΄ importνμ¬ μ¬μ©ν μ μλ ν΄λμ€λ₯Ό μ λ¬ν΄μ€λλ€:
+
+ ```Python
+ import uvicorn.workers.UvicornWorker
+ ```
+
+* `--bind`: ꡬλμ½μ΄ κ΄μ°°ν IPμ ν¬νΈλ₯Ό μλ―Έν©λλ€. μ½λ‘ (`:`)μ μ¬μ©νμ¬ IPμ ν¬νΈλ₯Ό ꡬλΆν©λλ€.
+ * λ§μ½μ `--bind 0.0.0.0:80` (ꡬλμ½ μ΅μ
) λμ μ λΉμ½μ μ§μ μ€ννκ³ μΆλ€λ©΄ `--host 0.0.0.0`κ³Ό `--port 80`μ μ¬μ©ν΄μΌ ν©λλ€.
+
+μΆλ ₯μμ κ° νλ‘μΈμ€μ λν **PID** (process ID)λ₯Ό νμΈν μ μμ΅λλ€. (λ¨μν μ«μμ
λλ€)
+
+μΆλ ₯ λ΄μ©:
+
+* ꡬλμ½ **νλ‘μΈμ€ λ§€λμ **λ PID `19499`λ‘ μ€νλ©λλ€. (μ§μ μ€νν κ²½μ° μ«μκ° λ€λ₯Ό μ μμ΅λλ€)
+* λ€μμΌλ‘ `Listening at: http://0.0.0.0:80`μ μμν©λλ€.
+* κ·Έλ° λ€μ μ¬μ©ν΄μΌν `uvicorn.workers.UvicornWorker`μ μ컀ν΄λμ€λ₯Ό νμ§ν©λλ€.
+* κ·Έλ¦¬κ³ PID `19511`, `19513`, `19514`, κ·Έλ¦¬κ³ `19515`λ₯Ό κ°μ§ **4κ°μ μ컀**λ₯Ό μ€νν©λλ€.
+
+
+λν ꡬλμ½μ μ컀μ μλ₯Ό μ μ§νκΈ° μν΄ **μ£½μ νλ‘μΈμ€**λ₯Ό κ΄λ¦¬νκ³ **μ¬μμ**νλ μμ
μ μ±
μμ§λλ€. μ΄κ²μ μ΄λ² μ₯ μλ¨ λͺ©λ‘μ **μ¬μμ** κ°λ
μ λΆλΆμ μΌλ‘ λμμ£Όλ κ²μ
λλ€.
+
+κ·ΈλΌμλ λΆκ΅¬νκ³ νμν κ²½μ° μΈλΆμμ **ꡬλμ½μ μ¬μμ**νκ³ , νΉμ **μλ²λ₯Ό μμν λ μ€ν**ν μ μλλ‘ νκ³ μΆμ΄ν κ²μ
λλ€.
+
+## μ λΉμ½κ³Ό μ컀
+
+μ λΉμ½μ λͺ κ°μ **μ컀 νλ‘μΈμ€**μ ν¨κ» μ€νν μ μλ μ νμ§κ° μμ΅λλ€.
+
+κ·ΈλΌμλ λΆκ΅¬νκ³ , μ λΉμ½μ μ컀 νλ‘μΈμ€λ₯Ό λ€λ£¨λ λ°μ μμ΄μ ꡬλμ½λ³΄λ€ λ μ νμ μ
λλ€. λ°λΌμ μ΄ μμ€(νμ΄μ¬ μμ€)μ νλ‘μΈμ€ κ΄λ¦¬μλ₯Ό μ¬μ©νλ €λ©΄ ꡬλμ½μ νλ‘μΈμ€ κ΄λ¦¬μλ‘ μ¬μ©νλ κ²μ΄ μ’μ΅λλ€.
+
+λ³΄ν΅ μ΄λ κ² μ€νν μ μμ΅λλ€:
+
+<div class="termy">
+
+```console
+$ uvicorn main:app --host 0.0.0.0 --port 8080 --workers 4
+<font color="#A6E22E">INFO</font>: Uvicorn running on <b>http://0.0.0.0:8080</b> (Press CTRL+C to quit)
+<font color="#A6E22E">INFO</font>: Started parent process [<font color="#A1EFE4"><b>27365</b></font>]
+<font color="#A6E22E">INFO</font>: Started server process [<font color="#A1EFE4">27368</font>]
+<font color="#A6E22E">INFO</font>: Waiting for application startup.
+<font color="#A6E22E">INFO</font>: Application startup complete.
+<font color="#A6E22E">INFO</font>: Started server process [<font color="#A1EFE4">27369</font>]
+<font color="#A6E22E">INFO</font>: Waiting for application startup.
+<font color="#A6E22E">INFO</font>: Application startup complete.
+<font color="#A6E22E">INFO</font>: Started server process [<font color="#A1EFE4">27370</font>]
+<font color="#A6E22E">INFO</font>: Waiting for application startup.
+<font color="#A6E22E">INFO</font>: Application startup complete.
+<font color="#A6E22E">INFO</font>: Started server process [<font color="#A1EFE4">27367</font>]
+<font color="#A6E22E">INFO</font>: Waiting for application startup.
+<font color="#A6E22E">INFO</font>: Application startup complete.
+```
+
+</div>
+
+μλ‘μ΄ μ΅μ
μΈ `--workers`μ μ λΉμ½μκ² 4κ°μ μ컀 νλ‘μΈμ€λ₯Ό μ¬μ©νλ€κ³ μλ €μ€λλ€.
+
+κ° νλ‘μΈμ€μ **PID**λ₯Ό νμΈν μ μμ΅λλ€. `27365`λ μμ νλ‘μΈμ€(**νλ‘μΈμ€ λ§€λμ **), κ·Έλ¦¬κ³ κ°κ°μ μ컀νλ‘μΈμ€λ `27368`, `27369`, `27370`, κ·Έλ¦¬κ³ `27367`μ
λλ€.
+
+## λ°°ν¬ κ°λ
λ€
+
+μ¬κΈ°μμλ **μ λΉμ½ μ컀 νλ‘μΈμ€**λ₯Ό κ΄λ¦¬νλ **ꡬλμ½**(λλ μ λΉμ½)μ μ¬μ©νμ¬ μ ν리μΌμ΄μ
μ **λ³λ ¬ν**νκ³ , CPU **λ©ν° μ½μ΄**μ μ₯μ μ νμ©νκ³ , **λ λ§μ μμ²**μ μ²λ¦¬ν μ μλ λ°©λ²μ μ΄ν΄λ³΄μμ΅λλ€.
+
+μ컀λ₯Ό μ¬μ©νλ κ²μ λ°°ν¬ κ°λ
λͺ©λ‘μμ μ£Όλ‘ **볡μ λ³Έ** λΆλΆκ³Ό **μ¬μμ**μ μ½κ° λμμ΄ λμ§λ§ λ€λ₯Έ λ°°ν¬ κ°λ
λ€λ λ€λ£¨μ΄μΌ ν©λλ€:
+
+* **보μ - HTTPS**
+* **μλ² μμκ³Ό λμμ μ€ννκΈ°**
+* ***μ¬μμ***
+* 볡μ λ³Έ (μ€ν μ€μΈ νλ‘μΈμ€μ μ«μ)
+* **λ©λͺ¨λ¦¬**
+* **μμνκΈ° μ μ μ¬λ¬ λ¨κ³λ€**
+
+
+## 컨ν
μ΄λμ λ컀
+
+λ€μ μ₯μΈ [FastAPIμ 컨ν
μ΄λ - λ컀](./docker.md){.internal-link target=_blank}μμ λ€λ₯Έ **λ°°ν¬ κ°λ
λ€**μ λ€λ£¨λ μ λ΅λ€μ μλ €λλ¦¬κ² μ΅λλ€.
+
+λν κ°λ¨ν μΌμ΄μ€μμ μ¬μ©ν μ μλ, **ꡬλμ½κ³Ό μ λΉμ½ μ컀**κ° ν¬ν¨λΌ μλ **곡μ λ컀 μ΄λ―Έμ§**μ ν¨κ» λͺ κ°μ§ κΈ°λ³Έ ꡬμ±μ 보μ¬λλ¦¬κ² μ΅λλ€.
+
+κ·Έλ¦¬κ³ λ¨μΌ μ λΉμ½ νλ‘μΈμ€(ꡬλμ½ μμ΄)λ₯Ό μ€νν μ μλλ‘ **μ¬μ©μ μμ μ μ΄λ―Έμ§λ₯Ό μ²μλΆν° ꡬμΆ**νλ λ°©λ²λ 보μ¬λλ¦¬κ² μ΅λλ€. μ΄λ κ°λ¨ν κ³Όμ μ΄λ©°, **μΏ λ²λ€ν°μ€**μ κ°μ λΆμ° 컨ν
μ΄λ κ΄λ¦¬ μμ€ν
μ μ¬μ©ν λ μνν μμ
μ
λλ€.
+
+## μμ½
+
+λΉμ μ **ꡬλμ½**(λλ μ λΉμ½)μ μ λΉμ½ μ컀μ ν¨κ» νλ‘μΈμ€ κ΄λ¦¬μλ‘ μ¬μ©νμ¬ **λ©ν°-μ½μ΄ CPU**λ₯Ό νμ©νλ **λ©ν° νλ‘μΈμ€λ₯Ό λ³λ ¬λ‘ μ€ν**ν μ μμ΅λλ€.
+
+λ€λ₯Έ λ°°ν¬ κ°λ
μ μ§μ λ€λ£¨λ©΄μ **μμ λ§μ λ°°ν¬ μμ€ν
**μ ꡬμ±νλ κ²½μ° μ΄λ¬ν λꡬμ κ°λ
λ€μ νμ©ν μ μμ΅λλ€.
+
+λ€μ μ₯μμ 컨ν
μ΄λ(μ: λ컀 λ° μΏ λ²λ€ν°μ€)μ ν¨κ»νλ **FastAPI**μ λν΄ λ°°μ보μΈμ. μ΄λ¬ν ν΄μλ λ€λ₯Έ **λ°°ν¬ κ°λ
**λ€μ κ°λ¨ν ν΄κ²°ν μ μλ λ°©λ²μ΄ μμ΅λλ€. β¨