본문 바로가기

개발/Python

FastAPI 환경에서 Nginx 와 Uvicorn 을 통한 Deploy

+ Nginx 와 WSGI(Web Server Gateway Interface)/ASGI(Asynchronous Server Gateway Interface)를 같이 사용하는 이유 

- Nginx은 비동기로 외부의 작업연산(요청)을 listen하여 WSGI/ASGI로 전달 (nonblocking to, 더 많은 연산을 빠르게 처리)

(Apache는 연산 작업을 책임지고 수행(blocking io)하여 연산을 더 안정적으로 처리)

- WSGI/ASGI가 요청을 수행 (Event Driven)

- 이벤트 생성, 소비의 주체 분리 (Producer-Counsumer Pattern)

- Nginx가 Event loop에 등록한 작업연산(요청)들을 WSGI(ASGI)가 처리하고 결과를 응답하면 Nginx가 클라이언트에 결과 전달

 

+ Nginx와 WSGI를 같이 사용해야 하는 이유

- reverse proxy로 이용

ㄴ 웹 서버의 실체 보호 및 보안상 이점

ㄴ 실제 클라이언트의 요청 근원지는 Nginx만 확인 가능

ㄴ 프록시 정보가 아닌 실제 클라이언트 정보를 알기 위해서는 임의의 헤더 정보를 통해 전달 필요 

-  nginx의 다양한 성능 튜닝 

ㄴ 아키텍처 측면에서의 효율성 극대화 가능

ㄴ 로드밸런서, 로드분배 알고리즘 채택 가능

ㄴ proxy 활용 가능 

 

+ 요청 및 응답 전달 프로세스

- 요청: 클라이언트 > Nginx -- 프록시/숨김 > WSGI

- 응답: WSGI > Nginx -- 프록시/숨김 > 클라이언트

 

1. FastAPI 와 ASGI(Asynchronous Server Gateway Interface)인 Uvicorn 설치

pip install fastapi
pip install uvicorn

2. FastAPI 구동 테스트를 위한 main.py 작성 

from fastapi import FastAPI

app = FastAPI()

@app.get("/")
def root():
	return {'Hello':'World!'}

3. Uvicorn 으로 FastAPI 구동 확인

uvicorn main:app --reload

4. 브라우저에서 http://127.0.0.1:8000/에 접속 시 {'Hello':'World!'} JSON 응답 확인 가능

 

5. https://127.0.0.1:8000/docs(Swagger UI), https://127.0.0.1:8000/redoc(ReDoc UI) 를 통해 API 문서 확인 가능

 

6. Uvicorn Deploy 를 위한 Nginx 설치 

apt-get install nginx

 7. FastAPI 와 Nginx 연동을 위한 Nginx config 파일 작성 

# /etc/nginx/sitest-available/fastapi.conf

server {
	listen 80;
    server_name <your_ip/domain>
    
    location / {
    	include proxy_params;
        proxy_pass http://127.0.0.1:8000; # FastAPI 기본 포트 8000으로 proxy 연결
    }
}

8. sites-availabe 의 fastapi.conf 파일을 sites-enabled 에 심볼릭 링크 생성

- 실제 서버 구동 파일은 sites-enable 로 이동 필요하여 심볼릭 링크 통해서 연결

# 심볼릭 링크 생성
sudo ln -s /etc/nginx/sites-available/fastapi.conf /etc/nginx/sitest-enabled/fastapi.conf

9. Nginx configuration 테스트 

nginx -t

10. Nginx 서비스 시작 

sudo systemctl start nginx

11. uvicon 서비스 시작

uvicorn main:app -reload

 

반응형

'개발 > Python' 카테고리의 다른 글

sqlalchemy 2013: Lost connection to MySQL server during query 이슈 해결  (0) 2022.11.24
BeautifulSoup 4  (0) 2020.08.07
Selenium Locating Elements  (0) 2020.08.04