Como habilitar a interpretação Python em servidores Tomcat
Um realidade comum aos programadores: vez ou outra precisamos executar scripts específicos dentro de um contexto web. Um exemplo: imagine um script Python que já esteja criado e rodando em um ambiente offline, então surge a necessidade de disponibilizar esse mesmo recurso por meio de acesso HTTP (web). O que fazer?? Pois bem. Não é necessário reescrever o código em outra linguagem (padrão web); basta configurar seu Tomcat para -também- interpretar seu código Python.
Agora, vamos levar em consideração que seu ambiente já esteja configurado com o servidor Tomcat e o Python já esteja instalado. Não vou falar sobre isso aqui pois estas instalações são simples e feitas com um ou dois comandos, blz? 😉
Sabendo que o Python 2 está para ser descontinuado, vamos usar Python 3 como cenário. Ah! Apenas uma curiosidade: se você deseja saber exatamente quando o Python 2 será oficialmente removido, basta entrar nesse site.
Bom, para o Tomcat interpretar Python via CGI, precisamos alterar apenas dois arquivos de configuração e criar a estrutura de diretórios no webapps onde os arquivos .py serão colocados.
Meu ambiente utilza Tomcat 8 e Python 3.
context.xml
Local: /etc/tomcat8/context.xml
Se sua instalação é original, provavelmente vai encontrar a linha:
<Context>
Então, você precisará alterar para:
<Context reloadable="true" privileged="true">
web.xml
Local: /etc/tomcat8/web.xml
Atenção! Aqui a alteração é maior. O ponto positivo é que provavelmente esse trecho de código pode estar comentado em seu web.xml. Portanto, procure-o, descomente as linhas (remova o código do comentário) e altere-o, como abaixo:
<servlet> <servlet-name>cgi</servlet-name> <servlet-class>org.apache.catalina.servlets.CGIServlet</servlet-class> <init-param> <param-name>debug</param-name> <param-value>5</param-value> </init-param> <init-param> <param-name>cgiPathPrefix</param-name> <param-value>WEB-INF/cgi</param-value> </init-param> <init-param> <param-name>executable</param-name> <param-value>/usr/bin/python3</param-value> </init-param> <init-param> <param-name>passShellEnvironment</param-name> <param-value>true</param-value> </init-param> <load-on-startup>5</load-on-startup> </servlet>
Repare que, na linha 14 é o local onde está instalado o Python 3. Geralmente esse caminho é padrão, mas altere esta linha conforme o local em que está instalado, no seu servidor
Em seguida, logo abaixo, no mesmo arquivo, você deve encontrar esse trecho de código comentado. Apenas descomente-o:
<servlet-mapping> <servlet-name>cgi</servlet-name> <url-pattern>/cgi-bin/*</url-pattern> </servlet-mapping>
Pronto! Estes são apenas os dois arquivos de configuração do Tomcat que você precisa alterar.
Criando as pastas
Agora, você precisa definir o local onde os arquivos .py serão armazenados. Os arquivos de script Python podem ficar dentro de qualquer pasta em webapps, porém, existe uma organização necessária. Eu escolhi uma pasta chamada “python”, então ficou assim:
Meu local de armazenamento do arquivos .py: /var/lib/tomcat8/webapps/python/WEB-INF/cgi
Lembre -se que, até a pasta webapps é padrão do servidor. Então, você terá que criar as pasta seguintes, ou seja, “python/WEB-INF/cgi“. E coloque seus scripts dentro de “cgi“.
ATENÇÃO: o nome do diretório python é o único que você poderá alterar. Já as pastas WEB-INF e cgi deverão ficar como estão.
Permissões na nova pasta
Aqui, você precisará definir o “dono” da nova pasta python. Para isso, execute o seguinte comando:
$ sudo chown -R tomcat8:tomcat8 /var/lib/tomcat8/webapps/python
Com este comando definimos o próprio servidor Tomcat como proprietário dos arquivos de scripts. Assim, não teremos problemas de permissões ao acessar na web. Lembrando que, no meu caso, é tomcat8, mas no seu pode ser outra versão.
Reinicie o serviço
Chegou a hora de reiniciar o serviço do Tomcat para aplicar as alterações:
$ sudo service tomcat8 restart
Espere ele reiniciar e subir os sistemas. Você pode acompanhar o processo com este comando:
$ tail -f /var/log/tomcat8/catalina.out
Seu primeiro script .py
Agora, vamos testar. Dentro da nova pasta que criamos, acima, crie também um arquivo teste.py e coloque o conteúdo abaixo. Ah! Para criar o arquivo, você poderá usar o comando:
$ sudo nano /var/lib/tomcat8/webapps/python/WEB-INF/cgi/teste.py
Cole o conteúdo abaixo neste arquivo:
#!/usr/bin/python3 print("Content-type: text/html") print("\n\n") print("Teste")
Aperte CTRL + O depois ENTER para salvar, depois CTRL + X para sair do editor.
Importante: a segunda linha é necessária para avisar ao Tomcat que se trata de uma saída texto ou html por meio de CGI. Se você não colocar essa linha, a impressão “Teste” não irá acontecer.
Testando
Com o serviço Tomcat rodando, abra o seu navegador e digite algo parecido com:
http://localhost:8080/python/cgi-bin/teste.py
Você vai visualizar no navegador a palavra “Teste”.
Achou fácil? Tem alguma dica para melhorarmos este processo ou algo que queira complementar? Fale nos comentários abaixo. 😉