๐Ÿš€ FastAPI ์˜จํ”„๋ ˆ๋ฏธ์Šค ๋ฐฐํฌ ๊ฐ€์ด๋“œ โ€“ Linux ์„œ๋ฒ„ ํ™˜๊ฒฝ ์ค‘์‹ฌ

๐Ÿ•’ ์•ฝ 2๋ถ„ ์ฝ๋Š” ๋ฐ ์†Œ์š”๋ฉ๋‹ˆ๋‹ค

์ด์ „ ๊ธ€ ๋ณด๊ธฐ(Windows ๊ธฐ์ค€ FastAPI ์˜จํ”„๋ ˆ๋ฏธ์Šค ๋ฐฐํฌ ๊ฐ€์ด๋“œ)

FastAPI๋กœ ๋ฐฑ์—”๋“œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ฐœ๋ฐœํ–ˆ๋‹ค๋ฉด, ์ด์ œ ์„ธ์ƒ์— ๋ณด์—ฌ์ค„ ์ฐจ๋ก€๋‹ค. ์ด๋ฒˆ ๊ธ€์—์„œ๋Š” Linux ์„œ๋ฒ„ ํ™˜๊ฒฝ์—์„œ ์˜จํ”„๋ ˆ๋ฏธ์Šค๋กœ FastAPI ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ฐฐํฌํ•˜๋Š” ์ „ ๊ณผ์ •์„ ์ž์„ธํžˆ ์•ˆ๋‚ดํ•˜๊ฒ ๋‹ค. ์‹ค๋ฌด์—์„œ ๋งŽ์ด ์‚ฌ์šฉ๋˜๋Š” Uvicorn + Gunicorn ์กฐํ•ฉ, ๊ทธ๋ฆฌ๊ณ  Docker๋ฅผ ํ™œ์šฉํ•œ ์ปจํ…Œ์ด๋„ˆ ๊ธฐ๋ฐ˜ ๋ฐฐํฌ ๋ฐฉ์‹๊นŒ์ง€ ๋‹ค๋ค„๋ณด์ž.

์ด ๊ธ€์€ Ubuntu ๊ธฐ๋ฐ˜์˜ Linux ์„œ๋ฒ„์—์„œ FastAPI๋ฅผ ๋ฐฐํฌํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๊ณ  ์ž‘์„ฑํ•œ๋‹ค. ๊ฐ€์žฅ ํ”ํ•˜๊ฒŒ ์‚ฌ์šฉ๋˜๋Š” ๋ฐฐํฌ ํ™˜๊ฒฝ์ธ ๋งŒํผ ์‹ค์ „์—์„œ๋„ ๋ฐ”๋กœ ์ ์šฉํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค.


๐Ÿ”ง Uvicorn ๋‹จ๋… ์‹คํ–‰ vs Gunicorn๊ณผ ํ•จ๊ป˜ ์‹คํ–‰

FastAPI๋Š” ASGI ๊ธฐ๋ฐ˜์˜ ํ”„๋ ˆ์ž„์›Œํฌ์ด๋ฉฐ, ASGI ์„œ๋ฒ„๋กœ ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋ฐ”๋กœ Uvicorn์ด๋‹ค. ๊ฐœ๋ฐœ ์ค‘์—๋Š” Uvicorn๋งŒ์œผ๋กœ๋„ ์ถฉ๋ถ„ํ•˜์ง€๋งŒ, ์šด์˜ ํ™˜๊ฒฝ์—์„œ๋Š” ๋ฉ€ํ‹ฐ ํ”„๋กœ์„ธ์‹ฑ์„ ์ง€์›ํ•˜๋Š” Gunicorn + Uvicorn worker ์กฐํ•ฉ์ด ์•ˆ์ •์„ฑ๊ณผ ์„ฑ๋Šฅ ๋ฉด์—์„œ ๋” ์ ํ•ฉํ•˜๋‹ค.

1. ํ™˜๊ฒฝ ์ค€๋น„

sudo apt update
sudo apt install python3 python3-pip -y
python3 -m pip install --upgrade pip

2. ๊ฐ€์ƒํ™˜๊ฒฝ ์ƒ์„ฑ ๋ฐ ํŒจํ‚ค์ง€ ์„ค์น˜

python3 -m venv venv
source venv/bin/activate
pip install fastapi uvicorn gunicorn

FastAPI ์•ฑ์€ ์˜ˆ์‹œ๋กœ main.py์— ์ž‘์„ฑ๋˜์–ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•œ๋‹ค.

# main.py
from fastapi import FastAPI

app = FastAPI()

@app.get("/")
def read_root():
    return {"Hello": "World"}

3. Gunicorn + Uvicorn Worker ์‹คํ–‰

์šด์˜ ํ™˜๊ฒฝ์—์„œ๋Š” ๋‹ค์Œ ๋ช…๋ น์–ด๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹คํ–‰ํ•œ๋‹ค.

gunicorn main:app -w 4 -k uvicorn.workers.UvicornWorker --bind 0.0.0.0:8000
  • main:app: main.py์˜ app ๊ฐ์ฒด
  • -w 4: 4๊ฐœ์˜ ์›Œ์ปค ํ”„๋กœ์„ธ์Šค ์‚ฌ์šฉ
  • -k: ์›Œ์ปค ํด๋ž˜์Šค ์ง€์ •
  • --bind: IP ๋ฐ ํฌํŠธ ์ง€์ •

์ด ๊ตฌ์„ฑ์„ ํ†ตํ•ด ๋ฉ€ํ‹ฐ์ฝ”์–ด CPU ์ž์›์„ ํ™œ์šฉํ•ด ํšจ์œจ์ ์ธ ์š”์ฒญ ์ฒ˜๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•ด์ง„๋‹ค.


๐Ÿณ Docker๋ฅผ ํ™œ์šฉํ•œ ์ปจํ…Œ์ด๋„ˆ ๋ฐฐํฌ

๋ฆฌ๋ˆ…์Šค ํ™˜๊ฒฝ์—์„œ๋„ ์ ์  ๋” Docker ๊ธฐ๋ฐ˜ ๋ฐฐํฌ๊ฐ€ ํ‘œ์ค€์ด ๋˜๊ณ  ์žˆ๋‹ค. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ํ•˜๋‚˜์˜ ์ด๋ฏธ์ง€๋กœ ํŒจํ‚ค์ง•ํ•˜๋ฉด, ์–ด๋””์„œ๋“  ๋™์ผํ•œ ํ™˜๊ฒฝ์œผ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

1. Docker ์„ค์น˜

Ubuntu์—์„œ๋Š” ๋‹ค์Œ ๋ช…๋ น์–ด๋กœ Docker๋ฅผ ์„ค์น˜ํ•œ๋‹ค.

sudo apt update
sudo apt install docker.io -y
sudo systemctl enable --now docker

์„ค์น˜ ํ™•์ธ์€ ์•„๋ž˜ ๋ช…๋ น์–ด๋กœ ๊ฐ€๋Šฅํ•˜๋‹ค.

docker --version

2. ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ

.
โ”œโ”€โ”€ app
โ”‚   โ””โ”€โ”€ main.py
โ”œโ”€โ”€ requirements.txt
โ””โ”€โ”€ Dockerfile

3. requirements.txt

fastapi
uvicorn[standard]

4. Dockerfile

FROM python:3.11-slim

WORKDIR /app

COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

COPY ./app ./app

CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8000"]

Dockerfile์€ ๊ฐ€๋ณ๊ณ  ์‹คํ–‰์— ์ตœ์ ํ™”๋œ ๊ตฌ์„ฑ์œผ๋กœ ์ž‘์„ฑํ•˜๋ฉฐ, ์‹ค์ œ ์„œ๋น„์Šค ํ™˜๊ฒฝ์—์„œ๋„ ์†์‰ฝ๊ฒŒ ์ด์‹ ๊ฐ€๋Šฅํ•˜๋‹ค.

5. Docker ์ด๋ฏธ์ง€ ๋นŒ๋“œ

docker build -t fastapi-app .

6. Docker ์ปจํ…Œ์ด๋„ˆ ์‹คํ–‰

docker run -d -p 8000:8000 --name fastapi-container fastapi-app

์ด์ œ http://<์„œ๋ฒ„ IP>:8000์œผ๋กœ ์ ‘์†ํ•˜๋ฉด FastAPI ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์ •์ƒ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.


๐Ÿ›ก Nginx์™€ ํ•จ๊ป˜ ๋ฆฌ๋ฒ„์Šค ํ”„๋ก์‹œ ๊ตฌ์„ฑ (์„ ํƒ์‚ฌํ•ญ)

์‹ค์ œ ์šด์˜ ํ™˜๊ฒฝ์—์„œ๋Š” Nginx๋ฅผ ์•ž๋‹จ์— ๋‘๊ณ , Gunicorn์ด๋‚˜ Docker ์ปจํ…Œ์ด๋„ˆ๋กœ ์—ฐ๊ฒฐ๋œ Uvicorn ์„œ๋ฒ„์— ์š”์ฒญ์„ ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ์ด ์ผ๋ฐ˜์ ์ด๋‹ค. ์ด ๊ตฌ์„ฑ์„ ํ†ตํ•ด HTTPS ์„ค์ •, ๋กœ๋“œ ๋ฐธ๋Ÿฐ์‹ฑ, ์ •์  ํŒŒ์ผ ์ฒ˜๋ฆฌ ๋“ฑ ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ์„ ํšจ๊ณผ์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

1. Nginx ์„ค์น˜

sudo apt install nginx -y

2. Nginx ์„ค์ • ์˜ˆ์‹œ

server {
    listen 80;
    server_name your-domain.com;

    location / {
        proxy_pass http://127.0.0.1:8000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

์„ค์ •์„ /etc/nginx/sites-available/fastapi์— ์ž‘์„ฑํ•˜๊ณ , sites-enabled์— ์‹ฌ๋ณผ๋ฆญ ๋งํฌ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

sudo ln -s /etc/nginx/sites-available/fastapi /etc/nginx/sites-enabled/
sudo systemctl restart nginx

์ด์ œ Nginx๊ฐ€ 80๋ฒˆ ํฌํŠธ๋ฅผ ํ†ตํ•ด ๋“ค์–ด์˜จ ์š”์ฒญ์„ ๋‚ด๋ถ€ Uvicorn ์„œ๋ฒ„๋กœ ์ „๋‹ฌํ•˜๊ฒŒ ๋œ๋‹ค.


๐Ÿ” Supervisor๋ฅผ ์ด์šฉํ•œ ํ”„๋กœ์„ธ์Šค ๊ด€๋ฆฌ

Linux ์„œ๋ฒ„์—์„œ๋Š” FastAPI ์•ฑ์„ ํ•ญ์ƒ ์‹คํ–‰ ์ƒํƒœ๋กœ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด Supervisor๋ฅผ ๋งŽ์ด ์‚ฌ์šฉํ•œ๋‹ค. ์ด๋Š” ์ž๋™ ์žฌ์‹œ์ž‘, ๋กœ๊ทธ ๊ด€๋ฆฌ ๋“ฑ์„ ์‰ฝ๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ค€๋‹ค.

1. Supervisor ์„ค์น˜

sudo apt install supervisor -y

2. ์„ค์ • ํŒŒ์ผ ์ƒ์„ฑ

sudo nano /etc/supervisor/conf.d/fastapi.conf

์„ค์ • ์˜ˆ์‹œ:

[program:fastapi]
command=/home/ubuntu/venv/bin/gunicorn main:app -w 4 -k uvicorn.workers.UvicornWorker --bind 0.0.0.0:8000
directory=/home/ubuntu/app
autostart=true
autorestart=true
stderr_logfile=/var/log/fastapi.err.log
stdout_logfile=/var/log/fastapi.out.log

์ดํ›„ ์„ค์ •์„ ๋ฐ˜์˜ํ•˜๊ณ  Supervisor๋ฅผ ์žฌ์‹œ์ž‘ํ•œ๋‹ค.

sudo supervisorctl reread
sudo supervisorctl update
sudo supervisorctl start fastapi

์ด์ œ ์„œ๋ฒ„๊ฐ€ ์žฌ๋ถ€ํŒ…๋˜์–ด๋„ FastAPI ์•ฑ์€ ์ž๋™์œผ๋กœ ์‹œ์ž‘๋œ๋‹ค.


๐Ÿ“Œ ๋งˆ๋ฌด๋ฆฌํ•˜๋ฉฐ

Linux ๊ธฐ๋ฐ˜์˜ ์˜จํ”„๋ ˆ๋ฏธ์Šค ํ™˜๊ฒฝ์—์„œ FastAPI ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ฐฐํฌํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋‹ค์–‘ํ•˜์ง€๋งŒ, ์šด์˜ ํ™˜๊ฒฝ์— ์ ํ•ฉํ•œ ๊ตฌ์กฐ๋กœ ์•ˆ์ •์ ์œผ๋กœ ์‹คํ–‰๋˜๋„๋ก ๊ตฌ์„ฑํ•˜๋Š” ๊ฒƒ์ด ํ•ต์‹ฌ์ด๋‹ค. ๋‹จ์ผ Uvicorn ์„œ๋ฒ„๋ณด๋‹ค Gunicorn๊ณผ ์กฐํ•ฉํ•˜์—ฌ ๋ฉ€ํ‹ฐ ํ”„๋กœ์„ธ์Šค๋กœ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์ด ์ผ๋ฐ˜์ ์ด๋ฉฐ, Docker๋ฅผ ํ™œ์šฉํ•˜๋ฉด ์ด์‹์„ฑ๊ณผ ๋ฐฐํฌ ์ž๋™ํ™”๊นŒ์ง€ ๋…ธ๋ ค๋ณผ ์ˆ˜ ์žˆ๋‹ค.

FastAPI ๊ณต์‹ ๋ฌธ์„œ : https://fastapi.tiangolo.com/ko/

fastapi-logo,fastapi-๊ฐœ๋ฐœ-ํ™˜๊ฒฝ-์„ค์ •, fastapi-์•ฑ-๋งŒ๋“ค๊ธฐ, fastapi-๋ผ์šฐํŒ…, fastapi-request-response, fastapi-์˜ˆ์™ธ-์ฒ˜๋ฆฌ, fastapi-mysql-์—ฐ๋™, fastapi-๋ฐฐํฌ