django와 uwsgi 연동하기

uwsgi 사용해보기

nginx - uwsgi - django를 연동해서 배포하는 걸 AWS EC2를 통해 연습하고 있다. 그 중에서 어플레케이션 컨테이너라는 uWSGI를 사용하여 일단 nginx 없이 배포하는 걸 정리해보려고 한다.

uWSGI는 이름에서 보이듯이 WSGI라는 Web Server Gateway Interface의 역할을 한다. 웹 서버(Nginx, Apache)와 웹 어플리케이션 서버(WAS)의 사이를 연결해주는 것이다. django는 python으로 만들어진 프레임워크이기 때문에 nginx에서 들어오는 요청을 그대로 받아들일 수 없으며 uwsgi가 웹 서버와 WAS 사이에서 소통을 도와주는 것이다.

uWSGI는 WSGI 규격으로 만들어진 서버 중에 하나이며 Django와 자주사용되지만 gunicorn이라는 것도 있으니 참고하도록 하자.

uWSGI 사용하기

uwsgi를 꼭 django와 같은 웹 프레임워크와 사용해야만 하는 것은 아니며 일반 python 파일을 통해서도 테스트를 해볼 수 있다.

설치

pip를 통해 설치한다. 만약 시스템에 파이썬이 여러개 설치되어 있다면 파이썬 버전을 유의해서 살펴보자.

1
pip install uwsgi
테스트(with python file)

django와 연동하기 전에 python 파일과 연동해서 테스트를 해보자

1
2
3
4
# vi test.py
def application(env, start_response):
start_response('200 OK', [('Content-Type','text/html')])
return [b"Hello World"] # python3

위와 같이 test.py 파일을 생성한다. 그리고 uwsgi를 실행하기 위해 아래와 같이 쉘에 입력하자.

1
uwsgi --http :8001 --wsgi-file test.py

물론 test.py 파일이 있는 경로에 따라 알맞게 작성해주어야 한다. 두 가지 옵션을 넣었으며

–http :8001 => 8001번 포트로 연결

–wsgi-file => test.py 파일과 연결

와 같은 의미로 해석되어 작업을 수행한다. 현재 작업을 위해 연결되어 있는 컴포넌트들을 정리하면 아래와 같다.

1
web client <-> uwsgi <-> Django
Django과 연결

python 파일 말고 django 웹 서버와 연결하려면 기본적으로 제공해주는 wsgi.py를 이용하면 된다. 이 때에 옵션은 –wsgi-file이 아닌 –module을 주면 된다.

1
2
# uwsgi --http :<포트번호> --module <프로젝트명>.wsgi
uwsgi --http :8001 --module myproject.wsgi

웹 브라우저로 8001번 포트에 접속해서 제대로 동작하는 지 살펴보자. 제대로 동작하고 있다면 아래와 같은 순서로 통신을 하고 있는 것이다.

1
web clien <-> uwsgi <-> django

지금까지 가상환경을 실행하지 않은 상태에서 uwsgi를 쓰는 법을 알아보았다. 가상환경을 사용한다고해서 크게 바뀌는 부분은 없지만 다른 유용한 옵션에 대해서 알아보자.

uwsgi의 유용한 옵션들
1
uwsgi --http :8001 --home /home/test_user/virtualenv/test --chdir /home/test_user/myproject --module myproject.wsgi

–home과 –chdir 옵션이 추가되었다. 각 옵션들의 의미는 다음과 같다.

–http: 포트 번호 지정

–home: 가상환경 디렉토리 지정

–chdir: django 프로젝트의 경로

–module: django 프로젝트의 wsgi 지정

직접 쉘에서 uwsgi 명령어에 옵션을 추가해 주면서 실행하는 방법을 살펴봤는데 쉘에 길에 적어야 한다는 불편함이 존재한다. wsgi의 옵션들을 정리해 놓은 ini파일을 만들어서 실습해보자.

uwsgi를 위한 설정파일

하나의 서버에 여러 프로젝트를 실행할 수 있으므로 uwsgi를 위한 디렉토리를 생성한다.

1
mkdir -p /etc/uwsgi/sites

그리고 프로젝트 이름과 동일하게 설정파일을 추가하자.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# cd /etc/uwsgi/sites
# vi myproject.ini
[uwsgi]
home = /usr/bin/python3 # 가상환경을 사용하고 있다면 가상환경의 경로를 적어준다.
# home 옵션을 따로 적어주지 않으면 시스템에 깔려있는 파이썬을 사용한다
chdir = /home/test_user/myproject # Django 프로젝트의 경로
module = myproject.wsgi # Django 프로젝트를 생성하면 같은 이름으로 wsgi 모듈을 생성하기 때문에
# 프로젝트 이름과 동일하게 적어주면 된다.
http = :8001

socket = /home/test_user/myproject/myproject.sock # 소켓 파일이 저장될 경로와 이름 지정
chown-socket = test_user:test_user
chmod-socket = 660
vaccum = true # uwsgi 정지시에 자동으로 소켓 파일 삭제

master = true
processes = 1

정상적으로 저장이 되었다면 /etc/uwsgi/sites 폴더 아래에 myproject.ini 파일이 생성되었을 것이다. 이 설정파일로 uwsgi를 실행하자.

1
uwsgi -i /etc/uwsgi/sites/myproject.ini

8001번 포트로 접속해서 제대로 동작하는 지 확인하자!!


<참고> https://wikidocs.net/6611 https://wayhome25.github.io/django/2018/03/04/django-deploy-04-uwsgi/ https://cjh5414.github.io/how-to-deploy-django-uwsgi-nginx-in-ubuntu/ https://github.com/Tirrilee/TechTalk/wiki/Django-%EB%B0%B0%ED%8F%AC-(ubuntu16-uwsgi-nginx) http://recordingbetter.com/django/2017/06/29/Django-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8%EB%A5%BC-AWS%EC%97%90-%EB%B0%B0%ED%8F%AC%ED%95%98%EA%B8%B0-(%EC%A0%84%EC%B2%B4) https://wangin9.tistory.com/entry/centos7djangonginxuwsgi https://rainsound-k.github.io/deploy/2018/05/02/instance-setting-and-django-deploy-part2.html https://jaha01.tistory.com/12
Share

django에서 임시로 static file 서빙하기

임시로 static 파일 서빙하기

uwsgi를 이용하여 배포연습을 하던중 static 파일이 제대로 동작하지 않는 현상이 발생했다. 개발서버를 이용하지 않거나 settings.DEBUG=False인 상태에서 배포를 하게 되면 static과 media 파일에 대해서는 별도의 설정이 필요하다. 개발서버는 이용하지 않지만 임시로 개발서버에서 static file을 서빙하는 것처럼 하기 위한 설정을 알아보자.

development 환경에서 static file을 서빙하기 위한 임시 설정

프로젝트의 urls.py에 아래와 같이 추가해주면 된다.

1
2
3
4
5
6
from django.conf import settings
from django.conf.urls.static import static

urlpatterns = [
# ... url 경로
] + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)

조금 더 자세하게 기준을 얘기하자면 다음과 같다.

django의 static file을 다루는 방법

개발서버를 쓰고 debug=True

runserver(개발서버)를 사용중이며 settings.DEBUG=True라면 자동으로 static 파일에 대한 rule이 추가된다. 이는 단지 개발의 편의를 위함이다.

개발서버를 쓰지 않거나 debug=False

별도로 static 서빙을 설정해야한다.

static 파일을 서빙하는 방법

  1. AWS의 S3와 같은 클라우드 정적 스토리지 서비스 또는 CDN(Contents Delivery Network) 활용
  2. Apache / Nginx 웹서버 활용
  3. Django의 패키지 활용 - whitenoise 패키지
Share

CentOS의 yum 명령어 간단하게 알아보기

yum 명령어 정리

레드햇 계열 리눅스인 CentOS는 패키지를 관리하기 위해 yum이라는 명령어를 사용한다. yum은 Yellow-dog Updater Modified의 줄임말이며 RPM(Redhat Package Manager)을 통한 패키지 설치를 개선하기 위해 개발되었다.

yum에 대한 설정은 /etc/yum.conf에서 하고 있으며, /etc/yum.repos.d/ 디렉토리에 있는 파일에 지정된 서버주소로부터 패키지들을 설치하고 관리할 수 있다.

  • 설정파일 경로 : /etc/yum.conf

  • yum 레포지터리 파일 경로 : /etc/yum.repos.d/

    • 위의 디렉토리에 있는 각 파일은 yum 명령어를 실행했을때 해당 패키지를 검색하는 네트워크 주소가 있다.

또한 RPM보다 편리하게 의존성 관리를 할 수 있다.

사용법

기본 형태

기본적인 형태는 아래와 같다

1
2
# 옵션 - 명령어 - 패키지명 순으로 적는다.
yum <option> <command> <package_name>
패키지 설치

패키지를 설치하려면 다음과 같이하자.

1
2
# nginx 설치
yum install nginx

보통 패키지를 설치할때 필요한 용량과 계속해서 진행할 지 물어보는 과정이 있는데 -y 옵션을 주게되면 끊김 없이 진행할 수 있다.

1
yum -y install nginx
업데이트
1
yum update nginx
삭제

의존성관리를 개별적으로 해줄 필요없이 삭제할 수 있다.

1
2
# nginx 삭제
yum remove nginx
서버에 있는 패키지 목록 확인

시스템에 설치된 패키지와 설치가능한 패키지의 목록을 출력한다.

1
yum list
설치된 패키지 확인

현재 시스템에 설치되어있는 패키지 리스트를 출력한다.

1
yum list installed
설치가능한 패키지 확인

시스템에 설치 가능한 패키지를 출력한다. 보통 grep과 같이 사용하곤 한다.

1
yum list available | grep <name>
업데이트가 필요한 패키지 확인

현재 시스템에 설치된 패키지들 중에서 업데이트가 필요한 패키지를 출력한다.

1
yum list updated
패키지 정보 확인
1
yum info <package_name>
Share