Gunicorn
Gunicorn
운영 환경에서 FastAPI 서버를 구동하기 위해서는 AWS 터미널에서 다음과 같은 명령을 실행해야 한다.
$ uvicorn main:app --reload --host:0.0.0.0
하지만 터미널을 종료하면 FastAPI 서버도 종료된다. 따라서 이를 방지하려면 uvicorn 프로세스를 백그라운드로 실행해야 한다. Gunicorn을 사용하면 uvcorn 프로세스를 백그라운드로 실행할 수 있다. Gunicorn은 이외에도 여러 편의 기능들을 제공한다. 예를 들어 로깅, 서비스 시작, 중지 같은 것을 Gunicorn 서비스를 등록하여 쉽게 할 수 있다.
설치
Gunicorn은 서버 환경을 위한 도구이므로 로컬 환경에 설치할 필요는 없다. 서버 환경에만 Gunicorn을 설치한다. AWS 서버에 접속한 뒤 가상 환경에서 pip를 이용하여 Gunicorn을 설치한다.
$ pip install gunicorn
Gunicorn이 잘 동작한느지 간단한게 실행해 본다. 여러 명령을 입력해야 하므로 주의한다.
$ gunicorn --bind 0:8000 main:app --worker-class uvicorn.workers.UvicornWorker
명령을 조금 쪼개서 설명하면
--bind 0:8000
: 8000번 포트로 Gunicorn 서버를 실행한다.main:app
: Gunicorn이 호출하는 웹 애플리케이션은 main.py 파일의 app 객체라는 의미이다.--worker-class uvicorn.workers.UvicornWorker
: UvicornWorker를 사용하여 Gunicorn을 실행하라는 의미이다.
Gunicorn 소켓
Gunicorn은 앞에서 본 것처럼 포트를 이용하여 서버를 띄운다. 하지만 Unix 계열 시스템에서는 포트로 서비스하기보다는 유닉스 소켓(Unix Socket)을 사용하는 것이 빠르고 효율적이다. 이번에는 Gunicorn을 유닉스 소켓으로 서비스하는 방법을 알아본다.
현재 우리의 서버가 Unix 계열 시스템인 우분투이다.
다음과 같이 Gunicorn을 실행한다.
$ gunicorn --bind unix:/tmp/myapi.sock main:app --worker-class uvcorn.workers.UvicornWorker
명령을 보면 포트 방식으로 Gunicorin을 실행할 때와 다르다.
Gunicorn 서비스로 등록하기
이번에는 AWS 서버에 Gunicorn을 서비스로 등록해 본다. 그 이유는 Gunicorn의 시작, 중지를 쉽게 하고 또 AWS 서버를 다시 시작할 때 Gunicorn을 자동으로 실행하기 위해서이다.
서비스 파일 생성하기
Gunicorn을 서비스로 등록하려면 서비스 파일을 먼저 작성해야 한다. /etc/systemd/system/
디렉토리에 다음과 같은 내용의 myapi.service
서비스 파일을 생성한다. 다만 서비스 파일은 시스템 디렉토리에 저장해야 하므로 sudo nano myapi.service
명령처럼 관리자 권한(sudo)으로 파일을 생성해야 한다.
[Unit]
Description=gunicorn daemon
After=network.target
[Service]
User=ubuntu
Group=ubuntu
WorkingDirectory=/home/ubuntu/projects/myapi
ExecStart=/home/ubuntu/venvs/myapi/bin/gunicorn \ main:app \ --workers 2 \ --worker-class uvicorn.workers.UvicornWorker \ --bind unix:/tmp/myapi.sock
[Install]
WantedBy=multi-user.target
--worker 2
는 Gunicorn 프로세스를 2개 사용하라는 의미이다.
서비스 실행하고 등록하기
서비스 파일이 생서되면 다음 명령으로 서비스를 실행할 수 있다. 서비스 파일이 관리자 디렉토리에 있으므로 실행 역시 관리자 권한으로 실행해야 한다.
- AWS 터미널
$ sudo systemctl start myapi.service
서비스가 잘 실행되는지 확인하려면 sudo systemctl status myapi.service
명령을 실행하면 된다. 만약 다음과 같은 메시지가 나타나지 않으면 /var/log/syslog
파일에서 오류 원인을 확인하고 수정해야 한다.
(myapi) ubuntu@jumpto:/etc/systemd/system$ sudo systemctl status myapi.service
● myapi.service - gunicorn daemon
Loaded: loaded (/etc/systemd/system/myapi.service; enabled; vendor preset: enabled)
Active: active (running) since Thu 2022-10-20 19:59:18 KST; 18h ago
(... 생략 ...)
Gunicorn 시작, 종료, 재시작
- 시작
$ sudo systemctl start myapi.service
- 종료
$ sudo systemctl stop myapi.service
- 재시작
$ sudo systemctl restart myapi.service