2018-07-05 TIL(Shell script작성해서 쉽게 배포하기, STATIC_ROOT 설정하기, 네트워크 동작 과정과 용어 설명)

  • 변수 할당
IDENTITY_FILE="$HOME/.ssh/FC-8th.pem"
USER="ubuntu"
HOST="ec2-13-209-21-2.ap-northeast-2.compute.amazonaws.com"
PROJECT_DIR="$HOME/projects/deploy/ec2-deploy"
SERVER_DIR="/home/ubuntu/project"
  • ssh 접속(start deploy) 명령어 변수 설정
CMD_CONNECT="ssh -i ${IDENTITY_FILE} ${USER}@${HOST}"
  • 이미 runserver가 실행중이라면 프로세스들을 모두 종료하기
${CMD_CONNECT} "pkill -9 -ef runserver"
  • 서버의 파일을 지움
${CMD_CONNECT} rm -rf ${SERVER_DIR}
  • 서버에 프로젝트 파일을 업로드
scp -q -i ${IDENTITY_FILE} -r ${PROJECT_DIR} ${USER}@${HOST}:${SERVER_DIR}
  • 서버 접속 후 SERVER_DIR로 이동, pipenv –venv로 가상환경의 경로 가져오기
VENV_PATH=$(${CMD_CONNECT} "cd ${SERVER_DIR} && pipenv --venv")
  • 가상환경의 경로에 /bin/python을 붙여 서버에서 사용하는 python의 경로 만들기
PYTHON_PATH="${VENV_PATH}/bin/python"
  • runserver를 background에서 실행해주는 커맨드(nohup)
RUNSERVER_CMD="nohup ${PYTHON_PATH} manage.py runserver 0:8000 &>/dev/null &"
  • 서버 접속 후, 프로젝트의 ‘app’폴더까지 이동한 후 runserver명령어를 실행
${CMD_CONNECT} "cd ${SERVER_DIR}/app && ${RUNSERVER_CMD}"

Deploy완료

STATIC_ROOT 설정하기

장고의 staticcollect를 통해서 .static에 모든 static file들을 한데 모을 수 있다.

settings.py에 STATIC_ROOT를 다음과 같이 설정해야한다.

ROOT_DIR = os.path.dirname(BASE_DIR)
STATIC_ROOT = os.path.join(ROOT_DIR, '.static')

작성 한 뒤에 ./manage.py collectstatic을 실행하면 루트폴더 아래 .static 폴더에 static file들이 수집된 것을 알 수 있다.

그러나 DEBUG = False일 때는 문제가 생긴다. 작동을 하지 않을 것이다. 왜냐하면 개발 모드일 때(DEBUG = True)만 static files를 연결해주는 STATIC_URL을 자동으로 지원해주기 때문이다. 배포과정에서 디버깅은 False가 되기 때문에 url에 /static/이 포함되었을 때 STATIC_ROOT 경로에서 파일을 리턴하도록 설정해야함(이 일에 특화된 것이 웹서버). 그 이외의 URL요청은 Django가 처리하도록함.

웹 서버와 웹 서버 애플리케이션

- WebServer(Nginx), WSGI(uWSGI)
Browser -> EC2 -> WebServer     -> (static)     -> STATIC_ROOT
                                -> (dynamic)    -> WSGI -> Django

- runserver
Browser -> EC2                               -> Django(runserver:8000)

- uWSGI
Browser -> EC2             -> uWSGI:8000     -> Django

- Nginx, uWSGI
Browser -> EC2 ->   Nginx  -> uWSGI:80       -> Django

EC2(Elastic Compute Cloud) : 한 대의 컴퓨터를 임대. 네트워크를 통해 제어함. 클릭 몇 번만으로 컴퓨터 한 대를 생성, 삭제를 쉽게 할 수 있다(elastic함).

NginX : 웹서버, 클라이언트가 HTTP 리퀘스트를 통해 리소스를 요청하면, 그 리소스를 그대로 보내주는 역할을 함. 정적인 파일을 반환함.

WAS : 웹 서버 위에 서버 어플리케이션을 얹은 것.

WSGI(Web Server Gateway Interface): 파이썬으로 제작된 웹 어플리케이션을 웹 서버와 연동하기 위한 ‘어댑터’ 성격의 미들웨어. 프로토콜 개념. 서버와 앱 양단으로 나뉘어져있음. WSGI 리퀘스트를 처리하려면 서버에서 환경정보와 콜백함수를 앱에 제공해야 한다. 앱은 그 요청을 처리하고 콜백함수를 통해 서버에 응답한다.

WSGI데몬은 자체적으로 프로세스를 생성하여 동작하면서 소켓 파일 또는 소켓 포트를 통해 웹 서버와 통신한다. uWSGI가 이에 해당함.

uWSGI : Python WSGI서버중에 한가지. Nginx를 웹 서버로 두므로서 static content는 Nginx server가 핸들링하도록 하고 나머지 request는 reverse proxying을 통해서 uwsgi에게 전달하여 사용하게 된다.

Comments