Deubot 프로젝트
Django와 Django Channels로 만든 앱을 배포하기 위해 검색을 한 결과 Nginx, Daphne, Gunicorn 세개의 서버로 구축하게 되었다. Deubot 프로젝트 구조를 간략하게 도식화하면 아래와 같다.
우선 Nginx 서버를 리버스 프록시 서버로 설정한 뒤 HTTP 요청은 Gunicorn 서버가 WS 요청은 Daphne 서버가 처리하도록 설정한다. Nginx 서버는 정적 컨텐츠를 제공하고 Gunicorn, Daphne 서버는 동적 컨텐츠를 제공한다.
Gunicorn 설정
1. Gunicorn 설치
pip install gunicorn
2. gunicorn 서비스 파일 생성 (서비스로 만듬)
sudo vi /etc/systemd/system/django-gunicorn.service
3. django-gunicorn.service 파일을 자신의 시스템에 맞게 수정
[Unit]
Description=django-gunicorn daemon
After=network.target
[Service]
User=ubuntu
Group=ubuntu
WorkingDirectory=/home/ubuntu/Deubot
ExecStart=/home/ubuntu/anaconda3/envs/Deubot/bin/gunicorn --access-logfile - --workers 3 --bind unix:/home/ubuntu/Deubot_env/gunicorn.sock deubot_project.wsgi:application
[Install]
WantedBy=multi-user.target
4. django-gunicorn 서비스를 시작하고 부팅 될때 자동시작 되도록 설정
sudo systemctl start django-gunicorn
sudo systemctl enable django-gunicorn
django-gunicorn 서비스 상태를 확인하고 오류가 나면 아래의 명령어로 프로세스 로그 확인
sudo systemctl status djangorest-gunicorn
sudo journalctl -u djangorest-gunicorn
Daphne 설정
1. Daphne 설치
channel를 설치할 때 daphne가 설치되어 있으므로 생략
2. supervisor 설치(supervisord 서비스가 daphne 프로세스를 데몬으로 위탁 관리하게 함)
sudo apt install supervisor
3. supervisor 설정파일 생성
cd /etc/supervisor/conf.d/
vi channels.conf
4. channels.conf 파일을 자신의 시스템에 맞게 수정
[fcgi-program:asgi]
# TCP socket used by Nginx backend upstream
socket=tcp://localhost:8000
# Directory where your site's project files are located
directory=/home/ubuntu/Deubot
# Each process needs to have a separate socket file, so we use process_num
# Make sure to update "mysite.asgi" to match your project name
command=/home/ubuntu/anaconda3/envs/Deubot/bin/daphne -u /run/daphne/daphne%(process_num)d.sock --fd 0 --access-log - --proxy-headers deubot_project.asgi:application
# Number of processes to startup, roughly the number of CPUs you have
numprocs=2
# Give each process a unique name so they can be told apart
process_name=asgi%(process_num)d
# Automatically start and recover processes
autostart=true
autorestart=true
# Choose where you want your log to go
stdout_logfile=/home/ubuntu/Deubot_env/log/asgi.log
redirect_stderr=true
5. 기타 명령어 수행 (명령어를 수행한 뒤 /run/daphe/에 sock 파일이 생성되야함)
sudo mkdir /run/daphne/
sudo chown ubuntu.ubuntu /run/daphne/
sudo supervisorctl reread
sudo supervisorctl update
6. 서버를 재부팅하면 /run/daphne 폴더가 지워지기에 영구적으로 만들어야함. /usr/lib/tmpfiles.d/daphne.conf 파일을 만들고 아래 내용 추가
d /run/daphne 0755 <user> <group>
Nginx 설정
1. Nginx 설치
sudo apt install nginx
2. Nginx 설정 파일들이 위치한 디렉터리로 이동
cd /etc/nginx/sites-available/
3. Nginx 설정 파일 생성
sudo vi deubot
4. Nginx 설정 파일(deubot)을 자신의 시스템에 맞게 수정
upstream ws_server {
server localhost:8000;
}
server {
listen 80;
server_name [서버 도메인 or IP 주소]
location = /favicon.ico { access_log off; log_not_found off; }
location /static/ {
alias /home/ubuntu/Deubot/.static_root/;
}
# WSGI
location / {
try_files $uri @proxy_to_app;
}
# ASGI
location /ws {
try_files $uri @proxy_to_ws;
}
location @proxy_to_ws {
proxy_pass http://ws_server;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Host $server_name;
}
location @proxy_to_app {
include proxy_params;
proxy_pass http://unix:/home/ubuntu/Deubot_env/gunicorn.sock;
}
}
5. Nginx 설정 파일 활성화
cd /etc/nginx/sites-enabled/
sudo ln –s /etc/nginx/sites-available/deubot (활성화 하고 싶은 파일을 링크로 관리)
6. Nginx 서버 재시작
sudo systemctl restart nginx
구축 완료!
만약 Nginx의 로그 경로를 재설정하려면 /etc/nginx/nginx.conf 파일의 log 경로를 수정한다.
또한 nginx -t 명령 수행 시 오류가 발생한다면 설정이 올바르지 않는 경우이므로 다시 재설정을 한다.
참고)
https://victorydntmd.tistory.com/265
https://channels.readthedocs.io/en/stable/deploying.html
'Infra > CI&CD' 카테고리의 다른 글
SpringBoot, Vue3 프로젝트 CI/CD (2) (0) | 2024.01.27 |
---|---|
SpringBoot, Vue3 프로젝트 CI/CD (1) (0) | 2024.01.26 |