Debian + Apache + Python

Publicado: 09/03/2012 em Linux, Programação, Serviços IP
Tags:,

1. Considerações iniciais
O Python é uma linguagem de programação de alto nível, interpretada, imperativa, orientada a objetos, de tipagem dinâmica e forte. A linguagem foi projetada com a filosofia de enfatizar a importância do esforço do programador sobre o esforço computacional. Prioriza a legibilidade do código sobre a velocidade ou expressividade. Combina uma sintaxe concisa e clara com os recursos poderosos de sua biblioteca padrão e por módulos e frameworks desenvolvidos por terceiros.

handler
O Apache trata as requisições em fases. Por exemplo, a primeira fase pode servir para autenticar o usuário, a próxima fase para verificar se o usuário tem permissão para ver um arquivo particular e finalmente a próxima etapa para ler o arquivo e enviá-lo para o cliente. Exemplificando ainda mais: a requisição de um arquivo típico envolve três fases: (1) traduzir o URI solicitado para um local de arquivo; (2) ler o arquivo e enviá-lo para o cliente; e então (3) registrar o pedido.

Um tratador (“handler”) é uma função que processa uma determinada fase de uma requisição. Pode haver mais do que um tratador para processar uma fase particular, os quais são chamados pelo Apache em sequência. Para cada uma das fases, há um tratador padrão do Apache (maioria dos quais por padrão executa apenas funções muito básicas ou não fazerem nada), e depois existem os tratadores adicionais fornecidos pelos módulos do Apache, como o mod_python.

Existem “handlers” providos pelo próprio projeto Apache, bem como por cada projeto de seus módulos. O projeto do módulo mod_python fornece vários “handlers” para o Apache. Os tratadores do mod_python, por padrão, não executam qualquer função, a menos que especificamente sejam determinados por alguma diretiva de configuração do Apache. Estas diretivas começam com “Python” e terminam com “Handler” (por exemplo, PythonAuthenHandler) e associam uma fase com uma função Python (no caso do PythonAuthenHandler a fase de autenticação). Assim, a principal função do mod_python é atuar como um distribuidor (“dispatcher”) entre os tratadores do Apache e os programas Python escritos pelos usuários.

O tratador (“handler”) mais comumente utilizado é o PythonHandler. Ele trata a fase de solicitação. Devido a ele não ter nome, é por vezes referido como como tratador genérico. A ação padrão do Apache para este tratador é ler o arquivo e enviá-lo para o cliente. A maioria das aplicações que os usuários escrevem irão substituir este “handler”. Veja a seguir exemplos de tratadores fornecidos pelo projeto mod_python :
PythonPostReadRequestHandler
PythonTransHandler
PythonHeaderParserHandler
PythonInitHandler
PythonAccessHandler
PythonAuthenHandler
PythonAuthzHandler
PythonDebug
PythonImport
PythonOption
PythonPath

Mod_python
Mod_python é um módulo do Apache que incorpora o interpretador da linguagem Python dentro deste servidor. Com mod_python pode-se escrever aplicações baseadas na web em Python que serão executados de uma forma muitas vezes mais rápida do que CGI tradicional. Mod_python reúne a versatilidade (flexibilidade) do Python e do poder (desempenho) do servidor Web Apache quando comparado à abordagem tradicional CGI. na verdade, o modo CGI é o menos eficiente de todos. Cada requisição CGI causa a criação de um processo, a carga e a iniciação do interpretador Python, o que resulta em uma desnecessária atividade da CPU e de I/O.

Ou seja, escolha mod_python em vez do modo CGI. Além disto, o código do mod_python alcançou a maturidade e muito pouca manutenção tem sido requerida.

Interpretador Python embutido dentro do Apache
Além de mod_python, existem outras duas maneiras de executar um código Python através do Apache:
a) através do modo CGI, onde um processo separado é gerado e sua saída padrão é redirecionada para o browser;
b) solicitando informações por proxy para outro servidor localizado atrás do Apache por vários métodos, tais como FastCGI ou protocolos proprietárias.

Configurar o Apache para executar scripts python
Para que o Apache possa lidar com arquivos Python, este deve ser configurado. Há duas maneiras de fazê-lo:
a) o primeiro modo (e padrão) é usar o tratador (“handler”) “publisher”. Ele permite que se escreva scripts Python puro com a extensão “.py” que será interpretado pelo Apache;
b) através do tratador (“handler”) PSP (“Python Server Pages”). Ele permite que se insira o código Python diretamente no código HTML, semelhante ao PHP. Arquivos PSP têm a extensão “.psp”.

2. Verificar se o Python está instalado no ambiente

Utilize o comando abaixo para verificar se o Python já está instalado no ambiente.

$ apt-cache policy python
python:
Instalado: 2.6.6-3+squeeze6
Candidato: 2.6.6-3+squeeze6
Tabela de versão:
*** 2.6.6-3+squeeze6 0
500 http://ftp.br.debian.org/debian/ squeeze/main amd64 Packages
100 /var/lib/dpkg/status

Pela resposta, vê-se que o Python já está instalado. No Debian, para a versão 2.6 do Python, sua instalação ocorre na pasta /usr/lib/python2.6/

3. Instalar módulo do Apache para Python
Uma boa explicação dos módulos Apache pode ser encontrada no post Instalar e configurar Módulos do Apache2 no Debian.

# apt-get install libapache2-mod-python
# /etc/init.d/apache2 restart

Para verificar se o módulo está funcional, execute:

$ ls /etc/apache2/mods-enabled/ | grep python
python.load

Pela resposta do sistema, vemos que o módulo Python está instalado e funcional.

4. Crie um domínio virtual do Apache para servir os programas Python
A criação de domínios virtuais no Apache pode ser observado no post “Configurar domínios virtuais do Apache em máquina Linux/Debian”.  Aqui faremos uma síntese dos comandos necessários:

/etc/apache2/sites-available# cp default teste_python

Editar o arquivo teste_python criado, deixando-o da seguinte forma:

<VirtualHost *:80>
    ServerAdmin webmaster@localhost

Servername www.mundopython.org.br
ServerAlias    mundopython.org.br
    DocumentRoot /var/www/python
    <Directory />
        Options FollowSymLinks
        AllowOverride None
    </Directory>
    <Directory /var/www/python/>
        Options Indexes FollowSymLinks MultiViews
        AllowOverride None
        Order allow,deny
        allow from all
        AddHandler mod_python .py
        PythonHandler teste
        PythonDebug On
    </Directory>
    ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
    <Directory "/usr/lib/cgi-bin">
        AllowOverride None
        Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
        Order allow,deny
        Allow from all
    </Directory>
    ErrorLog ${APACHE_LOG_DIR}/error.log
    # Possible values include: debug, info, notice, warn, error, crit,
    # alert, emerg.
    LogLevel warn
    CustomLog ${APACHE_LOG_DIR}/access.log combined
    Alias /doc/ "/usr/share/doc/"
    <Directory "/usr/share/doc/">
        Options Indexes MultiViews FollowSymLinks
        AllowOverride None
        Order deny,allow
        Deny from all
        Allow from 127.0.0.0/255.0.0.0 ::1/128
    </Directory>
</VirtualHost>

Habilitar o novo dominio virtual:

# a2ensite teste_python
# /etc/init.d/apache2 reload

Entendendo os handlers da configuração
a) AddHandler mod_python .py
Informa ao Apache que todos os arquivos com extensão “.py” serão tratados pelos tratadores (“handlers”) fornecidos pelo mod_python. Todos os outros arquivos que não tenham a extensão “.py” serão tratados por seus “handlers” default.

b) PythonDebug On
Determina aos handlers fornecidos pelo mod_python que enviem as mensagens de erro para a saída padrão. Não deve ser utilizada em produção.

c) PythonHandler teste
Tratador (“handler”) mais comumente utilizado e, devido a ele não ter nome, é por vezes referido como tratador genérico.. Ele trata a fase de solicitação. A ação padrão do Apache para este tratador é ler o arquivo e enviá-lo para o cliente.

OBS: note-se que de acordo com a configuração acima, mesmo que o navegador aponte para qualquer URL que termine em “.py”, sempre o arquivo que será executado será teste.py (isto é, a requisição vai ser sempre tratada por teste.py). Por exemplo, mesmo que o navegador aponte para http://mundopython.org.br/mundo.py , será executado teste.py. Isso se deve a definição explicita do tratador através da diretiva PythonHandler. Se for desejado se ter muitos arquivos tratadores (por exemplo teste1.py, teste2.py e assim por diante) e tê-los acessíveis diretamente pelo navegador, então deve-se usar um sistema de tratamento de nível mais alto , como mod_python publisher, mpservlets ou Vampire. Esses são tratadores mod_python especiais que capazes de mapear as requisições dinamicamente para os tratadores.

5. Criar o arquivo Python

Criar o arquivo /var/www/python/teste.py, com o seguinte conteúdo:

from mod_python import apache
def handler(req):
    req.content_type="text/html"
    req.send_http_header()
    req.write("Executando um programa Python.  Tudo bem!")
    return apache.OK

5.1 Alguns cuidados

  • Python usa indentação para definir blocos. Como utilizado na formação acima.
  • Para ser possível alcançar o domínio http://www.mundopython.org.br que esteja na própria máquina do navegador do usuário, deve-se inserir esta entrada na tabela de hosts local (/etc/hosts) conforme abaixo:
    127.0.0.1	www.mundopython.org.br

6. Acessar a nova página Python
Com o navegador, acesse http://www.mundopython.org.br/teste.py e obtenha como resposta: Executando um programa Python. Tudo bem!

7. Referências
1- Tutorial mod_python
2- Apache Configuration Directives
3- Manual do Apache: índice de diretivas
4- Manual do mod_python: índice de diretivas para o Apache relativas ao Python

Anúncios
comentários
  1. Lucas Messias disse:

    Muito bom o artigo, era oque eu estava procurando ;)
    Parabens .

Deixe um comentário, pois isto é muito motivante para continuarmos este trabalho

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s