현재 가장 성능이 뛰어난 것으로 알려진 wsgi 컨테이너. http://uwsgi-docs.readthedocs.org/en/latest/index.html wsgi 외에도 Rack, PSGI, CGI, PHP 등도 지원한다.
wsgi 프로젝트 설정을 할 때 개별적으로 하기보다는 http://uwsgi-docs.readthedocs.org/en/latest/Emperor.html를 이용하면 편리하다.
우분투 설정#
apt-get의 패키지는 오래된 것이므로 pip로 설치한다.
sudo pip install uwsgi
upstart 스크립트를 만든다.
/etc/init/uwsgi.conf
# Emperor uWSGI script
description "uWSGI Emperor"
start on runlevel [2345]
stop on runlevel [06]
exec sudo -uubuntu uwsgi --master --die-on-term --emperor /etc/uwsgi
그러면 이제 다음 명령으로 uwsgi 서버를 시작/중단/재시작 할 수 있다.
sudo start uwsgi
sudo stop uwsgi
sudo restart uwsgi
그리고 연동할 프로젝트를 설정한다. Django를 예로 들면 다음과 같다. 물론 그냥 wsgi 파일을 연결시켜도 된다.
[uwsgi]
thread=3
master=1
env = DJANGO_SETTINGS_MODULE=myproj.production
module = django.core.handlers.wsgi:WSGIHandler()
chdir = /home/ubuntu/myproj
virtualenv = /home/ubuntu/venv
socket = 127.0.0.1:3031
logto = /home/ubuntu/logs/uwsgi-myproj.log
buffer-size=32768
buffer-size
는 지정하지 않으면 request의 사이즈가 클 때 에러가 난다. 페이스북 로그인 연동을 할 때처럼 URL이 길어지면 에러를 볼 수 있다. 이 정도는 디폴트값으로 해줘야 되는 거 아냐?
여기까지 하면 uwsgi 서버는 작동한다. 그럼 이제 socket
에 지정한 대로 nginx에서 연결시켜주면 된다. 우분투 패키지의 nginx는 uwsgi_params를 이미 갖고 있어서 설정만 해주면 된다.
server {
listen 80;
listen [::]:80 ipv6only=on default_server;
server_name mydomain.com;
location /static {
alias /path/to/static;
}
location / {
uwsgi_pass 127.0.0.1:3031;
include uwsgi_params;
}
}