지금까지는 개발용 서버를 켜서 배포를 했다면, 실제로 배포용 서버를 설정하고 배포해보자. 이 글은 개념설명이 빠진 실제 배포 과정만 다룰꺼다.
$> sudo apt-get install nginx
원하는 DNS 서비스에서 DNS를 등록할 수 있다. 그냥 일반 IP로 돼있는 주소에는 HTTPS 인증서 적용이 안되므로, HTTPS 적용을 위해선 도메인과 DNS 서비스가 필요하다. 나의 경우 무료 DNS 서비스인 DuckDNS를 사용했다.
"원하는 도메인" 자리에 자기가 원하는 도메인을 적고, current ip 아래에 우리가 생성한 Ubuntu 서버의 외부 ip를 적으면 DNS 연결이 된다.
그러면 사용자가 내도메인.duckdns.org
에 요청을 보내면 그 요청이 그대로 내 서버 외부 IP로 전달이 된다.
이제는 서버를 실제로 설정하고 실행할 차례이다. 우선 Gunicorn을 먼저 실행하자.
나의 경우에는 django와 gunicorn을 비롯한 모든 패키지들을 가상환경에 설치했기 때문에, 가상환경의 경로에서 gunicorn을 실행해야 했다.
이 내용을 /etc/systemd/system/gunicorn.service
에 작성하자.
[Unit]
Description=gunicorn daemon
After=network.target
[Service]
User=therealjamesjung
WorkingDirectory=/home/therealjamesjung/JIM_backend/
Environment="MY_SECRET_KEY=mysecretkey"
Environment="DB_PASSWORD=mydbpassword"
ExecStart=/home/therealjamesjung/.local/share/virtualenvs/JIM_backend-6gYhw2_b/bin/gunicorn \
--workers 3 \
JIM.wsgi
[Install]
WantedBy=multi-user.target
이 것은 systemctl으로 gunicorn이라는 서비스를 등록해서, 서버가 항상 켜져있도록 하는 설정파일이다. 하나하나 설정해보자
SECRET_KEY = os.environ.get('MY_SECRET_KEY')
을 적용하고 싶은 값을 여기에 적으면 된다. 나의 경우 PostgreSQL에 접속할 비밀번호도 여기에 작성했다./home/therealjamesjung/.local/share/virtualenvs/django-app-venv/bin/gunicorn
이였는데, 자신의 경로를 잘 찾아서 확인하자! 잘 모르겠으면 가상환경을 실행한 다음 which gunicorn
하면 경로를 알려준다. 그 아래 --workers 3는 자신이 원하는 설정으로 해주면 되고, 실행하려는 django 앱의 wsgi 파일을 지정해주면 된다.이 내용을 저장한 다음 이 명령어들을 해주자.
$> sudo systemctl start gunicorn
$> sudo systemctl enable gunicorn
start는 방금 설정파일을 실행한다는 것이고, enable은 서버가 꺼졌다가 켜져도 알아서 실행하게 만든다.
거두절미하고 바로 본론으로 가자
이 내용을 /etc/nginx/sites-enabled/django-app.conf
에 작성하자.
server {
server_name therealjamesjung.duckdns.org;
location /static/ {
root /home/therealjamesjung/django-app;
}
location / {
include proxy_params;
proxy_pass http://127.0.0.1:8000;
}
}
/
로 들어오는 요청을 처리하는 내용이다. proxy 서버로서 작동하기 때문에 모든 요청을 gunicorn 서버가 듣고있는 http://127.0.0.1:8000
으로 라우팅해준다.이 내용을 저장한 다음 이 명령어들을 해주자.
$> sudo systemctl restart nginx
자 이제 마법을 부릴 시간이다. https://therealjamesjung.duckdns.org
으로 접속하면 우리가 알던 페이지가 나온다!
1번 글을 따라왔다면, 방화벽에서 8000포트를 열어줬을 것이다. 하지만 이제는 기본 HTTP/HTTPS 포트인 80번과 443번으로 들어오는 요청을 Nginx가 처리하기 때문에, 8000번 포트를 열고 8000번 포트로 접근할 필요가 없어졌다. gunicorn으로 서버를 열때도 0.0.0.0이 아닌 localhost로 실행한 이유도 이 떄문이다. 그래서 해당 방화벽 설정을 삭제해줘도 된다. 잘 모르겠고 일단 배포가 우선이라면 그냥 그대로 따라하고 방화벽 설정도 지우자!
Gunicorn Docs
Nginx Docs
Certbot 관련 포스팅
Certbot Docs
Digital Ocean 포스팅
systemd 관련 포스팅