[Django REST framework] 인스타그램 클론코딩(9) - Gunicorn, Nginx

woownsgud·2022년 10월 7일

참고사이트

Django EC2에 배포하기 - Gunicorn, Nginx 연결
AWS EC2, RDS, Gunicorn, Nginx를 이용해 배포하기
Django: Nginx
[Gunicorn] 프로젝트 배포 시 gunicorn WSGI 서버 사용하기 (오답노트)

Gunicorn

Gunicorn 설치 (EC2서버의 가상환경에서)

$ pip3 install gunicorn

(프로젝트 폴더에서)

$ mkdir run
$ sudo chown ubuntu:www-data run

Gunicorn으로 서버 테스트

$ gunicorn --bind 0.0.0.0:8000 [장고프로젝트 이름].wsgi:application

브라우저에서 http://IP주소:8000/ 로 접속해서 잘 출력이 되는지 테스트
(저는 aws를 사용하기 때문에 IP주소에 퍼블릭 IPv4 DNS를 적었습니다.)

시스템에 Gunicorn 등록

$ sudo vi /etc/systemd/system/gunicorn.service

에디터에 들어가서 아래와 같이 적습니다.

[Unit]
Description=gunicorn daemon
After=network.target

[Service]
User=ubuntu
Group=www-data
WorkingDirectory=/home/ubuntu/[프로젝트 폴더 경로]
# EnvironmentFile=/home/ubuntu/myvenv/instaprj.env
ExecStart=/home/ubuntu/[가상환경 경로]/bin/gunicorn \
        --workers 2 \
        --bind 127.0.0.1:8000 \ # unix:/tmp/gunicorn.sock
        [프로젝트 이름].wsgi:application

[Install]
WantedBy=multi-user.target

저장한 후 나갑니다. (ESC -> :wq)

제대로 실행이 되는지 확인

$ sudo systemctl start gunicorn
$ sudo systemctl enable gunicorn
$ sudo systemctl status gunicorn

active 라고 뜨면 정상적으로 실행 완료

Nginx

Nginx 설치

$ sudo apt-get update
$ sudo apt-get install nginx

nginx 시작 및 상태 확인

$ sudo service nginx restart 
$ service nginx status



nginx 설정 추가 (nginx-gunicorn-django 연결)

$ sudo vi /etc/nginx/sites-available/[프로젝트 이름]

에디터에 들어가서 아래와 같이 적습니다.

server {
        listen 80;
        server_name [퍼블릭 IPv4 DNS];

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

        location /static/ {
                root /home/ubuntu/[프로젝트 폴더 경로];
        }

        location / {
                include proxy_params;
                proxy_pass http://127.0.0.1:8000; # http://unix:/home/tmp/gunicorn.sock;
        }
}


사이트 추가

$ sudo ln -s /etc/nginx/sites-available/[프로젝트 이름] /etc/nginx/sites-enabled

$ ls
default [프로젝트 이름]

sites-available 디렉토리에 들어가서 ls 명령어를 입력하면 default 설정 파일과 방금 만든 프로젝트 링크가 있을 겁니다.

문법검사 및 Nginx 재시작

$ sudo nginx -t
$ sudo systemctl restart nginx

마지막으로 AWS에 들어가서 80번 포트를 등록합니다.

원래 브라우저에 http://IP주소:8000/ 을 입력해서 접속을 했는데 이제 포트번호 없이 http://IP주소 로 들어갈 수 있습니다.


에러

아래와 같이 문법검사를 하다가 오류가 뜰 수 있습니다.

해결

$ sudo nano /etc/nginx/nginx.conf

들어가면 server_names_hash_bucket_size 64; 라고 주석처리가 되어 있는데, 저는 밑에 size를 128로 추가했습니다.

그리고 다시 문법검사를 해줍니다.

위와 같이 뜬다면 정상적으로 완료!


static 파일 연결

위에 그림과 같이 브라우저에 들어가보면 페이지를 꾸며주는 정적 파일이 로드되지 못한 것을 볼 수 있습니다. 이것은 static 파일 경로가 nginx에서 설정 되어있지 않기 때문입니다.
그래서 nginx에 따로 설정을 추가해줘야 합니다.

Django의 settings.py에서 STATIC_URL 밑에 아래의 소스코드를 추가합니다.

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

그리고, urls.py에서 urlpatterns 칸에 밑줄과 같이 추가해줍니다.

collectstatic을 통해 프로젝트 내에 흩어져 있는 static 파일들을 한군데에 모은 뒤 서버로 복사해줍니다.

EC2에 아래의 명령어를 입력합니다.
그러면 static 파일들이 모아진 것을 확인할 수 있습니다.

$ python manage.py collectstatic

165 static files copied to '/home/ubuntu/www/instaclone/static'.

nginx 설정 추가 창에 들어가서 location /static/ 마지막에 static/을 붙여줍니다.

$ sudo vi /etc/nginx/sites-available/[프로젝트이름]


다시 링크를 걸어주고 nginx를 restart하면 완료!

$ sudo ln -sf /etc/nginx/sites-available/[프로젝트이름] /etc/nginx/sites-enabled
$ sudo nginx -t
$ sudo systemctl restart nginx


에러

Nginx에 의해서 403 forbidden 이라는 에러가 뜰 수 있습니다.

해결

$ sudo nano /etc/nginx/nginx.conf

nginx.conf 로 들어가서 변경

user www-data; -> user root;

0개의 댓글