๐ ์ฝ 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/
