ubuntu 환경
1.패키지 정보 업데이트
sudo apt-get update
2. 패키지 의존성 검사 및 업그레이드
sudo apt-get dist-upgrade
3. python3 패키지 매니저 설치
sudo apt-get install python3-pip
그리고 장고 설치
pip3 install django
4. 받을 프로젝트 파일 폴더 소유권 변경
sudo chown -R ubuntu:ubuntu /srv/
5. python3-venv 설치
sudo apt-get install python3-venv
6.가상환경 위치 변경 및 생성
$ cd ~
$ python3 -m venv myvenv
7.가상환경 활성화
$ source myvenv/bin/activate
그리고 git에서 불러오기
8.의존성 로드
$ pip3 install -r requirements.txt
Failed building wheel for uwsgi 이런게 나올 때
https://stackoverflow.com/questions/47868161/failed-building-wheel-for-uwsgi
에 따르면 ubuntu 에는 c 컴파일러가 없어서 나오는 오류라 한다.
sudo apt-get install gcc 를 하자
혹은
pip3 install wheel 를 하자
Python.h: No such file or directory 이런경우
sudo apt install python3-dev 를 하자
9. uwsgi 패키지 설치
pip3 install uwsgi
10. django 프로젝트와 uwsgi 서버 연결
uwsgi --http :[포트번호] --home [가상환경 경로] --chdir [장고프로젝트폴더 경로] -w [wsgi 모듈이 있는 폴더].wsgi
11. 그 다음에 다시 각자의 서버 주소로 접속
12. 배포용 계정 생성
sudo adduser deploy
13. 프로젝트 루트 하위에 .config/uwsgi 디렉토리 생성 그 후 프로젝트명.ini 를 생성
14. ini 파일에 다음의 내용 입력
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
[uwsgi]
chdir = /srv/프로젝트 명/
module = 프로젝트명.wsgi:application
home = /home/ubuntu/myvenv/
uid = 12.에서 만든 배포용 계정
gid = 12.에서 만든 배포용 계정
http = : 자신의 포트
enable-threads = true
master = true
vacuum = true
pidfile = /tmp/프로젝트명.pid
logto = /var/log/uwsgi/프로젝트명/@(exec://date +%%Y-%%m-%%d).log
log-reopen = true
|
cs |
15라인의 logto 는 로그를 저장할 폴더이다.
이 폴더는 만들어줘야 한다.
sudo mkdir -p /var/log/uwsgi/프로젝트 명
그리고 이 로그는 uwsgi 실행자인 deploy 의 소유여야 로그를 작성할 수 있다.
로그 폴더 전테를 deploy 소유로 변경하자
sudo chown -R deploy:deploy /var/log/uwsgi/프로젝트명
15. 그럼 다음과 같은 명령어로 실행이 가능하다.
sudo /home/ubuntu/myvenv/bin/uwsgi -i /srv/프로젝트명/.config/uwsgi/프로젝트명.ini
결과는 이렇게 나온다.
getting INI configuration from /srv/django-deploy-test/.config/uwsgi/mysite.ini
오류내용 확인을 하려면 여기로 가자sudo cat /var/log/uwsgi/mysite/2020-03-15.log
16.collect static
settings.py에
STATIC_URL ='/static/'
STATIC_ROOT = os.path.join(BASE_DIR,'관리대상 앱','static')
으로 해주자
그리고 python manage.py collectstatic 을 하자
17. secret key 를 따로 저장하자
django 프로젝트 내부 디렉토리에
sk/sk.text 를 만들고
secret key 를 복사하자
그 다음에 setting.py에서 다음과 같이 입력하자
with open(os.path.join(BASE_DIR,'sk','sk.txt')) as sk:
SERCRET_KEY = f.read().strip()
18.db 관한 변경
db.sqlite3 를 루트 디렉토리 하위의 db폴더(없으면 생성)에 두자
DATABASES = {
'NAME":os.path.join(BASE_DIR','db','db.sqlite3'),
}
그리고
chomod 777 db
chmod 666 db/db.sqlite3 를 하자
19. nginx 설치
sudo apt-get install nginx
nginx 사용하는 user가 deploy라고 명시해주자
sudo vi /etc/nginx/nginx.conf 에서 다음과 같이 입력하자
첫 줄에 www-data로 되어 있는 user를 deploy로
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
user deploy;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;
events {
worker_connections 768;
# multi_accept on;
}
http {
##
# Basic Settings
##
|
cs |
20. nginx 설정
/srv/프로젝트명/.config 하위에 niginx 디렉토리를 하나 만들자 그리고 그 하위에 프로젝트명.conf 설정파일을 만들자
그리고 다음과 같이 입력하자
1
2
3
4
5
6
7
8
9
10
11
|
server {
listen 80;
server_name *.compute.amazonaws.com;
charset utf-8;
client_max_body_size 128M;
location / {
uwsgi_pass unix:///tmp/프로젝트 명.sock;
include uwsgi_params;
}
}
|
cs |
2행의 listen 은 요청받을 포트 번호이다.
3행의 server_name 은 장고의 allowed host와 같은 느낌이다. 요청받을 주소를 나타낸다.
location / { }: "server_name/" 식의 요청이 들어올 경우, 처리할 내용에 대해서 정의한다.
예를들어 location /static/ {} 의 경우엔 "server_name/static/" 주소로 요청이 온다.
정적파일이 있는 경우에는 다음과 같은 내용을 6~7 사이에 추가하자
location /static/ {
alias root /home/static이 있는 디렉토리
}
21. uwsgi / 프로젝트명.conf의 재설정
uwsgi/프로젝트명.ini를 열어서 9~11 행을 추가하자
소켓 정보와 권한, 소유자를 뜻한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
[uwsgi]
chdir = /srv/프로젝트명/
module = 프로젝트명.wsgi:application
home = /home/ubuntu/myvenv/
uid = deploy
gid = deploy
socket = /tmp/프로젝트명.sock
chmod-socket = 666
chown-socket = deploy:deploy
enable-threads = true
master = true
vacuum = true
pidfile = /tmp/프로젝트명.pid
logto = /var/log/uwsgi/mysite/@(exec://date +%%Y-%%m-%%d).log
log-reopen = true
|
cs |
22.uwsgi 백그라운드 자동화
nginx 를 실행하려면 uwsgi도 실행되야 된다. 백그라운드에서 언제나 돌고 있게 만들자
uwsgi/uwsgi.service 를 만들자 그리고 다음과 같이 입력하자
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
[Unit]
Description=uWSGI service
After=syslog.target
[Service]
ExecStart=/home/ubuntu/myvenv/bin/uwsgi -i /srv/프로젝트명/.config/uwsgi/mysite.ini
Restart=always
KillSignal=SIGQUIT
Type=notify
StandardError=syslog
NotifyAccess=all
[Install]
WantedBy=multi-user.target
|
cs |
6라인을 보면 uwsgi 실행 구문을 확인 할 수 있다.
23. uwsgi를 데몬으로 실행하자
다음과 같이 입력하자
sudo ln -f /srv/프로젝트명/.config/uwsgi/uwsgi.service /etc/systemd/system/uwsgi.service
그리고 데몬을 재시작 해준다.
sudo systemctl daemon-reload
그 뒤에
uwsgi 서비스를 사용 가능하게 변경해주고
sudo systemctl enable uwsgi
restart 한 번 해주자
sudo systemctl restart uwsgi
그리고
django 프로젝트내의 nginx 설정 파일을 nginx 어플리케이션에 등록해야 한다.
sudo cp -f /srv/프로젝트명/.config/nginx/프로젝트명.conf /etc/nginx/sites-available/프로젝트명.conf
또 sites-enables 폴더 안의 default 파일을 삭제하자
sudo rm /etc/nginx/sites-enabled/default
그리고 재실행
sudo systemctl daemon-reload
sudo systemctl restart uwsgi nginx
24.collectstatic 관련 재설정
niginx는 우리의 static 파일 위치를 알지 못한다. nginx/프로젝트.conf에서 static 경로를 알려줘야한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
server {
listen 80;
server_name *.compute.amazonaws.com;
charset utf-8;
client_max_body_size 128M;
location / {
uwsgi_pass unix:///tmp/mysite.sock;
include uwsgi_params;
}
location /static/ {
alias /srv/프로젝트명/static/;
}
}
|
cs |
nginx.conf 설정이 바뀌었으니 다시 nginx에 등록을 해야한다. 재등록을 하자
sudo cp -f /srv/프로젝트명/.config/nginx/프로젝트명.conf /etc/nginx/sites-available/프로젝트명.conf
sudo ln -sf /etc/nginx/프로젝트명/프로젝트명.conf /etc/nginx/sites-enabled/프로젝트명.conf
그리고 nginx와 uwsgi를 껐다 켜주자
sudo systemctl daemon-reload
sudo systemctl restart uwsgi nginx
'웹 > Django' 카테고리의 다른 글
aws에 배포하기 -3 배포 자동화 (0) | 2021.06.16 |
---|---|
aws 에 배포하기 2 -rds , s3 (0) | 2021.06.15 |
Django 5. 클래스 뷰 (0) | 2021.05.13 |
Django 3. 화면이동과 view 와 template간의 폼 처리 (0) | 2021.05.13 |
Django 2. 프로젝트 뼈대 만들기 (0) | 2021.05.10 |