System : Ubuntu 18.04
Nginx version : 1.14.0
uWSGI version : 2.0.20
1. AWS 프리티어
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를 사용하는 가상서버를 구축하자. 아까 예시로 사용했던 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를 다시시작하면 끝난다.
'프로그래밍 > 웹서버' 카테고리의 다른 글
[Django] 게시글에 이미지를 보여주기 위해 겪은 일 (1) | 2022.10.08 |
---|---|
[Jenkins] Publish Over SSH 설치 및 project 구성 (0) | 2022.04.11 |
[Jenkins] Github Pull Request Builder 설치 및 project 구성 (0) | 2022.04.11 |
[Jenkins] 설치 및 Github와 연동, Ngrok을 이용해 공인 Url받기 (0) | 2022.04.10 |
댓글