본문 바로가기

웹/Django

aws 에 배포하기

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 -/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