장고:리눅스에 올리기

학교의 모든 지식. SMwiki
Sam (토론 | 기여)님의 2020년 12월 22일 (화) 10:00 판 (gunicorn)
둘러보기로 이동 검색으로 이동

장고! 웹 프레임워크! 틀:장고

  1. 장고:개요
  2. 장고:웹페이지설계
    1. 장고:앱
    2. 장고:url
    3. 장고:model
      1. 장고:DB
      2. 장고:모델 필드
      3. 장고:모델의 변경
    4. 장고:view
      1. 장고:클래스형 뷰, 제네릭 뷰
      2. 장고:view 각종 기능
    5. 장고:template
    6. 장고:static. 정적파일 사용하기
      1. 장고:CSS 사용하기
      2. 장고:JS 사용하기
      3. 장고:글꼴 사용
      4. 장고:부트스트랩
    7. 장고:media. 미디어 파일 사용하기
  3. 장고:관리자페이지
  4. 장고:settings.py
  5. 장고:기능구현
    1. 장고:회원관리
    2. 장고:유저
    3. 장고:커스텀 유저
    4. 장고:소셜로그인
    5. 장고:입력받기
    6. 장고:저장된 내용 활용하기
    7. 장고:변수 내보내기
    8. 장고:글쓰기
    9. 장고:페이징(페이지나누기)
    10. 장고:답변쓰기(댓글쓰기)
    11. 장고:추천,즐겨찾기
    12. 장고:새글(최신글) 나타내기
    13. 장고:썸머노트 설치
    14. 장고:네비게이션 바 만들기
    15. 장고:검색기능
    16. 장고:카테고리 만들기
    17. 장고:사진 올리기
    18. 장고:파일 업로드
    19. 장고:이메일app 만들기
    20. 장고:매직 그리드
  6. 장고:웹서비스
    1. 장고:Git
    2. 장고:리눅스에 올리기
    3. 장고:우분투에 올리기(nginx 사용)
    4. 장고:도커로 올리기
  7. 장고:팁

개요

보통 개발은 윈도우에서, 서비스는 리눅스에서 하곤 한다.

기본 서버환경 구축

과정 방법
파이썬 설치
  1. sudo apt update
  2. sudo apt install --only-upgrade python3
  1. 업데이트 하고
  2. 설치 혹은 업데이트 한다.
가상환경 만들기 잠시! git으로 동기화된 디렉터리에 가상환경이 있을텐데, 이건 못써먹나? 실험해보자!
  1. sudo apt install python3-venv
  2. 가상환경을 만들고자 하는 디렉터리로 이동
  3. mkdir venvs
  4. cd venvs
  5. python3 -m venv mysite
  1. 가상환경 패키지 설치
  2. cd 명령어로 이동하지.
  3. 가상환경디렉터리를 만들고,
  4. 가상환경 디렉터리로 이동 후,
  5. mysite라는 이름의 가상환경 제작
첨언. pip freeze > requirements.txt 명령을 기입하면 가상환경에 설치된 것이 텍스트파일에 기록된다.

이후 서버에서 pip install -r requirements.txt 를 실행하면 그 안에 있는 걸 따라 그대로 설치해준다.

가상환경 실행
  1. cd bin
  2. . activate
  1. 가상환경 안의 bin으로 이동.
  2. 해당 경로에서 활성화. 그럼 프롬프트 왼쪽에 가상환경명이 뜬다.
가상환경 해제 아무데에서나 deactivate를 입력
장고 설치 가상환경을 실행한 상태에서..

pip install django

기본 베이스에서 설치하면 다른 사람들에게도 영향이 간다.

가상환경 자동 실행

매번 디렉터리로 들어가 activate를 치고 프로젝트 디렉터리로 돌아오는 건 굉장히 귀찮은 일이다. 다음과 같 쉘.sh 파일을 만들어보자.

#!/bin/bash

cd ~/프로젝트/프로젝트명 #프로젝트 디렉터리로 이동
. ~/vens/가상환경주소/bin/activate #가상환경 실행

쉘 파일 실행은 . 쉘.sh 로 가능하다.(. 띄고 파일명임에 유의)

이걸 alias에 등록하여 사용하면 참 간단하게 원하는 가상환경을 실행하고 작업공간으로 이동할 수 있다.(리눅스:alias 참조)

git 에서 받아오기

과정 방법
디렉터리만들기 프로젝트 디렉터리를 담을 공간을 만든다. ~/project 따위로.
받아오기 프로젝트 디렉터리를 둘 디렉터리 안에서

git clone https://저장소주소 프로젝트명

마지막에 프로젝트명을 붙여야 한다.

그러면 프로젝트디렉터리 안에 해당 프로젝트명의 디렉터리가 새로 생긴다.(복사된 것)

DB생성 프로젝트 디렉터리 안에서

python manage.py migrate

~/project/mysite 등 안에서.
서버구동 python manage.py runserver

받아오기

매번 변경사항이 생길때마다 위의 과정을 거치는 건 비효율적이다.

git pull 에서 아이디와 패스워드를 입력하면 변경사항을 반영한다.

매번 아이디와 패스워드를 치는 것도 귀찮다. 그럴땐 프로젝트디렉터리에서 git config credential.helper store 을 넣어주자.

호스트 설정

장고가 서버에서 서비스 될 때엔 Settings.py 안의 ALLOWED_HOSTS 항목을 설정해 주어야 한다.(아마 보안문제인듯)

그 안에 서버의 아이피를 기입한다.(도메인도 되는지 해보자.)

settings.py 분리

ALLOWED_HOSTS 안에 서버의 아이피를 기입했끼 때문에 localhost로 동작하지 못하게 된다. 이건 서버가 아닌, 작업PC에서 시범사이트를 돌리는 데 문제가 된다.

이를 방지하기 위해 세팅파일을 구분하여 로컬호스트로 동작할 때는 다른 파일로 서버를 동작시켜주어야 한다.

아래 읽기 전에;;

사실, settings를 분리해줄 것 없이, ALLOWED_HOSTS = ['id8436.iptime.org', '127.0.0.1'] 처럼 도메인을 벡터로 추가해주면 로컬과 서버에서 모두 사용할 수 있다.

분리해두면 하나를 수정했을 때 다른 하나를 또 고쳐야 되기도 하고.

그러나, DEBUG 등의 세팅을 위해선 분리해주는 게 좋긴 하다; -> 그래서 import를 사용해 덧씌운다!

로컬용 세팅파일 만들기

아무 이름이나 상관 없다. 만들고 싶은 곳에 로컬용 세팅파일을 만든다. 같은 경로에 만들면 찾기 쉽겠지.

내용은 다음과 같이.

기존 세팅파일의 임포트는  해준다. 그리고 아랫  추가.(아님, 그냥 아래  줄만으로도 되는지 실험해보자.)

from .settings import *

ALLOWED_HOSTS = []#세팅파일을 불러와,필요한 세팅만 덧씌운다.

세팅파일에선 DEBUG설정을 False로 해주어야 한다.

디버그 정보는 프로젝트에 관련한 중요 사항들로, 정보가 노출되지 않게끔 해야 한다.

로컬용 세팅파일로 서버 실행

기본적인 실행에선 settings.py를 통해 기본 세팅을 받지만, 이 파일을 바꾸어 서버를 실행하는 옵션이 있다.

python manage.py runserver --settings=config.로컬용세팅파일 #기존 세팅파일과 같은 경로에 있는 경우.

위와 같이 실행하면 새로 만든 파일을 세팅으로 받아 서버를 실행한다.

결과적으로 python manage.py runserver --settings=config.로컬용세팅파일 0:8000 형태로 작동시켜주면 된다.(리눅스라면 &을 붙이자. 백그라운드에서 실행하게끔)

0:8000은 8000번 포트로 모든 IP로부터 접속을 허용한다는 이야기.

nohup 을 사용한 지속작업

위처럼 실행시키면 터미널이 닫히거나 로그아웃하면 실행을 멈춰버린다. 이를 위해 nohup을 사용해

nohup python manage.py runserver --settings=config.로컬용세팅파일 0:8000 & 형태로 올리면 백그라운드에서 서버를 돌린다.

멈추기 위해선 종료해주어야 하는프로세스가 4개 정도 되어, killall python 을 입력하는 게 낫다.

서버 실행 자동화

파일명.sh 파일을 만들어보자.

위에서 설명한 가상환경 sh 파일에 python manage.py runserver 0:8000 --settings=세팅파일경로등 서버를 실행한다는 내용만 추가해주면 된다.


최종형태

.sh 파일을 다음과 같이 만들어주면 프로젝트디렉터리로의 이동과 가상환경 실행, 서버동기화, 실행까지 단번에 끝낼 수 있다.

#!/bin/bash

cd ~/projects/mysite
. ~/venvs/mysite/bin/activate
git pull
python manage.py makemigrations
python manage.py migrate
nohup python /home/id8436/projects/mysite/manage.py runserver 0:8000 --settings=config.service_settings &

주의

서버가 종료되지 않은 상태에서 터미널이 종료되면 서버 실행 시 Error : That port is already in use. 라는 에러가 뜬다.

이땐 killall python을 실행하고 서버를 실행하면 된다.(이거 말고 핀포인트로 종료하는 방법은 없나;;?

리눅스(우분투)에 올리기

wsgi.py 세팅

startapp 명령어를 통해 만든 세팅파일 디렉토리에 wsgi.py가 있다. 이 안에서 서버와 소통하기 위한 기본적인 세팅을 손볼 수 있다.

import os

from django.core.wsgi import get_wsgi_application

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'config.settings')

application = get_wsgi_application()

기본 형태는 위와 같다만, 내 글을 따라온 사람이라면... 운영용 세팅파일인 config.service_settings 로 바꾸어주어야 한다.

gunicorn

개요

파이썬 WSGI서버 중 하나.(파이썬을 웹서버와 중계하는 역할.)

runserver로 접속할 수 있음을 확인한 후 진행한다.

가상환경에서 pip install gunicorn 으로 설치해준다.

manage.py 가 있는 곳에서 gunicorn wsgi의 경로 를 입력해준다.(필자의 경우 gunicorn --bind 0:8000 config.wsgi:application )


--bind 0:8000은 모든 IP에서 8000번 포트로 들어오는 걸 허용한다는 의미.

이걸 입력해주면 [2020-12-19 23:41:50 +0900] [86493] [INFO] Starting gunicorn 20.0.4과 같이 뜬다.(해당 도메인으로 들어가보자. runserver로 진행한 것과 동일하게 뜰 것이다.)

유닉스 소켓으로 서비스하기.

유닉스 계열 시스템에선 포트방식보단 유닉스 소켓방식이 더 선호된다. gunicorn --bind unix:/tmp/gunicorn.sock config.wsgi:application

소켓방식으로 띄우면 단독으로 gunicorn 테스트는 불가.

nginx

설치.

sudo apt install nginx

일반적인 설정파일의 경로는 다음과 같다. /etc/nginx/sites-enabled

/etc/nginx/sites-available/ # 여기서 하는 게 더 일반적인건가;;?? 둘 다 있는데?

하여간, 이동해서, cd /etc/nginx/sites-available/

이 안에서 mysite 등의 파일을 만든다.

sudo nano mysite


/etc/nginx 의 nginx.conf 건들어보자. sudo nano /etc/nginx/nginx.conf 형태로.

apache와 연동

mod_wsgi 설치.

과정 설명 방법
httpd 설치 확인 httpd가 설치되어있는지 확인. sudo httpd -V

runserver는 사실 개발용 기능이다. 웹 서버에 올리기 위해선 아파치 같은 웹서버용 소프트웨어를 실행시켜야 한다.

가상환경에서..

Nginx