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;
4. 배포시 주의할 점
🎈 소스가 변경되면 gunicorn reload 해줘야 한다.
$ systemctl daemon-reload
$ sudo systemctl restart gunicorn
계속해서 start 가 안 되고 run 폴더 내에 sock 파일이 생기지 않는데, 메인 app의settings.py를 수정한 적이 있었다면
다음 명령어를 입력한다.
(venv) touch settings.py