Como usar Django com uWSGI¶
uWSGI é um sevidor de container de aplicação feito em C puro, rápido, auto-ajustável e amigável a desenvolvedores e administradores de sistema.
Ver também
A documentação do uWSGI oferecem um tutorial cobrindo Django, nginx e uWSGI (uma possível implantaçao dentre muitas). A documentação abaixo foca em como integrar o Django com uWSGI.
Prerequisito: uWSGI¶
A wiki uWSGI descreve vários instalation procedures. Usando o pip, o gerenciador de pacotes do Python, é possível instalar o uWSGI com um único comando. Por exemplo:
# Install current stable version.
$ pip install uwsgi
# Or install LTS (long term support).
$ pip install https://projects.unbit.it/downloads/uwsgi-lts.tar.gz
Aviso
Algumas distribuições, incluindo o Debian e Ubuntu, trazem uma versão desatualizada do uWSGI que não está em conformidade com as especificação uWSGI. Versões anteriores a 1.2.6 não chamam o close
do objeto response após tratar uma requisição. Nestes caso o request_finished
não é enviado. Isso pode resultar em conexões inativas com o banco de dados e servidores memcache.
Modelo uWSGI¶
uWSGI opera no modelo cliente servidor. Seu servidor WEB (Ex: nginx, Apache) comunica com um processo ‘django-uwsgi’ “executor” para entregar conteúdo dinâmico. Veja uWSGI’s documentação background para mais detalhes.
Configurando e iniciando o servidor uWSGI para o Django¶
uWSGI fornece múltiplas maneiras de configurar os processos. Veja uWSGI’s configuration documentation e examples.
Aqui um exemplo de um comando para iniciar um servior uWSGI:
uwsgi --chdir=/path/to/your/project \
--module=mysite.wsgi:application \
--env DJANGO_SETTINGS_MODULE=mysite.settings \
--master --pidfile=/tmp/project-master.pid \
--socket=127.0.0.1:49152 \ # can also be a file
--processes=5 \ # number of worker processes
--uid=1000 --gid=2000 \ # if root, uwsgi can drop privileges
--harakiri=20 \ # respawn processes taking more than 20 seconds
--max-requests=5000 \ # respawn processes after serving 5000 requests
--vacuum \ # clear environment on exit
--home=/path/to/virtual/env \ # optional path to a virtualenv
--daemonize=/var/log/uwsgi/yourproject.log # background the process
Asume-se que tem um pacote do projeto no nível mais alto chamado mysite
, e dentro deste um módulo mysite/wsgi.py
que contém um objeto applicação
WSGI. Este é o layout que terá se executar django-admin startproject mysite
(usando so seu próprio nome de projeto do lugar do mysite
) com a recente versão do Django. Se este arquivo não existe, é necessário criá-lo. Veja a documentação em Como implementar com WSGI para o conteúdo padrão que deve ser colocado neste arquivo e que você pode adicionar.
As opções específicas para o Django são:
chdir
: O caminho do diretório necessário estar no Python path – isto é, o diretório que contém o pacotemysite
.module
: O módulo WSGI a ser usado – provavelmente o módulomysite.wsgi
que ostartproject
cria.env
: deve provavelmente conter pelo menos oDJANGO_SETTINGS_MODULE
.home
: caminho opcional para o virtualenv do projeto.
Exemplo do arquivo ini de configuração:
[uwsgi]
chdir=/path/to/your/project
module=mysite.wsgi:application
master=True
pidfile=/tmp/project-master.pid
vacuum=True
max-requests=5000
daemonize=/var/log/uwsgi/yourproject.log
Exemplo de uso do arquivo ini de configuração:
uwsgi --ini uwsgi.ini
Arrumando o UnicodeEncodeError
para uploads de arquivos
Se receber um UnicodeEncodeError``quando fizer upload de arquivos com nomes que contenham caraceteres não ASCII, tenha certeza de configurar o uWSGI para aceitar nome de arquivos não ASCII adicionando isso ao seu ``uwsgi.ini
:
env = LANG=en_US.UTF-8
Veja a seção Files do guia de referência de unicode para detalhes.
Veja a documentação do uWSGI no managing the uWSGI process para informações sobre iniciar, parar e recarregar os uWSGI workers.