원문 : http://uwsgi-docs.readthedocs.io/en/latest/tutorials/Django_and_nginx.html
서버를 구성하다가 좋은글을 발견해서 번역을 해보았습니다.
번역하면서 몇번을 그만둘까.. 하다가 그래도 마쳤습니다.. ㅎㅎ
(해당 번역은 번역 수준으로도 범위적으로도 완전하지 않습니다. 원문을 볼 것을 추천드립니다.)
이 튜토리얼은 프로덕션 웹 서버를 설정하고자하는 장고 사용자를 대상으로 한다. 그것은 django가 uWSGI 및 nginx와 잘 작동하도록 설정하는데 필요한 단계를 안내한다. 세가지 구성 요소 무두를 다루며 웹 응용 프로그램과 서버 소프트웨어의 전체 스택을 제공한다.
Django는 신속한 개발과 깨끗하고 실용적인 디자인을 장려하는 고급 Python 웹 프레임워크이다.
nginx(발음 : 엔진-x)는 IMAP / POP3 프록시 서버뿐만 아니라 무료이고, 오픈소스이고, 고성능 HTTP서버와 역방향 프록시이다.
이 튜토리얼에 대한 몇가지 참고사항
이것은 튜토리얼입니다. 배포가이드라인에 대한 참조 가이드는 제공하지 않는다.
nginx와 uWSGI는 Django 배치에 좋은 선택이지만, 그것들은 유일한것이거나, "공식적인"것이 아닙니다. 두 가지 모두에 대한 훌륭한 대안이 있으며, 조사하는 것이 좋습니다.
이와같이 장고를 배포하는 방법은 좋은 방법이지만, 유일한 방법은 아니다. 어떤 목적으로는 아마도 최선의 방법조차 되지 않은것이다.
그러나 이것은 신뢰성 있고 쉬운 방법이며 여기에서 다루는 내용은 장고를 배포하는데 사용하는 소프트웨어에 익숙해 지도록하는 개념과 절차를 소개한다. 작업 설정을 제공하고 거기에 도달하기 위해 취해야 할 단계를 연습함으로써, 이를 달성할 수 있는 다른 방법을 모색할 수 있는 기초를 제공한다.
이 튜토리얼에서는 사용중인 시스템에 대해 몇가지 가정을 한다
유닉스 계열 시스템을 사용하고 있으며 적성과 유사한 패키지 관리자를 사용한다고 가정한다. 그러나 "Mac OS X에서 aptitude와 비슷한 것은 무엇인가?"와 같은 질문을 해야 할 필요가 있다면 그러한 종류의 도움을 상당히 쉽게 찾을 수 있다.
이 튜토리얼에서는 새로운 프로젝트에 wsgi모듈을 자동으로 생성하는 Django 1.4 또는 이후버전을 사용한다고 가정하지만, 지침은 이전 버전에서 작동한다. Django wsgi 모듈을 직접 구해야하지만 Django 프로젝트 디렉토리 구조가 약간 다를 수도 있다.
개념
웹 서버는 외부 세계를 마주한다. 파일시스템에서 직접 파일 (HTML, 이미지, CSS 등)을 제공 할 수 있다. 그러나 Django 응용 프로그램과 직접 대화 할 수는 없다. 응용 프로그램을 실행하고 웹 클라이언트 (예: 브라우저)의 요청에 응답을 보내고 응답을 반환 할 수 있는 무언가가 필요하다.
Web Server Gateway Interface = WSGI - 가 이 작업을 수행한다. WSGI는 Python 표준이다.
uWSGI는 WSGI 구현이다. 이 튜토리얼에서는 uWSGI를 설정하여 유닉스 소켓을 만들고 WSGI프로토콜을 통해 웹 서버에 대한 응답을 제공한다. 마지막으로 우리의 완전한 구성 요소 스택은 다음과 같다.
the web client <-> the web server <-> the socket <-> uwsgi <-> Django
uWSGI 설정을 시작하기 전에
virtualenv
우리가 설치해야하는 소프트웨어를 위해 virtualenv에 있는지 확인해라. (나중에 시스템 전체에 uwsgi를 설치하는 방법을 설명하겠다)
virtualenv uwsgi-tutorial
cd uwsgi-tutorial
source bin/activate
Django
Django를 virtaualenv에 설치하고, 새 프로젝트를 만들고, 프로젝트에 cd
한다.
pip install Django
django-admin.py startproject mysite
cd mysite
도메인 및 포트 정보
이 튜토리얼에선 우리는 당신의 도메인을 example.com
. 로 부를것이다. 자신의 FQDN 또는 IP 주소로 대체해라.
처음부터 Django runserver가 기본적으로 수행하는 것 처럼, 우리는 웹 서버가 게시할 포트 8000을 사용할 것이다. 물론 원하는 모든 포트를 사용할 수 있지만 이 포트를 선택했으므로 웹 서버가 이미 수행중인 것과 충돌하지 않는다.
기본 uWSGI 설치 및 구성
uWSGI를 virtualenv에 설치해라.
pip install uwsgi
물론 uWSGI를 설치하는 다른 방법이 있지만 이 방법은 다른 어떤 방법과 마찬가지로 좋다. 파이썬 개발 패키지가 설치되어 있어야 한다. 데비안 또는 우분투와 같은 데비안에서 파생된 시스템의 경우, 설치해야 할 것은 pythonX.Y-dev
이다. 여기서 X.Y는 파이썬의 버전이다.
기본 테스트
test.py
라는 파일을 만든다.
# test.py
def application(env, start_response):
start_response('200 OK', [('Content-Type','text/html')])
return [b"Hello World"] # python3
#return ["Hello World"] # python2
Note
파이썬3 에는 bytes()
가 필요하다는 것을 고려해라.
uWSGI 실행
uwsgi --http :8000 --wsgi-file test.py
옵션의 의미 :
http :8000
: 프로토콜 http, 포트 8000wsgi-file test.py
: 지정된 파일을 로드, test.py
이렇게 하면 포트 8000의 브라우저에 ‘hello world’ 이라는 메시지가 직접 전달된다.
http://example.com:8000
확인해보고, 실행이 된다면 다음 구성 요소 스택이 작동함을 의미한다
the web client <-> uWSGI <-> Python
Django 프로젝트 테스트
이제 우리는 uWSGI가 test.py
모듈 대신 Django 사이트를 실행하기를 원한다.
아직 그렇게 하지 않았다면 mysite
프로젝트가 실제 작동하는지 확인해보아라.
python manage.py runserver 0.0.0.0:8000
작동하는 경우 uWSGI를 사용하여 실행하시오.
uwsgi --http :8000 --module mysite.wsgi
module mysite.wsgi
: 지정된 wsgi 모듈을로드합니다.
브라우저에서 서버를 가리키고, 사이트가 나타나면 uWSGI가 virtualenv에서 장고 응용 프로그램을 제공 할 수 있음을 의미하며 이 스택은 올바르게 작동하는 것이다.
the web client <-> uWSGI <-> Django
N이제는 브라우저가 uWSGI에 직접 말하도록 하지 않을 것이다. 이것이 웹 서버의 일이며, 이는 중간자 역할을 할 것이다.
nginx 기본
nginx 설치
sudo apt-get install nginx
sudo /etc/init.d/nginx start # start nginx
그리고 지금 nginx가 80번 포트의 웹 브라우저에서 제공하는지 확인해라. nginx: “Welcome to nginx!” 라는 메시지를 받아야 한다. 이는 전체 스택의 다음 구성 요소가 함께 작동 함을 의미한다.
the web client <-> the web server
다른 포트가 이미 포트 80에서 제공되고 있고 거기에 nginx를 사용하려면 다른 포트에서 서비스하도록 nginx를 다시 구성해야한다. 이 튜토리얼에서는 포트 8000을 사용하려 한다.
당신의 사이트에 nginx 구성
uWSGI 배포판의 nginx
디렉토리 또는 https://github.com/nginx/nginx/blob/master/conf/uwsgi_params 에서 구할 수 있는 uwsgi_params
파일이 필요하다.
프로젝트 디렉토리에 복사해라. 잠시 후 우리는 nginx에게 그것을 가리키도록 할것이다.
이제 mysite_nginx.conf 라는 파일을 만들고 안에 다음과 같이 입력하여라.
# mysite_nginx.conf
# the upstream component nginx needs to connect to
upstream django {
# server unix:///path/to/your/mysite/mysite.sock; # for a file socket
server 127.0.0.1:8001; # for a web port socket (we'll use this first)
}
# configuration of the server
server {
# the port your site will be served on
listen 8000;
# the domain name it will serve for
server_name .example.com; # substitute your machine's IP address or FQDN
charset utf-8;
# max upload size
client_max_body_size 75M; # adjust to taste
# Django media
location /media {
alias /path/to/your/mysite/media; # your Django project's media files - amend as required
}
location /static {
alias /path/to/your/mysite/static; # your Django project's static files - amend as required
}
# Finally, send all non-media requests to the Django server.
location / {
uwsgi_pass django;
include /path/to/your/mysite/uwsgi_params; # the uwsgi_params file you installed
}
}
이 conf 파일은 nginx에게 파일 시스템의 미디어와 정적 파일을 제공할 뿐만 아니라 장고의 개입이 필요한 요청을 처리하도록 지시한다. 대용량 배포의 경우 한 서버에서 static/media 파일을 처리하고 또 다른 처리에서는 Django 응용 프로그램을 처리하도록 하는 것이 좋지만 지금은 정상적으로 수행될 것이다.
이 파일을 /etc/nginx/sites-enabled 에서 심볼릭 링크를 함으로 nginx 가 볼 수 있다.
sudo ln -s ~/path/to/your/mysite/mysite_nginx.conf /etc/nginx/sites-enabled/
정적 파일 배포
nginx를 실행하기 전에 모든 장고 정적 파일을 정적 폴더에 수집해야한다. 우선 mysite/setting.py 를 수정해야한다.
STATIC_ROOT = os.path.join(BASE_DIR, "static/")
그리고 실행
python manage.py collectstatic
nginx 기본 테스트
nginx 다시시작
sudo /etc/init.d/nginx restart
미디어 파일이 올바르게 제공되는지 확인하려면 media.png
라는 이미지를 /path/to/your/project/project/media
디렉토리에 추가한 다음 http://example.com:8000/media/media.png 에 방문해라. - 작동한다면, 적어도 nginx 파일을 올바르게 제공하는지 알게 된다.
nginx를 재시작 하는 것만으로는 안되지만, 실제로 멈추었다가 다시 시작한다면 문제가 있는지, 어디에 있는지 알 수 있다.
nginx, uWSGI 그리고 test.py
nginx가 "hello world" 를 말해보게 해보자 (Let’s get nginx to speak to the “hello world” test.py
application.)
uwsgi --socket :8001 --wsgi-file test.py
이 옵션을 제외하고는 이전과 거의 같다.
socket :8001
: 프로토콜 uWSGI, 포트 8001 사용
한편 nginx는 해당 포트의 uWSGI와 통신하고 포트 8000의 외부 세계와 통신하도록 구성되었다. 이곳을 방문 :
확인해보아라, 그리고 이것이 우리의 스택이다.
the web client <-> the web server <-> the socket <-> uWSGI <-> Python
한편 http://example.com:8001 에서 uWSGI 출력을 살펴볼 수 있다. - uWSGI가 아니라 http를 말하고 있기 때문에 작동하지 않을 것이다. 하지만 터미널에 uWSGI의 출력이 표시되어야 한다.
포트 대신 Unix 소켓 사용
지금까지 우리는 TCP 포트 소켓을 사용했다. 왜냐하면 더 간단하기 때문이다. 하지만 포트보다 Unix 소켓을 사용하는것이 더 낫다. 오버헤드가 적기 때문이다.
mysite_nginx.conf
를 다음과 같이 변경.
server unix:///path/to/your/mysite/mysite.sock; # for a file socket
# server 127.0.0.1:8001; # for a web port socket (we'll use this first)
nginx 를 다시 시작해라.
uWSGI 를 다시 실행해라.
uwsgi --socket mysite.sock --wsgi-file test.py
이번에는 socket
옵션을 사용하여 uWSGI에게 사용할 파일을 알려준다.
브라우저에서 http://example.com:8000/ 을 접속.
작동하지 않는 경우
nginx 오류 로그(/var/log/nginx/error.log)를 확인하고, 다음과 같은 메시지가 표시된다면
connect() to unix:///path/to/your/mysite/mysite.sock failed (13: Permission
denied)
아마 nginx가 소켓을 사용할 수 있도록 소켓에 대한 권한을 관리해야 할 것이다.
다음을 시도:
uwsgi --socket mysite.sock --wsgi-file test.py --chmod-socket=666 # (very permissive)
혹은:
uwsgi --socket mysite.sock --wsgi-file test.py --chmod-socket=664 # (more sensible)
nginx가 당신의 소켓을 적절히 읽고 쓸 수 있도록 nginx의 그룹 (아마도 www-데이터)에 사용자를 추가해야 하거나 그 반대일 수 도 있다.
nginx 로그 출력을 터미널 창에서 계속 실행하면 문제를 해결하는 동안 쉽게 참조할 수 있을것이다.
uWSGI 및 nginx를 사용하여 django 응용프로그램 실행
django를 실행해 본다.
uwsgi --socket mysite.sock --module mysite.wsgi --chmod-socket=664
이제 uWSGI와 nginx는 "Hello World"모듈이 아니라 Django 프로젝트를 지원해야한다.
.ini 파일로 실행되도록 uWSGI 구성
우리는 uWSGI에서 사용했던 것과 동일한 옵션을 파일에 넣을 수 있으며, uWSGI에 해당 파일을 실행하도록 요청할 수 있다. 이를 통해 구성을 보다 쉽게 관리할 수 있다.
`mysite_uwsgi.ini`
라는 파일을 생성 :
# mysite_uwsgi.ini file
[uwsgi]
# Django-related settings
# the base directory (full path)
chdir = /path/to/your/project
# Django's wsgi file
module = project.wsgi
# the virtualenv (full path)
home = /path/to/virtualenv
# process-related settings
# master
master = true
# maximum number of worker processes
processes = 10
# the socket (use the full path to be safe
socket = /path/to/your/project/mysite.sock
# ... with appropriate permissions - may be needed
# chmod-socket = 664
# clear environment on exit
vacuum = true
그리고 이 파일을 사용하여 uWSGI를 실행한다 :
uwsgi --ini mysite_uwsgi.ini # the --ini option is used to specify a file
다시 한번 Django 사이트가 예상대로 작동하는지 테스트 해라.
uWSGI 시스템 전체 설치
지금까지 uWSGI는 virtualenv에만 설치되었다. 배포 목적으로 시스템 전체에 설치해야 한다.
virtualenv 비활성화 :
deactivate
시스템 전체에 uWSGI를 설치 :
sudo pip install uwsgi
# Or install LTS (long term support).
pip install https://projects.unbit.it/downloads/uwsgi-lts.tar.gz
uWSGI wiki에서는 몇가지 설치절차를 설명한다. 시스템 전반에 걸쳐 uWSGI를 설치하기 전에 설택할 버전과 가장 적절한 설치 방법을 고려해야 한다.
이전과 마찬가지로 uWSGI를 실행할 수 있는지 확인해보아라.
uwsgi --ini mysite_uwsgi.ini # the --ini option is used to specify a file
Emperor mode
uWSGI는 Emperor mode 에서 실행할 수 있다. 이 모드에서는 uWSGI 설정 파일의 디렉토리를 감시하고 발견된 각각의 인스턴스 ('vassals')를 생성한다.
설정 파일이 수정 될 때마다 Emperor는 vassal을 다시 시작한다.
# create a directory for the vassals
sudo mkdir /etc/uwsgi
sudo mkdir /etc/uwsgi/vassals
# symlink from the default config directory to your config file
sudo ln -s /path/to/your/mysite/mysite_uwsgi.ini /etc/uwsgi/vassals/
# run the emperor
uwsgi --emperor /etc/uwsgi/vassals --uid www-data --gid www-data
sudo를 사용하여 uWSGI를 실행해야 할 수도 있다.
sudo uwsgi --emperor /etc/uwsgi/vassals --uid www-data --gid www-data
옵션의 의미 :
emperor
: vassals (config 파일)를 찾을 곳uid
: 프로세스가 시작되면 프로세스의 사용자 IDgid
: 일단 시작된 프로세스의 그룹 ID (the group id of the process once it’s started)
사이트를 확인하여라, 실행중이어야 한다.
시스템 부팅시 uWSGI 시작
마지막 단계는 시스템 시작시 자동으로 모든것을 수행하는 것이다.
많은 시스템에서 가장 쉬운 방법은 rc.local
파일을 사용하는 것이다.
/etc/rc.local
을 편집하고 다음을 추가 :
/usr/local/bin/uwsgi --emperor /etc/uwsgi/vassals --uid www-data --gid www-data --daemonize /var/log/uwsgi-emperor.log
“exit 0” 가 있는 라인 전에 추가해야 한다.
And that should be it!
추가 구성
이것은 시작하기 위한 튜토리얼이었음을 알아야 한다. nginx 및 uWSGI 문서를 읽고 프로덕션 환경에 배포하기 전에 사용 가능한 옵션을 연구해야 한다.
nginx와 uWSGI 모두 친숙한 커뮤니티에서 이익을 얻을 수 있다. 친숙한 커뮤니티는 구성 및 사용법에 대한 귀중한 조언을 제공할 수 있다.
nginx
nginx의 일반적인 설정은 튜토리얼의 범위를 벗어난다, 당신은 제작 웹사이트를 8000번 포트가 아닌 80번 포트에서 수신하기를 원할것이다. (의역 ㅠ)
또한 Django가 아닌 파일을 제공하기 위해 별도의 nginx 위치 블록을 구성해야한다. 예를들어, uWSGI를 통해 정적파일을 제공하는 것은 비효율적이다. 대신 nginx에서 직접 서비스하고 uWSGI를 완전히 우회해라.
uWSGI
uWSGI는 이를 구성하는 여러가지 방법을 지원한다. uWSGI 문서 와 예제 를 참조하여라.
이 튜토리얼에서 프로덕션 환경에서 배포할 때 고려해야하는 일부 uWSGI 옵션에 대해 설명하려 한다. (예제 설정과 함께 여기 나열한다.)
env = DJANGO_SETTINGS_MODULE=mysite.settings # set an environment variable
safe-pidfile = /tmp/project-master.pid # create a pidfile
harakiri = 20 # respawn processes taking more than 20 seconds
limit-as = 128 # limit the project to 128 MB
max-requests = 5000 # respawn processes after serving 5000 requests
daemonize = /var/log/uwsgi/yourproject.log # background the process & log
'개발 > Server' 카테고리의 다른 글
[인프라] heroku를 써야할까 AWS를 써야할까? (3) | 2017.09.04 |
---|
댓글