본문 바로가기
프로그래밍/웹서버

AWS 프리티어 + Nginx + uWSGI + Django 설치

by 오답노트의 주인 2022. 4. 6.
System        : Ubuntu 18.04
Nginx version : 1.14.0
uWSGI version : 2.0.20

1. AWS 프리티어

https://velog.io/@juwon9733/AWS-EC2%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%9C-%EC%84%9C%EB%B2%84-%EA%B5%AC%EC%B6%95Ubuntu-18.04

 

AWS EC2를 이용한 서버 구축(Ubuntu 18.04)

aws 서비스를 이용하기 위해서, 일단 회원가입 절차를 진행해준다.처음 가입하면 12개월 동안 프리이터 서비스 내에서 무료로 사용이 가능하다.Amazom EC2서비스는, 가상 서버를 구축하고 보안 및

velog.io

Ubuntu 18.04를 선택, 서버 스토리지를 30GB로 설정, 보안 그룹은 5432(postgresql), 80(http), 443(https)를 열어주었다.

 

탄력적 IP도 하나 받아 인스턴스에 연결했다. 만약 도메인을 가지고 있다면 이 IP를 레코드에 추가하면 도메인으로 접근하게 된다.

 

 

2. Nginx

먼저 패키지를 모두 업데이트한 다음, nginx를 설치한다.

sudo apt-get update
sudo apt-get upgrade
sudo apt-get install nginx

그다음에 방화벽을 열어준다.

ufw allow "OpenSSH"
ufw allow "Nginx Full"
ufw enable

조금 전에 보안 그룹에서 포트를 열어주었는데, 방화벽도 열었기 때문에 http, https로 접근할 수 있다.

 

2.5 LetsEncrypt로 SSL 인증서 얻기

 

인증서를 얻는 방법에는 4가지방법이 있는데, standalone으로 진행하기로 했다. 상대적으로 과정이 간단하기 때문이다.

 

letsencrypt를 설치한다.

sudo apt-get install letsencrypt

standalone방식으로 인증받으려면 먼저 서버를 잠깐 종료해야한다. 이 점이 제일 큰 단점이지만 잠깐 껐다가 키는 정도는 괜찮은 서비스를 구축하기 때문에 상관이 없다.

systemctl stop nginx
sudo certbot certonly --standalone -d (내 도메인)

도메인이 mysite.com인 경우로 가정해서 진행할 때, 인증서 생성에 성공했다면 아래처럼 나온다.

Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator standalone, Installer None
Obtaining a new certificate
Performing the following challenges:
http-01 challenge for mysite.com
Waiting for verification...
Cleaning up challenges

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/mysite.com/fullchain.pem 
   Your key file has been saved at:
   /etc/letsencrypt/live/mysite.com/privkey.pem
   Your cert will expire on 2022-07-05. To obtain a new or tweaked
   version of this certificate in the future, simply run certbot
   again. To non-interactively renew *all* of your certificates, run
   "certbot renew"
 - If you like Certbot, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le

인증서 위치를 알려주는데, Nginx설정에 필요하기 때문에 잘 기억해두어야한다.

 

인증서도 유통기한이 있다. LetsEncrypt를 통해 만든 인증서는 90일이 지나면 만료된다. 그러므로 90일마다 갱신을 해야한다. 

 

내용을 더 읽어보면 인증서가 만료되는 날짜, 갱신을 위한 명령어를 볼 수 있다. 

 

우분투 내에서 특정한 시각마다 배치파일을 실행할 수 있는 도구인 crontab을 활용하여 아래 배치파일을 실행시키면 된다.

# /root/letsencrypt.sh
!/bin/sh
systemctl stop nginx
certbot renew> /var/log/letsencrypt/le-renew.log
fuser -k 80/tcp
systemctl start nginx

 

crontab에 이렇게 등록해두면 매월 15일 23시 0분에 스크립트가 실행된다.

 

crontab -e로 에디터를 열고 아래처럼 입력한다. 경로가 맞는지 다시 한 번 확인한다.

0 23 15 * * /root/letsencrypt.sh

저장하고나서 crontab -l를 입력했을 때 저장한 내용이 뜨는지 확인하고 service cron start로 crontab을 실행시켜둔다.

 

https://happist.com/548924/%EC%9B%8C%EB%93%9C%ED%94%84%EB%A0%88%EC%8A%A4-tips-lets-encrypt-%EB%AC%B4%EB%A3%8C-ssl%EC%9D%B8%EC%A6%9D%EC%84%9C-%EB%B0%9C%EA%B8%89-%EB%B0%8F-%EC%9E%90%EB%8F%99-%EA%B0%B1%EC%8B%A0#4_Lets_Encrypt_injeungseo_jadong_gaengsin

 

 

 

이제 인증서도 있겠다, https를 사용하는 가상서버를 구축하자. 아까 예시로 사용했던 mysite.com을 계속 사용하겠다.

 

/etc/nginx/sites-available/내에 mysite.com.conf 파일을 생성해 구축한다.

# /etc/nginx/nginx/sites-available/mysite.com.conf
server {
    listen      80;
    server_name mysite.com;
    return 301 https://$server$request_uri;
}

server {
    listen      443;
    server_name mysite.com;
    charset     utf-8;

    client_max_body_size    64M;
    client_body_buffer_size 64M;

    ssl                 on;
    ssl_certificate     /etc/letsencrypt/live/mysite.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/mysite.com/privkey.pem;

    location / {
        root /usr/share/nginx/html;
    }

    access_log /var/log/nginx/mysite.com/access.log;
    error_log /var/log/nginx/mysite.com/error.log;
}

설정을 완료했다면 access_log와 error_log가 저장될 폴더를 만들어준다. 그후 sites-enable폴더에 심볼릭 링크로 연결시켜두면 Nginx에서 자동으로 갖고온다.

sudo mkdir /var/log/nginx/mysite.com
sudo ln -s /etc/nginx/sites-available/mysite.com.conf /etc/nginx/sites-enable

Nginx를 실행하기 전에 실행에 문제가 있는지 확인한 다음에 실행한다.

nginx -t
systemctl start nginx

 

 

 

3. uWSGI

python3 -m venv ./venv
pip3 install uwsgi

가상환경에 진입하지 않고 전역으로 uwsgi를 설치한다.

(가상환경에는 프로젝트 파일의 패키지들만 설치하여 깔끔하게 유지하자.)

 

uwsgi를 실행하면서 명령어 인수로 옵션을 줄 수 있는데, 매 실행할 때마다 긴 명령어를 치기 싫으니, 옵션파일을 만들자.

# /etc/uwsgi/sites/mysite.com.ini
[uwsgi]
uid     =   (사용자)
chdir   =   (장고 프로젝트폴더)
module  =   (wsgi.py의 경로, 보통 urls.py의 경로와 같음)
home    =   (가상환경폴더의 경로)
env     =   DJANGO_SETTINGS_MODULE=(장고 settings 파일의 경로)

master  =   true
vacuum  =   true
socket  =   /home/(사용자)/run/uwsgi.sock
logto   =   /home/(사용자)/logs/uwsgi.log
chown-socket    =   (사용자):(그룹)
chmod-socket    =   666
process =   5

설정파일을 보관하기위해 저 경로에다가 관리하기로 했지만 /etc/안에는 uwsgi폴더가 없다.

mkdir -p /etc/uwsgi/sites로 하위의 하위까지 한 번에 만들어주자.

 

이번에도 logto와 socket이 가리키는 폴더가 없어서 만들어주어야 한다.

mkdir /home/(사용자)/run
mkdir /home/(사용자)/logs

 

이제 설정파일도 만들었으니 uwsgi --ini (ini파일 위치)로 실행할 수 있지만... 서비스로 실행하자.

# /etc/systemd/system/uwsgi.service
[Unit]
Description=uWSGI Emperor
After=syslog.target

[Service]
ExecStart=/usr/local/bin/uwsgi --emperor /etc/uwsgi/sites/mysite.com.ini
# Requires systemd version 211 or newer
RuntimeDirectory=uwsgi
Restart=always
KillSignal=SIGQUIT
Type=notify
StandardError=syslog
NotifyAccess=all

[Install]
WantedBy=multi-user.target

이제 systemctl start uwsgi와 같이 이용할 수 있다. 이제 장고 프로젝트를 설치하면 끝난다.

 

4. Nginx virtual server config

uwsgi를 설치할 때 ini파일을 만들었었다. 그 곳에서 장고 프로젝트의 위치, 가상환경의 위치, wsgi.py의 위치, 장고 설정파일의 위치들을 설정했었는데, 설정한 위치에 장고프로젝트가 들어가도록 설치한다.

 

적절하게 연결되었다면 uwsgi와 nginx을 연결해야한다.

# /etc/nginx/sites-available/mysite.com.conf

server {
    listen  443;

    ...

    location / {
        include /etc/nginx/uwsgi_params;
        uwsgi_pass  unix:/home/(사용자)/run/uwsgi.sock;
    }
}

가상 서버 설정파일을 다시 열어 location부분을 수정하고 Nginx를 다시시작하면 끝난다.

댓글