Deploy com NginX e WSGI

O NginX é um servidor web que tem crescido rapidamente, especialmente por sua escalabilidade e performance. Trata-se de um concorrente à altura para o Apache o Lighttpd. Segue abaixo a receita para implantar um projeto em Django com NginX, usando mod_wsgi.

Este tutorial foi criado com base nas duas URLs a seguir:

Compilando e instalando o NginX com suporte a mod_wsgi

  1. A versão do NginX compatível com mod_wsgi até o momento é a 0.5.37. Será necessário compilar para adicionar suporte ao módulo mod_wsgi. Considerando que esteja usando Ubuntu, Debian ou alguma variante deles, faça o download do código-fonte do NginX na URL a seguir:

http://sysoev.ru/nginx/nginx-0.5.37.tar.gz

  1. Agora será preciso instalar alguns pacotes para continuar no próximo passo. Alguns desses pacotes são necessários para usar o Mercurial (através do qual vamos baixar o mod_wsgi para NginX), outros para compilar o NginX:
sudo apt-get install build-essentials libpcre3 libpcre3-dev libpcrecpp0 libssl-dev zlib1g-dev mercurial checkinstall
  1. Ok, agora descompacte o tarball do código-fonte, como a seguir:
$ tar xvfz nginx-0.5.37.tar.gz
  1. Agora, faça o download do mod_wsgi para NginX:
$ hg clone http://hg.mperillo.ath.cx/nginx/mod_wsgi/
  1. Com o mod_wsgi baixado, o próximo passo será configurar o código-fonte antes de compilar:
$ ./configure --sbin-path=/usr/sbin --pid-path=/var/run/nginx.pid --lock-path=/var/lock/nginx.lock --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --user=www-data --group=www-data --add-module=../mod_wsgi/
  1. Caso tudo ocorra bem, será exibido um resumo como este abaixo. Copie e guarde para a sua segurança:
nginx path prefix: "/usr/local/nginx"
nginx binary file: "/usr/sbin"
nginx configuration file: "/usr/local/nginx/conf/nginx.conf"
nginx pid file: "/var/run/nginx.pid"
nginx error log file: "/var/log/nginx/error.log"
nginx http access log file: "/var/log/nginx/access.log"
nginx http client request body temporary files: "/usr/local/nginx/client_body_temp"
nginx http proxy temporary files: "/usr/local/nginx/proxy_temp"
nginx http fastcgi temporary files: "/usr/local/nginx/fastcgi_temp"
  1. Em seguida, a tarefa é compilar o pacote. Isso irá criar os arquivos binários, mas ainda não será a instalação:
$ make
  1. Agora, seguindo a ótima dica do Monteiro, use o checkinstall para criar um pacote .deb com os arquivos para instalação. Isso será bom pois caso queira remover posteriormente, basta digitar sudo apt-get remove nginx.
$ checkinstall
  1. Siga o assistente respondendo as perguntas (pode ser com os valores default). No passo de descrição finalize o texto com Ctrl+D. Será criado um arquivo com nome semelhante a este:
$ ls *.deb
nginx_0.5.37-1_i386.deb
  1. Instale o pacote:
$ sudo dpkg -i nginx_0.5.37-1_i386.deb

Pronto! Seu NginX está instalado com suporte a mod_wsgi!

Configurando um projeto em Django

Agora vamos configurar o NginX para exibir seu projeto em Django. Supondo que seu projeto se chame "meu_projeto", localizado na pasta "/var/django/meu_projeto/", vamos aos passos a seguir:

  1. Abra o arquivo /usr/local/nginx/conf/nginx.conf como root:
$ sudo gedit /usr/local/nginx/conf/nginx.conf
  1. Na seção http você deverá encontrar uma seção server. Dentro desta, localize algumas linhas abaixo, a linha que contenha location / { e acrescente as linhas a seguir:
wsgi_var  REQUEST_METHOD      $request_method;
wsgi_var  QUERY_STRING        $query_string;
wsgi_var  CONTENT_TYPE        $content_type;
wsgi_var  CONTENT_LENGTH      $content_length;
wsgi_var  SERVER_NAME         $server_name;
wsgi_var  SERVER_PORT         $server_port;
wsgi_var  SERVER_PROTOCOL     $server_protocol;
wsgi_var  REQUEST_URI         $request_uri;
wsgi_var  DOCUMENT_URI        $document_uri;
wsgi_var  DOCUMENT_ROOT       $document_root;
wsgi_var  SERVER_SOFTWARE     $nginx_version;
wsgi_var  REMOTE_ADDR         $remote_addr;
wsgi_var  REMOTE_PORT         $remote_port;
wsgi_var  SERVER_ADDR         $server_addr;
wsgi_var  REMOTE_USER         $remote_user;
  1. Logo abaixo, dentro da seção location / {, comente as linhas contidas e o deixe como no código abaixo:
location / {
    #root   html;
    #index  index.html index.htm;
    wsgi_pass /var/django/meu_projeto/deploy/default.wsgi;

    wsgi_pass_authorization off;
    wsgi_script_reloading on;
    wsgi_use_main_interpreter on;
}
  1. Agora vamos preparar o seu projeto para ser acessível via WSGI. Crie uma pasta em seu projeto chamada default e dentro dela crie um arquivo default.wsgi, com o seguinte conteúdo:
#!/usr/bin/env python
import os, sys

sys.path.insert(0, os.path.abspath(os.path.dirname(__file__)+'/../'))
os.environ['DJANGO_SETTINGS_MODULE'] = 'settings'

import django.core.handlers.wsgi
application = django.core.handlers.wsgi.WSGIHandler()

esse script é padrão tanto para NginX como para Apache ou outros vários servidores web.

  1. Agora vamos dar permissões de execução ao script:
$ chmod a+x /var/django/meu_projeto/deploy/default.wsgi
  1. Por fim, é só executar o NginX para ver o seu projeto rodando:
$ sudo nginx

Caso algum erro ocorra, verifique as mensagens de erro com:

$ sudo tail -f /var/log/nginx/error.log

Como pode ver, essa forma de rodar o NginX não é a mais indicada, portanto, verifique a seguinte URL que possui uma boa dica para criar um daemon para o serviço da forma ideal:

http://www.monteiro.eti.br/2007/11/30/instalando-o-mais-recente-nginx-no-seu-ubuntu/


Tire outras dúvidas em nosso CookBook em Português

Last modified 16 years ago Last modified on Sep 23, 2008, 9:26:36 AM
Note: See TracWiki for help on using the wiki.
Back to Top