FastAPI, uvicorn, gunicorn

octofox·2021년 9월 14일
0

학습 시킨 인공지능 모델을 ec2에 올려야 했다.
파이썬으로 인공지능 개발을 시작했으니 그런김에 서버사이드도 파이썬으로 진행했다.

순전히 이미지를 base64로 받으면 그것이 어떤 이미지인지 알려주는, 화면이 필요없는 api 서버다.
그래서 django, flask를 제외하고 말그대로 fast한 fastAPI를 사용하기로 했다.

나는 nodejs와 php는 경험해 보았지만 python으로 서버를 올려보는 일은 처음이다.
여러가지 문제가 있었다.
파이썬 자체는 웹의 request를 받을 수 없었다. 그리고 스스로 프로세스와 스레드를 늘릴 수도 없었다. uvicorn과 같이 gunicorn을 사용하면 멀티스레드를 지원할 수 있다.

nginx를 입힐까 했는데 설정이 너무 복잡해진다. uvicorn을 실행하는 gunicorn을 실행하는 nginx. nginx는 또 unit이라는 새로운 기능을 fastapi와 추천한다. 파이썬 실행 파일에 도달하기 까지 3가지의 레이어를 거친다? 너무 바보 같다고 생각했다. 들렸다. 그리고 사람들은 또 도커를 이용하더라... 퓨...
이게 코딩을 하는건지...

Deploy Python APIs to the Web With Linux

위 링크가 가장 깔끔하고 쉬웠다.
마지막에서 nginx를 적용하지만 지금은 그냥 gunicorn까지만 적용했다.
gunicorn만 있어도 http request를 처리할순있지만, gunicorn에는 없고 nginx에는 있는 기능 때문에 남들은 둘을 연동해서 쓴다고 한다.

systemctl에서 백그라운드로 실행 가능하도록 하기

/etc/systemd/system/ai.service
[Unit]
Description=Gunicorn instance daemon to serve API
After=network.target

[Service]
User=<user>
Group=nginx
WorkingDirectory=/home/<user>/api
Environment="PATH=/home/<user>/api/apienv/bin"
ExecStart=/home/user/<user>/api/apienv/bin/gunicorn api:app -w 4 -k uvicorn.workers.UvicornWorker -b "0.0.0.0:5000"

[Install]
WanterBy=multi-user.target
sudo systemctl start ai.service
sudo systemctl enable ai.service
sudo systemctl status ai.service -l

서버의 발전

CGI: Common Gateway Interface
WSGI: Web Server Gateway Interface : 파이썬에서 앱이 웹서버와 통신하기위한 인터페이스
ASGI: Asynchronous Server Gateway Interface

profile
개발자라고 우기는 노답 소년

0개의 댓글