본문 바로가기
Django

Django http 도메인 주소로 설정하는 방법 총정리

by 뷰티풀스택 2023. 4. 7.
반응형

Django는 기본적으로 127.0.0.1:8000번으로 동작을 하는데 이것을 그대로 사용하면서도 서버에서는 80포트로 HTTPS로 연결되도록 하면 매우 매우 개발에 편리하다. 그것을 가능하게 하는 것이 Gunicorn, Nginx이다. https 서비스 설정은 이것까지 포함하면 블로그가 복잡해지니 다음 블로그로 나누어서 정리하도록 하겠다.

 

1. Django 주소와 포트 설정

  • ALLOWED_HOSTS는 크롬에서 접속할 때 쓰는 주소들을 다 나열한다고 생각하면 된다. 127.0.0.1이 기본으로 설정되어 있을텐데 개발할때 계속 사용할 것이기 때문에 그대로 두고, AWS 라이트세일 등의 서버의 고정 IP와 도메인 주소를 추가로 넣어주기만 하면 된다. 참고로, www.abc.com 처럼 www로 시작되는 서브도메인도 있다면 별도로 넣어 주어야 한다. 127.0.0.1을 localhost로 부르기도 하기 때문에 둘 다 넣어주어도 좋다.
ALLOWED_HOSTS = ['abc.com', '111.222.333.444', '127.0.0.1', 'localhost']

 

  • 방화벽 열기: 기본적으로 SSH 22 , Django 8000, HTTP 80, HTTPS 443, PostgreSQL 5432 들은 열어둔다.

2. Gunicorn 설정

  • Gunicorn Install
pip install gunicorn

 

  • 테스트로 가볍게 gunicorn이 정상적으로 Django와 잘 연결되지는 먼저 확인해본다. settings.py를 포함하고 있는 디렉토리를 바라보고 있는 디렉토리로 이동한다. 예를들어 website/settings.py 가 있다면 aaa bbb website ... 이렇게 현재 디렉토리에서 website 디렉토리를 바라보고 있는 위치를 말한다. 그렇게 이동했으면 아래와 같이 입력한다.
gunicorn --bind 0.0.0.0:8000 website.wsgi:application

정상이면 로그가 대체로 이렇게 나온다. pid가 생성되면 성공한 것이다.

정상 동작 로그

참고로, 실패하였으면 아래와 같이 Worker failed to boot 라는 메세지가 나올 것이다. 당황하지 말고 위에서 설명한 현재 디렉토리 위치와 프로젝트 이름을 다시 확인해서 재시도 하면 성공할 것이다.

실패 에러 로그

 

  • gunicorn socket과 service 파일 만들기: 여기서부터가 매우 중요하다!! 특히, 나도 처음에 블로그들 다 찾아봤었는데 아무리 해도 다 불안전하고 안되었다. gunicorn socket 파일 생성하는 것을 알려준 곳이 없어서 너무 고생한 적이 있었다. 아래 순서데로 그대로 꼭 작성하기 바란다. (블로그 쓰는 개발자분들!! 제발 직접 해보고 돌아가는지 확인하고 전 과정을 블로그에 남겨주기를 바랍니다! 제발~~ ㅠㅠ)
cd /etc/systemd/system
sudo vi gunicorn.socket

---- 입력내용 ----------
[Unit]
Description=gunicorn socket

[Socket]
ListenStream=/run/gunicorn.sock

[Install]
WantedBy=sockets.target
cd /etc/systemd/system
sudo vi gunicorn.service

-------- 입력 내용 -------------------------------
[Unit]
Description=gunicorn daemon
Requires=gunicorn.socket (조금전에 직접 만든 socket 파일 이름)
After=network.target

[Service]
User=ubuntu
Group=ubuntu
WorkingDirectory=/home/ubuntu/xxx/website  (장고 프로젝트 디렉토리)
ExecStart=/home/ubuntu/anaconda3/bin/gunicorn \
          --access-logfile - \
          --workers 3 \
          --bind unix:/run/gunicorn.sock \
          website.wsgi:application  (장고프로젝트이름.wsgi:application)

[Install]
WantedBy=multi-user.target

 

  • gunicorn 데몬 서비스 실행: start를 실행하면 지금부터 gunicorn 데몬이 시작되는 것이고, enable은 나중에 서버를 재부팅 하였을때에도 자동으로 gunicorn이 실행되도록 하는 의미이다.
sudo systemctl start gunicorn
sudo systemctl enable gunicorn
sudo systemctl status gunicorn

gunicorn 정상 로그

참고로, 이렇게 모든게 정상인데도 http://ip주소:8000 을 하면 Connection refused 에러가 생길 때가 있다. 이럴 때에는 gunicorn을 stop하고 python manage.py runserver 0:8000을 해보고 http://ip주소:8000 을 다시 확인해본다. 그런데 이때는 접속이 정상적으로 될때에는 gunicorn 서비스를 실행해 놓고 다음 단계인 Nginx 설정으로 넘어가라. 이 부분은 stackoverflow 등 어디를 찾아도 속시원한 답변을 얻기 어려울 것이다. 확실한 것은 장고는 정상적으로 동작하고 gunicorn도 정상적으로 설치가 잘 되었고 socket을 통해 gunicorn과 장고가 잘 연결되어 있는 모든 상황이 정상인 것이니 시간 허비하지 말고 다음단계로 넘어가기를 바란다. 개인적으로 너무 이부분에서 시간을 낭비한 경험이 있어서 이니 나 믿고 진행하기 바란다. Nginx를 설치하고 나면 모든 웹 접속이 잘 될 것이다.

 

3. Nginx 설정

우분투에서 Nginx를 설정해준다. gunicorn은 pip로 설치하였지만 Nginx는 우분투임을 기억하자

sudo apt-get update
sudo apt-get install nginx

-------------------
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following additional packages will be installed:
  fontconfig-config fonts-dejavu-core libfontconfig1 libgd3 libjbig0 libjpeg-turbo8 libjpeg8
  libnginx-mod-http-image-filter libnginx-mod-http-xslt-filter libnginx-mod-mail libnginx-mod-stream libtiff5
  libwebp6 libxpm4 nginx-common nginx-core
Suggested packages:
  libgd-tools fcgiwrap nginx-doc ssl-cert
The following NEW packages will be installed:
  fontconfig-config fonts-dejavu-core libfontconfig1 libgd3 libjbig0 libjpeg-turbo8 libjpeg8
  libnginx-mod-http-image-filter libnginx-mod-http-xslt-filter libnginx-mod-mail libnginx-mod-stream libtiff5
  libwebp6 libxpm4 nginx nginx-common nginx-core
0 upgraded, 17 newly installed, 0 to remove and 104 not upgraded.
Need to get 2436 kB of archives.
After this operation, 7919 kB of additional disk space will be used.
Do you want to continue? [Y/n]
  • 아무것도 수정하지 말고 sites-available로만 이동해서 장고 프로젝트 이름으로 아래와 같이 파일하나 생성해서 그대로 입력해준다. 영문/국문 블로그들 찾아보다보면 정말 다양한 버전의 각양각색의 스타일로 작성한 내용이 있는데 그것들 다 보고 실제 다 테스트해본결과 군더더기 다 들어내고 알아낸 결론으로는 아래와 같이 간결하게 작성할 수 있다. 알기어려운 옵션들 넣어서 디버그에 시간 허비하지 않으려면 나 믿고 아래와 같이 핵심만 입력하기를 바란다. 100% 성공 보장함.
cd /etc/nginx/sites-available
sudo vi website (파일 이름은 자신의 장고 프로젝트 이름으로 하면 됨)

--- 입력 내용---
server {
    server_name abc.com 111.222.333.444;

    location / {
        include proxy_params;
        proxy_pass http://unix:/run/gunicorn.sock;
    }
}
  • 그리고, 중요한 것은 sites-enable에도 파일을 생성해주어야 하는데 절대 sudo vi ... 이런 식으로 직접만들지 말고 링크로 생성해 주어야 한다. /etc/nginx/sites-enabled에서 확인해보면 아래와 같은 결과를 볼 수 있다.
sudo ln -s /etc/nginx/sites-available/website /etc/nginx/sites-enabled

  • 마지막으로 nginx 데몬을 재부팅해주면 모든게 끝난다. 이제부터는 도메인 이름이던  IP주소이던 뒤에 8000번 포트 없이 이름만으로 접속이 가능하다. http://abc.com or http://111.222.333.444 
sudo systemctl restart nginx
sudo systemctl status nginx

nginx 정상 로그

https로 설정하는 방법은 다음 글에서 정리할 예정이다.

반응형

댓글