일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- Git
- django widget
- django rest framework
- form
- web
- c++
- CSS
- js
- django ORM
- 파이썬 알고리즘
- AWS
- 알고리즘 연습
- 장고
- PYTHON
- 알고리즘 풀이
- es6
- DRF
- react
- 백준
- 알고리즘
- 알고리즘 문제
- 파이썬
- Django
- API
- Algorithm
- java
- Baekjoon
- javascript
- MAC
- HTML
- Today
- Total
수학과의 좌충우돌 프로그래밍
[Django] 웹서버, Nginx 사용하기 본문
Django-WSGI-중-uWSGI를-통해-django-실행
저번 포스팅에서 uWSGI
를 사용하여 django를 웹서버와 연결시킬 준비를 마쳤습니다.
이번 포스팅에서는 본격적으로 웹서버에 대해서 알아보도록 하겠습니다.
웹서버란
웹서버란 HTTP를 통해 웹 브라우저에서 요청하는 HTML 문서나 오브젝트(이미지 파일 등)을 전송해주는 서비스 프로그램을 말합니다.
웹서버도 여러 종류가 있어 웹서버마다 차이가 존재하겠지만 대체로 다음과 같은 기능들을 제공합니다.
- 인증
- 정적 콘텐츠 관리
- HTTPS 지원
- 콘텐츠 압축
- 가상 호스팅
- 대용량 파일 지원
- 대역폭 스로틀링
아파치, microsoft의 IIS, nginx 등 여러 웹서버가 있지만 여기서는 nginx를 사용해보도록 하겠습니다.
Nginx 설치
이제 Nginx
를 설치해봅시다.
AWS EC2 인스턴스에 접속한 후 설치 전 추가 설정을 해줍시다.
일반적으로 ubuntu 소프트웨어선테에서 다운로드 받을 수 있는 각종 패키지들은 최신 버전이 아닙니다.
따라서 PPA(Personal package Archive)를 통해 최신버전을 다운로드할 수 있습니다.
# PPA 추가를 위한 필요 패키지
sudo apt-get install software-properties-common
# nginx 안정화 최신버전 PPA 추가
sudo add-apt-repository ppa:nginx/stable
이제 nginx
를 설치해봅시다.
sudo apt-get install nginx
설치 후에는 버전을 확인하여 제대로 설치되었나 확인해줍시다.
nginx -v
Nginx 설정
nginx
를 설치하며 자동으로 생긴 nginx.conf 파일을 열어 유저 정보를 수정해줍시다.
# /etc/nginx/nginx.conf
user www-data;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;
nginx.conf는 nginx 관련 설정 파일입니다.
3번째 줄에 www-data를 유저의 이름으로 바꿔줍니다.
저는 ubuntu이므로 다음과 같이 바꿔주었습니다.
user ubuntu
다음으로 로컬 환경으로 넘어와서 다음과 같이 만들어줍시다.
# project/config/nginx/mysite.conf
server {
listen 80;
server_name *.compute.amazonaws.com;
charset utf-8;
client_max_body_size 128M;
location / {
uwsgi_pass unix:///tmp/mysite.sock;
include uwsgi_params;
}
}
- listen : 어느 포트로 들어오는 요청을 받을지 지정해줍니다.
- location : nginx로 들어오는 요청을
mysite.sock
이라는 파일을 통해uWSGI
로 넘겨줍니다.
다시 EC2 서버로 접속하여 추가적인 설정을 진행합시다.
로컬에서 방금 만든 mysite.conf를 /etc/nginx/sites-available/
에 복사해줍니다.
sudo cp -f /home/ubuntu/BackEnd/Django/project/config/nginx/mysite.conf /etc/nginx/sites-available/mysite.conf
sites-available
폴더는 가상 서버 환경들에 대한 설정 파일들이 위치하는 부분입니다. 가상 서버를 사용하거나 사용하지 않던간에 그에 대한 설정 파일들이 위치하는 곳입니다.
이제 sites-available
는 다음과 같습니다.
sites-available
├── default
└── mysite.conf
이제 sites-available
로 이동한 설정 파일을 sites-enabled
에 링크해줍니다.
sudo ln -sf /etc/nginx/sites-available/mysite.conf /etc/nginx/sites-enabled/
sites-enabled
는sites-available
에 있는 가상 서버 파일들중에서 실행시키고 싶은 파일을 symlink로 연결한 폴더입니다. 실제로 이 폴더에 위치한 가상서버 환경 파일들을 읽어서 서버를 세팅합니다.
그 후 불필요한 파일은 삭제해줍시다.
sudo rm /etc/nginx/sites-enabled/default
이로서 nginx의 설정은 완료했습니다.
uWSGI 설정
nginx
를 설치하고 설정을 완료했으니 기존의 uWSGI
가 nginx와 연결되도록 설정을 해주겠습니다.
nginx
는 백그라운드에서 실행이 되고 uWSGI
는 서버에 접속하여 직접 실행을 해줘야합니다.
이를 위해 다시 로컬로 넘어가서 아래 내용과 같이 파일을 생성합시다.
# project/config/wsgi/wsgi.service
[Unit]
Description=uWSGI service
After=syslog.target
[Service]
ExecStart=/home/ubuntu/myvenv/bin/uwsgi -i /home/ubuntu/BackEnd/Django/project/config/wsgi/wsgi.ini
Restart=always
KillSignal=SIGQUIT
Type=notify
StandardError=syslog
NotifyAccess=all
[Install]
WantedBy=multi-user.target
수정해줘야하는 부분은 8번째 줄입니다.
uwsgi
를 설치한 경로와 저번 포스팅에서 작성하였던 ini파일의 경로를 지정해줍니다.
다시 EC2 서버로 넘어와서 생성한 wsgi.service
파일을 /etc/systemd/system/
에 링크해줍니다.
sudo ln -f /home/ubuntu/BackEnd/Django/project/config/wsgi/uwsgi.service /etc/systemd/system/uwsgi.service
systemd는 일부 리눅스 배포판에서 유닉스 시스템 V나 BSD init 시스템 대신 사용자 공간을 부트스트래핑하고 최종적으로 모든 프로세스들을 관리하는 init 시스템입니다. systemd라는 이름 뒤에 추가된 d는 유닉스에서의 데몬(daemon)을 나타냅니다.
이로서 uWSGI
를 백그라운드에서 실행시킬 수 있습니다.
데몬을 리로드하고 uwsgi
데몬을 활성화해줍시다.
sudo systemctl daemon-reload
sudo systemctl enable uwsgi
이제 nginx
와 uwsgi
는 백그라운드에서 동작하는 걸 확인할 수 있습니다.
sudo systemctl | grep nginx
// nginx.service loaded active running A high performance web server and a reverse proxy server
소캣 통신
웹서버인 nginx
와 uWSGI
사이의 통신을 매개 HTTP 요청을 사용할 수도 있지만 서버 안쪽에서의 통신이기 때문에 socket 방식이 overhead가 적어서 더 효율적입니다.
따라서 이를 위한 설정을 해주도록 하겠습니다.
다시 로컬로 넘어와 wsgi.ini
파일을 수정해줍시다.
11~13줄에 http와 포트번호를 지정하는 방식에서 socket 설정으로 바뀌었습니다.
chown-socket
에는 유저의 이름을 기재해줍니다.
# project/config/wsgi/wsgi.ini
[uwsgi]
chdir = /home/ubuntu/BackEnd/Django/project
module = config.wsgi.debug:application
home = /home/ubuntu/myvenv
uid = ubuntu
gid = ubuntu
socket = /tmp/mysite.sock
chmod-socket = 666
chown-socket = ubuntu:ubuntu
enable-threads = true
master = true
vacuum = true
pidfile = /tmp/mysite.pid
logto = /var/log/uwsgi/@(exec://date +%%Y-%%m-%%d).log
log-reopen = true
이제 데몬을 reload하고 nginx
와 uWSGI
를 restart해줍니다.
sudo systemctl daemon-reload
sudo systemctl restart nginx uwsgi
nginx
는 /var/log/nginx/error.log
에서 에러 로그를 확인할 수 있습니다.
저번 포스팅에서 80번 포트를 열어놨었기 때문에 DNS만으로 접속가능한 걸 확인할 수 있습니다.
'웹프로그래밍 > Django' 카테고리의 다른 글
[Django] Model Field의 Null vs Blank (0) | 2020.08.06 |
---|---|
[Django] Django 2.2 mysql 8 버전 연동하기 (0) | 2020.08.02 |
[Django] WSGI 중 uWSGI를 통해 django 실행 (0) | 2020.06.19 |
[django] AWS EC2로 배포 (0) | 2020.06.09 |
[Django] Clickjacking Protection, 클릭 재킹 방지 (0) | 2020.05.06 |