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 pacote mysite.

  • module: O módulo WSGI a ser usado – provavelmente o módulo mysite.wsgi que o startproject cria.

  • env: deve provavelmente conter pelo menos o DJANGO_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.

Back to Top