웹프로그래밍/Django

[Django] 웹서버, Nginx 사용하기

ssung.k 2020. 6. 19. 18:02

Django-WSGI-중-uWSGI를-통해-django-실행

 

[Django] WSGI 중 uWSGI를 통해 django 실행

django-AWS-EC2로-배포 [django] AWS EC2로 배포 Amazon EC2란? EC2란 Amazon Elastic Compute Cloud의 즐임말로서 AWS에서 제공하는 클라우드 컴퓨팅입니다. 이를 통해 하드웨어 구매없이 더 빠르게 애플리케이션..

ssungkang.tistory.com

저번 포스팅에서 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-enabledsites-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

 

이제 nginxuwsgi 는 백그라운드에서 동작하는 걸 확인할 수 있습니다.

sudo systemctl | grep nginx
// nginx.service loaded active running   A high performance web server and a reverse proxy server

 

소캣 통신

웹서버인 nginxuWSGI 사이의 통신을 매개 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하고 nginxuWSGI 를 restart해줍니다.

sudo systemctl daemon-reload
sudo systemctl restart nginx uwsgi

 

nginx/var/log/nginx/error.log 에서 에러 로그를 확인할 수 있습니다.

 

django-AWS-EC2로-배포

 

[django] AWS EC2로 배포

Amazon EC2란? EC2란 Amazon Elastic Compute Cloud의 즐임말로서 AWS에서 제공하는 클라우드 컴퓨팅입니다. 이를 통해 하드웨어 구매없이 더 빠르게 애플리케이션을 개발하고 배포할 수 있습니다. Amazon EC2를

ssungkang.tistory.com

저번 포스팅에서 80번 포트를 열어놨었기 때문에 DNS만으로 접속가능한 걸 확인할 수 있습니다.