서버환경에서 장고 Admin 을 사용하기위해 개발환경에서 한것처럼 슈퍼유저를 생성하자.

너무 쉬운 비밀번호로 생성하려하면 재확인 메세지가 나온다. 그리고 http://고정ip/admin 로 접속해보자.

Nginx가 장고 Admin 에서 사용하는 정적 파일을 제대로 읽지 못해서 이렇게 응답을 한다. 엔진엑스가 바라보는 정적 파일은 /home/ubuntu/projects/mysite/static 디렉토리에 위치해야 한다. 장고 어드민이 사용하는 정적파일들은 다른위치에 있다 이를 해결하기 위해 장고 환경설정 파일에 STATIC_ROOT 디렉토리를 설정하고 python manage.py collecstatic 명령을 수행해 관리자 앱의 정적 파일을 STATOC_ROOT 디렉토리로 복사해야 한다.

먼저 projects\mysite\config\settings\prod.py 파일에 STATIC_ROOT 항목을 추가하자.

BASE_DIR은 /home/ubuntu/projects/mysite 이다. 엔진엑스의 정적 파일위치를 /home/ubuntu/projects/mysite/static 디렉토리로 등록했기때문에 STATIC_ROOT 도 똑같이 설정해줘야한다.

그리고 STATICFILES_DIRS = [] 도 추가해준다. 추가해주는 이유는 base.py 파일에는 STATICFILES_DIR 항목이 이미 있는데 prod.py 에 다시 빈 값으로 설정하는 이유는 STATIC_ROOT 가 설정된 경우 STATICFILES_DIRS 리스트에 STATIC_ROOT 와 동일한 디렉토리 포함되어 있으면 서버 실행시 오류가 발생하기 때문이다. 이를 방지하기 위해 prod.py 파일에 STATICFILES_DIRS = [] 로 설정했다.

파일을 수정했기 때문에 git 에 커밋하자.

커밋 후 내려받자

git pull 로 내려받은 후 서버에 프로그램이 변경되었으므로 Gunicorn 을 재시작 하기위해 sudo systemctl restart mysite.service 명령을 해주자.

 

이제 python manage.py collecstatic 명령을 수행해 관리자 앱의 정적 파일을 복사하자.

yes 를 입력해 진행하면 복사가 성공되었다는 메세지가 출력된다. static 디렉토리로 이동 후 ls -l 로 확인해 보면 정적파일들이 다 있는것을 확인할 수 있다.

이제 정적파일들을 잘 찾을수 있기 때문에 어드민 로그인 페이지도 잘 로딩된다.

'Django > 따라하는 장고' 카테고리의 다른 글

41. logging(로깅)  (0) 2022.12.14
40. DEBUG(디버그)  (0) 2022.12.13
38. Nginx(엔진엑스)  (0) 2022.12.12
37. Gunicorn(구니콘)  (0) 2022.12.09
36. WSGI(위스키)  (0) 2022.12.09

웹서버는 브라우저의 정적 페이지 요청을 처리하고 동적 페이지 요청은 WSGI 서버를 호출하는 역할을 한다. 이번엔 파이보가 사용할 웹 서버인 Nginx 를 설치하고 적용해보자.

 

그리고 /etc/nginx/sites-available 디렉토리로 이동하자. 이 디렉토리는 Nginx의 설정 파일들이 위치한 디렉토리다. 최초 설치시에는 default 라는 설정파일만 존재한다. 해당 위치로 이동 후 sudo vi mysite 파일을 생성해 작성한다.

listen 80 은 웹 서버를 80포트로 서비스한다는 의미이다. HTTP 프로토콜의 기본포트는 80이다. 이제 http://고정ip:8000 대신 포트를 생략해 http://고정ip 만으로 접속할 수 있다.

server_name 에는 고정 ip 를 등록한다.

location /static 은 종적 파일에 대한 설정으로 /static 으로 시작되는 url 요청은 엔진엑스가 /home/ubbuntu/projects/mysite/static 디렉토리의 파일을 읽어서 처리한다는 설정이다.

location / 은 location /static 에서 설정한 것 이외의 모든 요청은 구니콘이 처리하도록 하는 설정이다. proxy_pass 는 동적 요청이 발생하면 해당요청을 구니콘의 유닉스 소켓으로 보내라는 설정이다.

한마디로 /static 으로 시작되는 url 은 엔진엑스가 나머지 url 은 구니콘이 처리하게 된다.

이제 작성한 mysite 파일을 Nginx 가 환경파일로 읽을 수 있도록 설정하자.

 

먼저 cd /etc/nginx/sites-enabled 디렉토리로 이동하자. 이 디렉토리는 site-available 디렉토리에 있는 설정 파일 중에서 활성화 하고 싶은 것을 관리하는 디렉토리 이다. ls 명령을 하면 현재 default라는 설정 파일만 링크되어있는데 default 를 삭제하고 mysite 파일을 링크하도록 변경해야 한다. 

sudo ln -s /etc/nginx/sites-available/mysite 로 링크한후 ls 로 확인해보면 링크 되어있다.

 

Nginx 설치할 때 자동으로 실행되므로 앞에서 작성한 엔진엑스 설정을 적용하려면 엔직엑스를 다시시작해야한다.

sudo systemctl restart nginx 를 해주자.

이제 http://고정ip 로 접속을해보자. 이제 주소 뒤에 :8000 을 안해도 된다.

정상적으로 잘 접속된다.

'Django > 따라하는 장고' 카테고리의 다른 글

40. DEBUG(디버그)  (0) 2022.12.13
39. 서버관리자  (0) 2022.12.12
37. Gunicorn(구니콘)  (0) 2022.12.09
36. WSGI(위스키)  (0) 2022.12.09
35. settings.py 분리  (0) 2022.12.05

없는 문제는 노력과 지능의 문제로 못풀거나 일부만 풀어 작성했습니다.

 

1. 다음과 같이 결측값이 포함된 데이터셋 ds를 생선한 후, 다음 문제를 해결하기 위한 R 코드를 작성하시오.

ds <- state.x77
ds[2,3] <- NA; ds[3,1] <- NA; ds[2,4] <- NA; ds[4,3] <- NA

 

3. R에서 제공하는 airquality 데이터셋에 대해 다음의 문제를 해결하기 위한 R 코드를 작성하시오.

 

4. R에서 제공하는 state.x77 데이터셋에 대하여 다음 문제를 해결하기 위한 R 코드를 작성하시오.

 

이번엔 WSGI 서버인 Gunicorn 을 설치하고 사용해보자. WSGI 서버는 대표적으로 Gunicorn 과 uwsgi 가 있다. 우리는 Gunicorn 을 사용할 것이다.

구니콘은 서버에 필요한 도구이므로 서버 환경에 설치하자. AWS에 접속한 뒤 pip install gunicorn 명령을 해 설치하자.

설치후 테스트해보자. gunicorn --bind 0:8000 config.wsgi:application 명령을 해보자

철자에 주의하자

/projects/mysite 디렉토리로 이동한 뒤 명령을 실행했다. 해석해보자면 --bind 0:8000 은 8000번 포트로 WSGI 서버를 수행한다는 의미이다. config.wsgi:application 은 WSGI 서버와 연결된 WSGI 어플리케이션은 config/wsgi.py 파일의 어플리케이션이라는 의미이다. 

http://고정IP:8000 으로 접속을 해보자.

이상하게 보일텐데 그 이유는 gunicorn 이 정적파일을 못읽었기 때문이다. 파이보는 bootstrap.min.css, bootstrap.min.js 등은 정적 파일인데 정적파일을 못 읽었기 때문이다. 일단 잘 작동하는것을 확인했으므로 control+c 로 구니콘을 종료하자.

 

구니콘은 포트를 이용해 서버를 띄울 수 있다. 아지만 Unix 계열 시스템에서는 포트로 서비스하기보다 유닉스 소켓을 사용하는 것이 빠르고 효율적이다. 이번엔 유닉스 소켓으로 서비스해보자. AWS 서버가 유닉스 계열 시스템인 우분투이다. 

이번엔 gunicorn --bind unix:/tmp/gunicorn.sock config.wsgi:application 명령을 했다. 잘 실행됬으니 종료하자.

 

AWS 서버에 Gunicorn 서비스로 등록해 보자. 구니콘의 시작, 중지를 쉽게 하고, 또 AWS 서버를 다시 시작할 때 Gunicorn 을 자동으로 실행하기 위해서이다.

먼저 환경변수를 수정하자.

/home/ubuntu/venvs/mysite.env 를 새로 만들고 작성하자.

vi 편집기로 작성했다.

내용 한줄만 작성하자. 그리고 /etc/systemd/system/ 디렉토리에 mysite.service 파일을 생성하자. 이 파일은 시스템 디렉토리에 저장해야 하므로 sudo vi mysite.service 같이 관리자 권한으로 작성해야 한다.

서비스 파일의 EnvironmentFile 항목이 우리가 작성한 환경 변수 파일을 사용하게 하는 설정이다. --workers 2 는 구니콘 프로세스를 2개 사용하라는 의미이다. 프로세스를 2개로 지정한 이유는 우리가 선택한 월 사용료 5달러 사양의 서버에는 이정도가 적당하기 때문이다.

 

이제 서비스를 실행해 보자. 서비스 파일이 관리자 디렉토리에 있으므로 실행 역시 관리자 권한으로 실행해야 한다.

sudo systemctl start mysite.service 명령을 해보자.

그리고 sudo systemctl status mysite.service 로 상태를 확인해보자. 다음처럼 잘 작동이 되지 않는다면 /var/log/syslog 파일에서 오류를 확인하고 수정하자.

마지막으로 AWS 서버가 다시 시작될때 구니콘이 자동으로 실행되도록 enabble 옵션을 추가해 서비스로 등록하자.

구니콘 서비스를 종료하려면 sudo systemctl stop mysite.service 

재시작 하려면 sudo systemctl restart mysite.service 명령을 하자.

'Django > 따라하는 장고' 카테고리의 다른 글

39. 서버관리자  (0) 2022.12.12
38. Nginx(엔진엑스)  (0) 2022.12.12
36. WSGI(위스키)  (0) 2022.12.09
35. settings.py 분리  (0) 2022.12.05
34. 파이보 오픈  (0) 2022.11.30

지금까지 python manage.py runserver 명령어를 이용해 내장 서버를 구동하는 방식을 사용했다.

이제는 WSGI(위스키) 를 이용해 서버를 연다. WSGI 를 이용하면 기능이 더 많아지고, 이용자가 몰릴경우를 더 효율적으로 처리할 수 있다.

 

먼저 웹브라우저, 웹서버의 작동방식을 알아보자. 웹브라우저가 웹서버에 요청하는 페이지는 크게 두 가지 이다. 정적 페이지, 동적 페이지.

정적 페이지는 css, js, jpg, png 같은 변하지 않는 동일한 값을 리턴하는 정적 파일을 요청하는 것이다. 동적 페이지는 파이보의 메인페이지인 http://<고정 ip:8000> 같은 페이지를 요청하는 경우이다. 파이보 메인 페이지를 요청하면 질문 목록을 데이터베이스에서 조회해 리턴하고 그 목록은 DB가 변할때마다 바뀐다. 이런것을 동적 페이지라고 한다.

웹 서버는 정적 요청과 동적 요청을 처리하는 서버이다. 웹서버는 대표적으로 Apache, Nginx 등이 있다. 파이보는 장고와 잘 어울리는 엔진엑스(Nginx)를 웹서버로 사용할 것이다. 웹 서버는 정적 페이지 요청이 들어오면 간단하게 정적 파일을 읽어 응답한다. 하지만 동적 페이지 요청이 들어온다면 웹서버는 파이썬 프로그램을 호출해 질문목록을 조회해 리턴하는 파이썬 프로그램을 호출해야 한다. 하지만 대부분 웹 서버는 파이썬 프로그램을 호출하는 기능이 없다. 그러므로 파이썬 프로그램을 호출하는 WSGI(web server gateway interface) 서버가 반드시 필요하다. 웹 서버에 동적 요청이 발생하면 웹 서버가 WSGI 서버를 호출하고, WSGI 서버는 파이썬 프로그램을 호출하여 동적페이지 요청을 대신 처리한다.

WSGI 서버에는 여러 종류가 있지만 파이보는 Gunicorn을 사용할 것이다. 웹서버에 동적 페이지 요청이 발생하면 WSGI 서버를 호출하고 WSGI 서버는 다시 WSGI 어플리케이션을 호출한다. WSGI 어플리케이션은 장고, 플라스크 등이 있다. 파이보 시스템이 사용할 WSGI 어플리케이션은 우리가 지금까지 공부한 장고이다. WSGI 서버는 항상 projects\mysite\config\wsgi.py 파일을 경유해 Django 프로그램을 호출한다. 

간단하게 정리하자면 사용자가 웹서버에 정적요청을 할 경우엔 간단하게 웹 서버가 정적 파일을 찾아 응답한다.

이번엔 사용자가 웹서버에 동적요청을 할 경우에는 WSGI 서버(Gunicorn)를 호출하고 WSGI 서버는 WSGI 어플리케이션인 django 를 호출하고 장고는 데이터베이스를 조회해 응답해준다.

'Django > 따라하는 장고' 카테고리의 다른 글

38. Nginx(엔진엑스)  (0) 2022.12.12
37. Gunicorn(구니콘)  (0) 2022.12.09
35. settings.py 분리  (0) 2022.12.05
34. 파이보 오픈  (0) 2022.11.30
33. 서버 접속 설정 및 프로그램  (0) 2022.11.30

+ Recent posts