참고사이트
Django EC2에 배포하기 - Gunicorn, Nginx 연결
AWS EC2, RDS, Gunicorn, Nginx를 이용해 배포하기
Django: Nginx
[Gunicorn] 프로젝트 배포 시 gunicorn WSGI 서버 사용하기 (오답노트)
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 설치
$ 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 파일 경로가 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;