본문 바로가기

서버작업

5. django centOS7 설치

1. Django 설치

1-1) config 폴더 사용할 경우 (main app을 따로 안만드는 경우)

$ mkdir project_folder
$ cd project_folder
$ python3.9 -m venv venv # 파이썬 버전은 서버에 설치된 버전으로 지정

# 가상환경 진입
$ source venv/bin/activate

# pip 업그레이드
(venv) python -m pip install --upgrade pip

# 장고 설치
(venv) pip install django
# 버전 지정할 경우: pip install django==3.1.3 # 3.13이 버전

# 장고 프로젝트 생성 1 : main app 안 만들기
(venv) django-admin startproject config

1-2) main app 만들어서 사용할 경우 (✨이 방식으로 사용)

  ( PyCharm에서 사용하는 것처럼 인스톨용 장고프로젝트를 따로 만들어 줘야함)

# 1) 인스톨용 장고 프로젝트 폴더 생성 및 가상환경 설치
$ mkdir test
$ cd test
$ python3.9 -m venv venv  # 파이썬 버전은 서버에 설치된 버전으로 지정
$ source venv/bin/activate # 가상환경 진입

# test 폴더를 만들고, django install하는 이유는 새 프로젝트를 만들기위해서
# 해당 환경이 필요해서 잠시 사용하는 것(로컬도 마찬가지)

# 2) 장고 인스톨 
(venv) pip install django

# 3) 장고 인스톨용 프로젝트에서 벗어남
(venv) cd ../

#4) 실제 장고 프로젝트 생성 및 가상환경 설치
(venv) django-admin startproject projectName
(venv) cd projectName(새로만든 프로젝트로 들어감)
(venv) python -m venv venv

#5) 실제 서버 가상환경 진입
(venv) deactivate
$ source venv/bin/activate

#6) pip 업그레이드
(venv) python -m pip install --upgrade pip

#7) 장고 설치
(venv) pip install django
# 버전 지정할 경우: pip install django==3.1.3 # 3.13이 버전

#8) 장고 프로젝트 생성 2: main app 생성
(venv) django-admin startproject projectName

2) MariaDB 연결

pymysql 라이브러리 설치

(venv) pip install pymysql

__init___.py에 내용 추가 (Setting.py와 같은 디렉토리에 있는 파일)

import pymysql
pymysql.install_as_MySQLdb()

3) 프로젝트 설정 수정

# settings.py 수정

import os #추가

ALLOWED_HOSTS = ['*'] #수정

LANGUAGE_CODE = 'ko-kr' #수정
TIME_ZONE = 'Asia/Seoul' #수정

#수정
DATABASES = {
    'default': {
        # 'ENGINE': 'django.db.backends.sqlite3',
        # 'NAME': BASE_DIR / 'db.sqlite3',
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'db-name',  #데이터베이스 명
        'USER': 'db-user-name', # 아이디
        'PASSWORD': 'db-password', # 비밀번호
        'HOST': 'db-adress', #공백으로 냅두면 default localhost
        'PORT': 'port-number' #공백으로 냅두면 default 3306
    }
}

settings.py 끝에 내용 추가

STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'static_collection')

4) migration

manage.py 파일 있는 경로에서 실행

(venv) ./manage.py makemigrations
(venv) ./manage.py migrate

5) Static 데이터 모으기

manage.py 파일 있는 경로에서 실행

(venv) ./manage.py collectstatic

6) 테스트 서버 구동 및 접속 확인

(venv) ./manage.py runserver 0.0.0.0:8000

혹은

(venv) python manage.py runserver 0.0.0.0:8000

http://서버_아이피:8000/ 주소로 접속하여 내용이 잘 출력되는지 확인한다.

 

 

2. gunicorn 설치

https://wikidocs.net/76904#1-gunicorn

1) gunicorn 설치

(venv) pip install gunicorn

2) gunicorn 구동 테스트

(venv) gunicorn --bind 0:8000 config.wsgi:application
# config는 wsgi.py가 있는 폴더명

#[2021-11-08 10:57:03 +0900] [17698] [INFO] Starting gunicorn 20.1.0
#[2021-11-08 10:57:03 +0900] [17698] [INFO] Listening at: http://0.0.0.0:8000 (17698)
#[2021-11-08 10:57:03 +0900] [17698] [INFO] Using worker: sync
#[2021-11-08 10:57:03 +0900] [17700] [INFO] Booting worker with pid: 17700

http://서버_아이피:8000/ 주소로 접속하여 내용이 잘 출력되는지 확인한다.

3) 가상환경에서 나오기

(venv) deactivate

4) 서비스 등록 스크립트 생성

/etc/systemd/system/gunicorn.service 파일을 아래와 같은 내용으로 파일 생성

(ex. gunicorn_프로젝트명.service     -- 이렇게 작성시  sudo systemctl start 사용시 뒤에 이름 됨)

 

** 이미 있는 경우는 gunicorn2.service 등 파일명을 바꿔서 추가하면 됨

# 장고 프로젝트에서 config 폴더를 사용하는 경우
[Unit]
Description=gunicorn daemon
After=network.target

[Service]
User=root #수정필요
Group=root #수정필요
WorkingDirectory=/home/py_p1 #장고 프로젝트 경로
#경로 맞춰서 수정 필요 (py_p1  -- project위치 다르다면 위치도, config 부분 해당 프로젝트명으로 바꿔야함)
ExecStart=/home/py_p1/venv/bin/gunicorn --workers 3 --bind unix:/home/py_p1/run/gunicorn.sock config.wsgi:application

[Install]
WantedBy=multi-user.target
  • User: Gunicorn 서비스를 실행할 사용자 계정
  • Group: Gunicorn 서비스를 실행할 사용자 그룹
  • WorkingDirectory: django project의 manage.py가 위치한 경로
  • ExecStart: Gunicorn 서비스가 설치된 경로(가상환경에 설치하였으므로 해당 경로를 지정)
  • ExecStart의 —workers 옵션: 스레드 개수 입력 (통상 해당 서버 core * 2를 입력)
  • ExecStart의 —bind 옵션: unix:[sock 파일 생성 위치] [django project의 wsgi 파일 위치]
💜 gunicorn.service를 수정할 때마다 systemctl daemon-reload 해줘야 수정사항 반영됨

5) run 폴더 생성

위 서비스 파일에서 기재한 곳에 run 폴더 생성

cd 프로젝트폴더
mkdir run

6) gunicorn 서비스 등록

반드시 sudo 로 실행시켜야 run 폴더 안에 소켓 파일이 생성된다.

$ sudo systemctl start gunicorn
$ sudo systemctl enable gunicorn

7) gunicorn 서비스 구동 확인

$ sudo systemctl status gunicorn

** Trouble Shooting

구동 실패시 에러 로그는 /var/log/syslog에서 확인할 수 있다. (/var/log/message 에 있을 수도 있음)
Configuration file /etc/systemd/system/gunicorn.service is marked executable. Please remove executable permission bits. Proceeding anyway. 오류 발생 시, 파일 권한을 644로 변경
[/etc/systemd/system/gunicorn.service:9] Trailing garbage, ignoring. [/etc/systemd/system/gunicorn.service:10] Missing '='. 오류 발생 시. gunicorn.service 파일 내 ExecStart의 \ 를 삭제하고 모두 한 줄 처리할 것

 

3. nginx 설정

1) 사이트 설정 추가

/etc/nginx 경로에 sites-available, sites-enabled 폴더 없으면 미리 만들어줘야 함

 

/etc/nginx/sites-available/장고프로젝트명 파일

장고 프로젝트에서 config 폴더를 쓰든 main app을 쓰든 root 경로에 변함 없음

server {
        listen 80;
        server_name 128.199.161.10;

        location = /favicon.ico { access_log off; log_not_found off; }

        location /static/ {
                root /home/py_p1; #장고프로젝트 경로
        }

        location / {
                include proxy_params;
                proxy_pass http://unix:/home/py_p1/run/gunicorn.sock; #경로에 맞춰 수정
        }
}

2) 사이트 추가

$ sudo ln -s /etc/nginx/sites-available/장고프로젝트명 /etc/nginx/sites-enabled/

3) nginx 설정 검사 및 재기동

$ sudo nginx -t
$ sudo systemctl restart nginx

4) 방화벽 해제

$ sudo ufw delete allow 8000
$ sudo ufw allow 'Nginx Full'

5) nginx.conf에 sites-enabled 등록 **서버에 맨 처음 등록할 때만 해당

여기까지 했는데 접속 안 되는 경우 (ps -ef 확인 시, nginx가 nginx.conf를 이용하고 있는 경우) /etc/nginx/nginx.conf 에 아래 내용 추가 https://stackoverflow.com/questions/17413526/nginx-missing-sites-available-directory
$ ps -ef | grep nginx
include /etc/nginx/sites-enabled/*;

7) proxy_params 등록 **서버에 맨 처음 등록할 때만 해당

nginx: [emerg] open() "/etc/nginx/proxy_params" failed (2: No such file or directory) 오류
proxy_params가 없는 것이므로 새로 만들어줘야 함
vi /etc/nginx/proxy_params

# proxy_params 내용
proxy_set_header Host $http_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-Proto $scheme;

https://stackoverflow.com/questions/42589781/django-nginx-emerg-open-etc-nginx-proxy-params-failed-2-no-such-file

 

4. 배포시 주의할 점

🎈 소스가 변경되면 gunicorn reload 해줘야 한다.

$ systemctl daemon-reload
$ sudo systemctl restart gunicorn

계속해서 start 가 안 되고 run 폴더 내에 sock 파일이 생기지 않는데, 메인 app의settings.py를 수정한 적이 있었다면

다음 명령어를 입력한다.

(venv) touch settings.py

 

반응형