Guilherme Louro
Publicado em:

Mon 02 March 2015

←Home

Configurando ambiente Django com Apache e mod_wsgi

Entendendo a necessidade

Muitas vezes encontramos dificuldade em colocar nossas aplicações para funcionar em um servidor devido ao pouco conhecimento em infraestrutura, principalmente aqueles que vieram do php, onde, subir um site e já o ver funcionando no ambiente final se trata apenas de subir os arquivos para a pasta www e pronto, certo? Não, não é bem por aí ...

Normalmente quando configuramos a hospedagem de um domínio através de um software de gestão de alojamento web (cpanel é o mais conhecido) automaticamente o sistema configura o VirtualHost específico para o seu domínio cadastrado, ja direcionando a path para a sua pasta www ou public_html. Mas como isso é feito? Não entrarei em detalhes de como o cpanel funciona, mas irei demonstrar aqui como configuramos um servidor com apache para receber nossa aplicação.

Mas por que o Apache?

A partir do momento que eu mudei meu foco, saindo do PHP para trabalhar com Python, eu acabei "abandonando" o Apache para trabalhar com Nginx. Porém, me deparei com um projeto onde tinha que funcionar em uma Hospedagem compartilhada na qual só funciona o apache. Como não vi nada relacionado a essa configuração aqui no Pythonclub, achei que seria útil para muitos que podem cair em uma situação parecida com a minha, ou simplesmente prefira usar o Apache do que o Nginx.

Caso o seu interesse seja mesmo usar o Nginx (pode parar por aqui), acho ótimo!!! Te dou todo apoio e ainda te indico um ótimo post para isso, do nosso amigo Igor Santos.

Agora, chega de conversa e vamos ao que interessa.

Como fazer?

Existem várias maneiras de se fazer o Django trabalhar com apache, uma delas é a combinação Apache + mod_wsgi e será dessa forma que faremos. Com mod_wsgi podemos implementar qualquer aplicação Python que suporte a interface Python WSGI.

Instalando alguns pacotes necessários

Antes de mais nada, atualize a lista de pacotes

$ sudo apt-get update

Apache + mod_wsgi

$ sudo apt-get install apache2 libapache2-mod-wsgi

Python setup tools + pip

$ sudo apt-get install python-setuptools
$ sudo apt-get install python-pip

Vamos testar o WSGI?

Vamos fazer um teste com uma aplicação simples em python.

Começe criando um diretório na raiz do apache (DocumentRoot)

$ sudo mkdir /var/www/wsgi_test

Em seguida vamos criar nossa app de teste ...

$ sudo vim /var/www/app.wsgi

... e escrever nossa app python compatível com WSGI

def application(environ, start_response):
    status = '200 OK'
    output = 'Hello World!'
    response_headers = [('Content-type', 'text/plain'),
                        ('Content-Length', str(len(output)))]
    start_response(status, response_headers)
    return [output]

Vamos criar agora um host para usar como nosso domínio da aplicação teste

$ sudo vim /etc/hosts

Adicione esta linha ao seu arquivo hosts

127.0.0.1 wsgi_test

E vamos configurar nosso VirtualHost no Apache.

$ sudo vim /etc/apache2/sites-available/wsgi_test
<VirtualHost *:80>
    ServerName wsgi_test
    DocumentRoot /var/www/wsgi_test
    <Directory /var/www/wsgi_test>
        Order allow,deny
        Allow from all
    </Directory>
    WSGIScriptAlias / /var/www/wsgi_test/app.wsgi
</VirtualHost>

Ative-o

$ sudo a2ensite wsgi_test

Obs: esse comando cria um link simbólico do wsgi_test para a pasta sites-enabled. Você pode fazer isso manualmente.

Reinicie o apache:

$ sudo service apache2 reload

Feito isso abra o internet explorer seu navegador preferido e acesse http://wsgi_test. Se você está vendo a mensagem "Hello World" pode comemorar, o wsgi está funcionando com o apache.

Configurando Django com WSGI

Até o momento entendemos como funciona a configuração do apache para receber uma aplicação Python com WSGI. Podemos usar essa ideia para qualquer aplicação python, porém veremos como fica essa configuração para trabalhar com Django.

Criando o ambiente

É sempre bom trabalharmos com ambientes virtuais em nossas aplicações python, para isso temos o virtualenv. Eu, particularmente, prefiro usar o VirtualenvWrapper, que separa os ambientes virtuais das aplicações. Caso você não conheça, indico o post do Arruda que foi o que me guiou quando comecei a usar. Usando VirtualEnvWrapper

No meu caso usei o virtualenvwrapper e meu filesystem é o seguinte:

+-- /home/guilouro
|   +-- .virtualenvs  #[Ambientes]
|   +-- www           #[Projetos]

O Virtualenvwrapper criará meus projetos dentro de www e os ambientes em .virtualenvs. Mas para que isso aconteça temos que adicionar algumas linhas em nosso ~/.bashrc

# adicione no final do arquivo ~/.bashrc
# ...
export PROJECT_HOME=~/www
export WORKON_HOME=~/.virtualenvs
source /usr/local/bin/virtualenvwrapper.sh

Atualize com o comando:

source ~/.bashrc
Criando nosso projeto
$ mkproject wsgi

Com as configurações anteriores o virtualenvwrapper já irá ativar o ambiente e levar você para a pasta do projeto. Mas para ativar é muito simples, basta usar:

$ workon wsgi

Com o nosso ambiente virtual criado partiremos então para a criação do nosso projeto django. Utilizarei a versão mais atual até o momento, nesse caso 1.7

$ pip install django

Não entrarei em detalhes para a configuração inicial do django, portanto irei usar um template que eu criei para a inicialização dos meus projeto. Criamos então o projeto dessa forma:

# startproject pelo template
$ django-admin.py startproject --template https://github.com/guilouro/django-boilerplate/archive/master.zip wsgitest .
# instala os pacotes
$ pip install -r requirements.txt
# faz a migração
$ python manage.py migrate

Você encontra esse template aqui -> django-boilerplate

Criando um site no apache para o projeto

Primeiramente, vamos criar um domínio fictício para responder com o nosso projeto ao ser acessado.

$ sudo vim /etc/hosts

127.0.0.1   djangowsgi.com

Agora vamos configurar o apache:

$ sudo vim /etc/apache2/sites-available/djangowsgi
WSGIDaemonProcess djangowsgi.com python-path=/home/guilouro/www/wsgi:/home/guilouro/.virtualenvs/wsgi/lib/python2.7/site-packages
WSGIProcessGroup djangowsgi.com

<VirtualHost *:80>
    ServerName djangowsgi.com
    WSGIScriptAlias / /home/guilouro/www/wsgi/wsgitest/wsgi.py

    <Directory /home/guilouro/www/wsgi>
        <Files wsgi.py>
            Order allow,deny
            Allow from all
        </Files>
    </Directory>

    Alias /media/ /home/guilouro/www/wsgi/media/
    Alias /static/ /home/guilouro/www/wsgi/static/

    <Directory /home/guilouro/www/wsgi/static>
        Order allow,deny
        Allow from all
    </Directory>

    <Directory /home/guilouro/www/wsgi/media>
        Order allow,deny
        Allow from all
    </Directory>

</VirtualHost>

Reinicie novamente o apache:

$ sudo service apache2 reload

Explicarei agora um pouco do que foi usado nessa configuração

WSGIScriptAlias: é a url na qual você estará servindo sua aplicação (/ indica a url raiz), e a segunda parte é a localização de um "arquivo WSGI".

Modo daemon

O modo daemon é o modo recomendado para a execução do mod_wsgi(em plataformas não-windows). Ele gera um processo independente que lida com as solicitações e pode ser executado como um usuário diferente do servidor web. Um dos pontos positivos dele é que a cada alteração em seu projeto você não precisa restartar o apache, basta executar um touch no seu arquivo wsgi.py

Directivas para o daemon

WSGIDaemonProcess: Foi atribuido a ele o nosso servername e utilizamos python-path por se tratar de um projeto que esta em ambiente virtual. Passamos então nossas paths nele.

WSGIProcessGroup: Atribuímos o servername a ele

Testando a aplicação

Agora acesse http://djangowsgi.com e corre para o abraço.

Espero que tenha ficado claro. Qualquer dúvida ou problema deixe nos comentários e vamos juntos tentar resolver.


Referências:
Topo
comments powered by Disqus