
NGINX Hosting Setting, uWSGI
The uWSGI project — uWSGI 2.0 documentation
Included components (updated to latest stable release) The Core (implements configuration, processes management, sockets creation, monitoring, logging, shared memory areas, ipc, cluster membership and the uWSGI Subscription Server) Request plugins (impleme
uwsgi-docs.readthedocs.io
- uWSGI는 : WSGI는 웹서버와 웹앱을 연결해주는 인터페이스를 정의(PEP333)하여 웹서버와 웹앱(python으로 구현한)를 독립적으로 구성할 수 있게 한다.
- 일반적으로 Flask, DJango등의 Web Application은 기본적으로 Web server가 아니기 때문에 개발시 실행 자체는 최소한의 Web server역할만 하는 방식의 DEV Server라고 불리는 방식 혹은 모듈로 실행 시키게 됩니다.
- 그래서 보통은 NGINX->[무엇인가 연결해 주는거]->Python Web app 과 같은 형태로 서버자체를 구성하는 경우가 많다.
- 여기서, Web Application, Web Server, Web Service등에 대한 대략적인 이해를 먼저 구글링하여 알아 보는 것이 많이 도움이 됩니다.
NGINX와 uWSGI를 이용한 Python Web Application의 연결
- 시스템 구성
- ubuntu 또는 MAC에서 Nginx, Python 3.7
- NGINX 설치
- uWSGI 설치
- 아래 2가지 방법중 하나로 설치, Virtual environment를 사용한다면, vitual environment activate된 bash, shell등에서 실행
pip install uwsgi
pip install https://projects.unbit.it/downloads/uwsgi-lts.tar.gz
- uWSGI 실행
cd {app path}
uwsgi --http :{port} --module {appName}.wsgi
- 위와 같은 방법으로 실행 시킬 수 있다. app name의 경우는 현재 개발중에 Application의 pacakge(python package name)으로 Django의 경우 예시이며, --http 옵션으로 http 를 인터페이스로 하는 연결 방법 설정이다. http를 사용해도 좋지만, 좀더 좋은 속도를 위해서 대부분 socket연결을 많이 쓰는듯 하다.. 그외 ini를 이용하는 방법이 있다. 아래 참고
- flask, sanic등의 경우 아래와 같은 설정 파일를 생성하여 실행 시킬 수 있으며, 아래 예시는 socket을 이용하는 세팅 방법이다.
[uwsgi]
chdir = 프로젝트 경로
uid = 실행할계정
gid = 실행할계정
chmod-socket = 666
socket = socket파일이 위치할 경로
module = 모듈이름(실행할 파일 이름)
callable = 연결될 Flask 모듈이름
virtualenv = python 가상 환경 경로(virtualenv)
- http를 이용하여 실행된 uWSGI를 설정된 python package(app)를 실행시켜주고, http통신 부분을 python package로 전/수송 시키기 때문에 직접 Browser등과 같은 http client에서 access가능하긴 하다. 하지만 앞에서 이야기 한것과 같이 flask던지, DJango(Rest Framework)등이 원래 webserver용도가 아니라서 뭔가 안되거나 예외 처리가 미흡한것등등이 많을 수 있다. 개발시에는 별로 상관 없지만, 실제로 Production Level(user에서 직접 서비스하는)에서는 직접 Web Application이나 Service가 Web Server를 통하지 않고 서비스되는 일은 지양하길 바랍니다.
- TIP
- DJango의 경우 DJango자체가 제공해 주는 다양한 Asset이 있습니다. 예를 들어 Image, CSS등
- 문제는 uWSGI같은 Interface등을 붙이면 갑자기 DJango Admin page등이 깨지기 시작하는 경우가 있는데, 이는 위에 이야기한 Asset이 hosting이 안되고, 단지 Python 모듈만 동작 시켜 주기 때문입니다.
- 아래와 같은 Command로 현재 DJango가 사용하는 Asset들을 한군데로 모아주고, 이를 Static file hosting방법을 이용하여 Hosting 해주어야 합니다. 아래 링크를 확인해 보세요
- https://stackoverflow.com/questions/33168308/getting-404-for-all-static-files-during-wsgi-setup-with-django/45558652
python manage.py collectstatic
- NGINX 설정
- 아래와 같이 NGINX설정을 해주면 DJango같은 경우 설정이 완료된다.
upstream django {
server unix:///tmp/app.sock;
}
server {
listen 9001;
# the domain name it will serve for
server_name localhost; # substitute your machine's IP address or FQDN
charset utf-8;
# max upload size
client_max_body_size 75M; # adjust to taste
#location /staic {
# alias /Users/yhlee/Documents/python-workspace/
#}
location / {
uwsgi_pass django;
include /usr/local/etc/nginx/uwsgi_params;
}
}
- 아래와 같은 형식으로도 가능하며, DJango이외 사용할 수 있는 방법
server {
listen 80;
server_name 0.0.0.0;
location / { try_files $uri @app; }
location @app {
include uwsgi_params;
uwsgi_pass unix:///tmp/app.sock
}
}
- 유의해서 볼 부분이 내 `unix:///temp/app.sock`, 부분으로 위에 uWSGI에서 설정한, socket 경로 이다. 이 소켓을 통해 NGINX<->uWSGI가 가능하게 된다.
'NGINX' 카테고리의 다른 글
NGINX 파일 HOSTING 하기(in linux ubuntu 18.04) (0) | 2020.03.27 |
---|---|
NGIX 설치(on linux ubuntu 18.04) (0) | 2020.03.27 |
NGINX 파일 HOSTING 하기(on Windows) (0) | 2020.03.25 |
NGINX 설치(on windows) (0) | 2020.03.25 |