사전 요구 사항
- Python, pip 설치 - https://co-no.tistory.com/entry/Python-RHEL9%EC%97%90%EC%84%9C-Python-311-%EC%84%A4%EC%B9%98-%EA%B0%80%EC%83%81%ED%99%98%EA%B2%BDvenv-%EA%B5%AC%EC%84%B1
- 내 환경의 경우, Python 3.11로 개발하였기 때문에 아래 문서 모두 Python 3.11, pip 3.11을 기준으로 한다.
0. 프로젝트에 대한 가상환경 활성화
gunicorn은 pip로 설치하는 Python 패키지이므로, gunicorn에서 띄우려는 애플리케이션(프로젝트)에 대한 가상환경을 구성한 후에 해당 가상환경을 활성화하도록 하자.
이 글의 예시에서는 배포하려는 애플리케이션의 이름을 ‘test_project’로 한다.
Python venv(가상환경) 활성화
# 'test_project'의 venv를 /apps/venvs/test_project 디렉토리에 이미 구성하였다고 가정한다.
source /apps/venvs/test_project/bin/activate
pip 최신화
그리고 pip 자체의 업데이트를 위해 다음 명령을 수행하자.
# 가상환경 안에서는 'pip3.11' 로 사용하지 않고, 'pip'로 사용해도 된다.
pip install --upgrade pip
venv 내의 pip 필요 패키지 설치
pip 업그레이드도 되었으니, 이제 배포하려는 프로젝트에서 사용하는 패키지들을 서버 내 가상환경에 설치해주어야 한다.
# 가상환경 활성화 된 상태로 진행
# 개발자가 requirements.txt 를 줬다고 가정
pip install -r requirements.txt
가상환경에 flask와 관련 패키지 설치
pip install flask
pip install flask-migrate
pip install flask-wtf
1. gunicorn pip로 설치
# 'test_proejct' 가상환경이 activate 되어 있는 상태에서 수행
pip install gunicron
2. gunicorn 설치 및 동작 확인
2.1. gunicorn이 OS 상에서 어느 경로에 설치되어 있는지 확인
pip show gunicorn
→ 가상환경(venv)로 지정한 디렉토리 안에 gunicorn 또한 설치된 것을 확인할 수 있다.
2.2. gunicorn 정상 실행 확인
gunicorn 설치 경로로 이동
cd /apps/venvs/test_project/lib64/python3.11/site-packages
gunicorn 실행
gunicorn --bind 0.0.0.0:8000 [Flask 프로젝트명].wsgi &
- --bind 0.0.0.0:8000 : 모든 IP의 접속에 대해 허용하고, 8000번 Port로 gunicorn을 서비스한다.
- gunicorn 앞에 nohup을 붙이면, gunicorn을 실행시킨 SSH 세션이 끊어져도 gunicorn 서버(서비스)는 계속 On 상태가 된다.
2.3. 샘플 app을 gunicorn으로 구동
테스트 코드의 github 링크를 첨부하니, 이걸 사용해서 배포했을 때 정상적으로 페이지가 나타난다면, 일단 gunicorn 구동에는 문제가 없다고 보면 된다.
https://github.com/jjh2x/Flask_Sample_App
자 그럼 서버 환경에서 github의 위 샘플 코드를 받아와 보자.
# python 프로젝트 코드가 저장되는 디렉토리로 이동
cd /apps/projects
# Sample Flask Web App 프로젝트를 위의 예시와 맞추기 위해,
# 'test_project' 라는 이름으로 clone
git clone <https://github.com/jjh2x/Flask_Sample_App.git> test_project
클론이 완료되면 다음 명령어를 통해 아래 그림과 같은 결과를 확인할 수 있을 것이다.
ls
ls -al test_project/
gunicorn으로 샘플 앱 구동
github에서 받아 온 sample app은 ‘pybo’라는 이름으로 애플리케이션 팩토리가 정의되어 있다. (=init.py) 또한 해당 애플리케이션 팩토리 안에 ‘create_app()’ 이라는 함수가 정의되어 있다.
따라서 아래와 같이 gunicorn으로 해당 app을 구동하면 된다.
gunicorn --bind 0:8000 "pybo:create_app()" &
혹시 아래와 같은 페이지와 함께 sample app에 대한 접속이 되지 않는다면, 서버의 내부 방화벽에서 막고 있는 건 아닌지 확인이 필요하다. 필자는 테스트를 위해 내부 방화벽을 우선 다 내리고 진행하였다.
3. gunicorn의 로깅
우선 log가 쌓일 디렉토리를 만들기 위해 아래 명령어를 수행하자.
mkdir /apps/venvs/test_project/logs
이후 gunicorn 구동 시, --access-logfile, --error-logfile 플래그를 추가하여 다음과 같이 수행하면 된다.
gunicorn --bind 0:8000 --access-logfile /apps/venvs/test_project/logs/access.log --error-logfile /apps/venvs/test_project/logs/error.log
후.. gunicorn 하나 켜고 끄기 명령어가 너무 빡센 것 같다.
다음 포스팅에서 nginx와 gunicorn 연동 과정에서 gunicorn 서비스 파일도 만들 것이니, 일단은 임시로 위의 명령어를 사용하도록 하자…!
참고
https://velog.io/@yejin20/TILGunicorn-%EC%82%AC%EC%9A%A9-%EB%AA%85%EB%A0%B9%EC%96%B4
'Middleware > WSGI' 카테고리의 다른 글
[Gunicorn] logrotate, crond를 활용한 nginx와 gunicorn의 log 파일 관리하기 (1) | 2023.11.02 |
---|---|
[Gunicorn] gunicorn - nginx 연동 (1) | 2023.10.31 |
최근댓글