= 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: * http://www.monteiro.eti.br/2007/11/30/instalando-o-mais-recente-nginx-no-seu-ubuntu/ * http://www.rkblog.rk.edu.pl/w/p/hosting-django-under-nginx-scgi-and-wsgi/ == 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 2. 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 }}} 3. Ok, agora descompacte o tarball do código-fonte, como a seguir: {{{ $ tar xvfz nginx-0.5.37.tar.gz }}} 4. Agora, faça o download do mod_wsgi para NginX: {{{ $ hg clone http://hg.mperillo.ath.cx/nginx/mod_wsgi/ }}} 5. 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/ }}} 6. 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" }}} 7. Em seguida, a tarefa é compilar o pacote. Isso irá criar os arquivos binários, mas ainda não será a instalação: {{{ $ make }}} 8. 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 }}} 9. 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 }}} 10. 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 }}} 2. 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; }}} 3. 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; } }}} 4. 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. 5. Agora vamos dar permissões de execução ao script: {{{ $ chmod a+x /var/django/meu_projeto/deploy/default.wsgi }}} 6. 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 [wiki:CookBookPortugues CookBook em Português]