Django 를 개발할때에는 python3 ./manage.py runserver
명령어를 통해 장고의 내장 서버를 작동시켜 쉽게 배포했다.
하지만 실제 prod 환경에서는 runserver로 배포하면 안된다. 그 이유는 테스트하거나 디버깅할때 사용되는 간단한 서버이다. 그리고 단일스레드여서 속도도 느리고 HTTPS도 사용하지 못한다.
그래서 wsgi(Web Server Gateway Interface) 서버를 사용해야한다.
wsgi에는 uwgi와 gunicorn이 있는데 더 간단하고 서버의 리소스를 적게쓰면서 빠른 gunicorn으로 서버를 구성했다.
nginx와 gunicorn으로 서버를 구상하면 이런 모습이 나온다.
1. Gunicorn
AWS ec2에 ssh로 접속한다.
pip install gunicorn
gunicorn을 설치한다.
프로젝트의 config파일에 wsgi.py 파일을 확인한다.
wsgi.py 대신 asgi.py 파일이 있을 수 있는데 이땐 직접 wsgi.py파일을 생성해준다.
"""
WSGI config for config project.
It exposes the WSGI callable as a module-level variable named ``application``.
For more information on this file, see
https://docs.djangoproject.com/en/5.0/howto/deployment/asgi/
"""
import os
from django.core.wsgi import get_wsgi_application
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'config.settings')
application = get_wsgi_application()
1.1 Gunicorn 테스트
gunicorn --bind 0:8000 config.wsgi:application
서버가 올라가고 정상적으로 접속이 된다.
1.2 Gunicorn 소켓
gunicorn --bind unix:/tmp/gunicorn.sock config.wsgi:application
이번엔 유닉스 소켓을 이용해서 서버를 열었다.
포트로 열지 않고 소켓으로 여는 이유는 여러가지가 있다.
여기서 사용하는 소켓은 네트워크 소켓이 아니라 유닉스 소켓이다. 유닉스 소켓은 IPC(Inter Process Communication)으로 머신 내부에서 프로세스들끼리 통신을 위한 소켓이다. 위 명령어에서는 /tmp/gunicorn.sock에 소켓을 열었다.
네트워크 소켓은 네트워크를 통한 프로세스간의 통신이다. 네트워크 소켓을 사용해서 동일한 호스트 내부에서 통신을 할 수도 있다. 하지만 네트워크 소켓으로 통신을 할 경우에는 여러 다른 네트워크단의 부가적인 작업들이 추가된다. 하지만 유닉스 소켓은 같은 호스트 내부에서 작동하는걸 알기 때문에 여러 작업들을 안하고 바로 통신을 할 수 있다. 그래서 유닉스 소켓이 더 가볍고 조금 더 빠르기 때문에 호스트 내부에서 통신하는 경우에는 유닉스 소켓을 사용한다.
이제 서버를 닫아주자.
1.3 Gunicorn 설정
일단 환경변수 파일에 환경변수 하나를 추가한다.
DJANGO_SETTINGS_MODULE=<프로젝트 설정파일>
그 다음으로 /etc/systemd/system/ 디렉토리에 gunicorn.server 파일을 추가한다. 서비스 이름은 마음대로 해도 된다.
[Unit]
Description=gunicorn daemon
After=network.target
[Service]
User=<유저>
Group=<그룹>
WorkingDirectory=<프로젝트 파일 경로>
ExecStart=<gunicorn 위치> \
--workers <프로세스 개수> \
--bind unix:<소켓 파일 위치 (/tmp/guncorn.sock)> \
config.wsgi:application # 설정파일
[Install]
WantedBy=multi-user.target
저장하고 나오면 서비스가 등록된 것이다.
systemctl start gunicorn
systemctl sutatus gunicorn
서비스를 시작하면 잘 실행되는걸 볼 수 있다. 에러가 발생하면 해결해야한다.
2. Nginx
nginx 설정도 간단하다.
nano /etc/nginx/sites-available/<서비스이름>
server {
listen 80;
server_name <ip>;
location / {
include proxy_params;
proxy_pass http://unix:<sock 파일 위치>;
}
}
ln -s /etc/nginx/sites-available/<서비스이름>
저장해주고 링킹 해주면 끝난다.
systemctl restart nginx
systemctl status nginx
에러가 발생하면
nginx -t
명령어로 문법을 검사해본다.
'django' 카테고리의 다른 글
Django - Trailing Slash (1) | 2024.12.02 |
---|---|
Django - DB Connection (0) | 2024.10.27 |
Django core - WSGI (1) | 2024.10.21 |
DRF Serializer (2) | 2024.09.18 |
Django ORM - Transaction (0) | 2024.08.06 |