[배포] 2.django nginx 설정하기(feat. uwsgi)

 



참고 링크
  • 아래 링크에서 설명해 준 내용을 요약해서 정리해보았다.
https://nerogarret.tistory.com/47?category=800142



시작 전
처음에 백엔드 테스트용으로 실행하느라 backend.conf/backend.ini로 설정했지만 파일명을 전부 원하는대로 바꿔도 됨. 

ex) backend.conf -> myproject.conf / 프로젝트명.conf 등
	backend.ini -> myproject.ini / 프로젝트명.ini 등



프로젝트 구조
test_aws
 └─ sub2
 	├─ frontend		# frontend project
 	
 	└─ backend			# backend project
    	├─ manage.py	# runserver 위치
        ├─ .config
        	├─ nginx
          	   └─ backend.conf
          	└─ uwsgi
        		├─ backend.ini
        		└─ uwsgi.service
        └─ backend
        	└─ wsgi.py




Django Nginx 설정하기

1. nginx 설치
$ sudo apt-get install nginx



2. /etc/nginx/nginx.conf 설정

앞선 과정에서 배포를 위해 생성한 deploy 계정을 nginx에 등록

$ sudo vi /etc/nginx/nginx.conf



i를 눌러서 맨 첫 줄 www-data -> deploy로 수정 후 :wq를 눌러서 저장+종료

image



3. 프로젝트 내 .config 폴더 아래에 nginx 폴더 생성, backend.conf 파일 설정
# 디렉토리 생성 위치 - test_aws/sub2/backend/.config/
$ sudo mkdir nginx

# backend.conf 파일 생성
# 파일 위치 - test_aws/sub2/backend/.config/nginx/backend.conf
$ sudo vi backend.conf
  • listen : 요청을 받을 포트 번호(80: http 기본 포트)
  • server_name : 요청받을 서버 주소 (앞에서 settings.py에서 ALLOWED_HOSTS에 등록했던 주소)
  • location / {} : 해당 주소(t3coach12.p.ssafy.io/)로 요청이 들어올 경우 처리할 내용
server {
	listen 80;
	server_name t3coach12.p.ssafy.io; # 여기에 팀 도메인 사용
	charset utf-8;
	client_max_body_size 128M;
    
    location /api/ {
        uwsgi_pass		unix:///tmp/backend.sock;
        include			uwsgi_params;
    }
}

image



4. .config/uwsgi/backend.ini 수정

.config/uwsgi/backend.ini에는 8080포트로 지정되어 있는데 위에서 포트가 80으로 변경되었기 때문에 .config/uwsgi/backend.ini 파일 수정 필요

기존 내용에서 http = :8080을 삭제하고 소켓 정보와 소유자, 권한을 서술한 세 줄 추가

# 위치 : ~test_aws/sub2/backend/.config/uwsgi
$ vi backend.ini

# 아래 세 줄 추가
socket = /tmp/backend.sock
chmod-socket=666
chown-socket=deploy:deploy

image



5. uwsgi가 백그라운드에서 항상 켜질 수 있도록 설정

Nginx는 항상 켜져있어야 함. uwsgi는 명령어를 통해 실행시켜 주어야 하는데, uwsgi와 nginx를 연결해야 한다면 uwsgi도 항상 백그라운드에서 켜져 있어야 한다.

∴ uwsgi를 백그라운드에서 계속 켜둘 수 있도록 설정 파일 추가


5-1. .config/uwsgi/uwsgi.service 생성

# 실행 위치 test_aws/sub2/backend/.config/uwsgi
$ sudo vi uwsgi.service


  • ExecStart : uwsgi를 관리자 권한으로 실행하기 위한 명령어

    각 파일, 디렉토리 경로들은 절대경로로 설정(안 될 경우 뒤쪽 프로젝트 경로 상대경로로 바꿔보기 - ex) /test_aws/sub2/backend/.config/uwsgi/backend.ini)

[Unit]
Description=uWSGI service
After=syslog.target

[Service]
ExecStart=/home/ubuntu/myvenv/bin/uwsgi -i /home/ubuntu/test_aws/sub2/backend/.config/uwsgi/backend.ini

Restart=always
KillSignal=SIGNOUT
Type=notify
StandardError=syslog
NotifyAccess=all

[Install]
WantedBy=multi-user.target

image



6. uwsgi.service 파일을 데몬(백그라운드에 실행)에 등록
6-1. /etc/systemd/system/에 링크 걸기

ln : 링크를 거는 ubuntu 명령어(양쪽 파일이 동기화 됨)

$ sudo ln -f ~/test_aws/sub2/backend/.config/uwsgi/uwsgi.service /etc/systemd/system/uwsgi.service


6-2. 데몬 새로고침
$ sudo systemctl daemon-reload


6-3. uwsgi 사용가능하게 변경 후 restart
$ sudo systemctl enable uwsgi
$ sudo systemctl restart uwsgi



7. Django 프로젝트 내 nginx 설정 파일 nginx 어플리케이션에 등록

cp 명령어를 이용해서 등록 경로(sites-available)로 파일을 복사해준다.

프로젝트 폴더 내 backend.conf 파일을 /etc/nginx/sites-available 폴더 안으로 복사

$ sudo cp -f ~/test_aws/sub2/backend/.config/nginx/backend.conf /etc/nginx/sites-available/backend.conf


7-1. sites-available에 복사된 설정 파일 sites-enables폴더 안에서도 링크 걸어주기
$ sudo ln -sf /etc/nginx/sites-available/backend.conf /etc/nginx/sites-enabled/backend.conf


7-2. sites-enables 폴더 내 default 파일 삭제
$ sudo rm /etc/nginx/sites-enabled/default


7-3. 데몬 새로고침, nginx, uwsgi 재실행
$ sudo systemctl daemon-reload && sudo systemctl restart uwsgi nginx


7-4. 주소 접속해서 확인
https://t3coach12.p.ssafy.io/api





프론트 배포 + Static 파일 설정

프로젝트 폴더 내 backend.conf 파일에 해당 내용을 추가해준다.

static 파일 경로가 nginx에서 설정되어 있지 않기 때문에 설정이 필요함.

아래 작업 이후 7 -> 7-1 -> 7-3번 과정 반복


1. settigns.py 제일 하단 STATIC_URL 밑에 아래 값 추가
# 위치 : test_aws/sub2/backend/backend/settings.py

$ vi settings.py 를 이용해서 편집, BASE_DIR은 프로젝트 폴더 절대 경로를 의미
STATIC_ROOT = os.path.join(BASE_DIR, 'static')


2. collectstatic

위에서 정해준 STATIC_ROOT 경로에 각 앱의 static 파일들 모아주기

# 실행 위치 : test_aws/sub2/backend
$ python3 manage.py collectstatic

# ls를 통해서 확인하면 static 폴더 생성되어 있음


3. backend.conf에 프론트 배포 설정 + static 파일 설정
# 프론트 배포 설정
location / {
	alias /var/www/html/dist;
	try_files $uri $uri/ index.html;
}

# 정적 파일 설정(css, js 같은 정적 파일들)
# 프로젝트 폴더(test_aws/sub2/backend 안에 static 폴더 연결)
location /static/ {
	alias /home/ubuntu/test_aws/sub2/backend/static/;
}

image