Configurar o web2py no Apache e Ubuntu LTS
Para todo desenvolvedor o maior desafio não é produzir código e sim colocar sua aplicação para rodar de fato de verdade, por isso é essencial conhecer todos os passos para fazer o deploy de sua aplicação em ambientes de produção.
Este artigo será composto por este principal e outros dois explicando a teoria envolvendo o processo.
Neste artigo explicaremos em forma de tutorial como fazer o deploy de uma aplicação web2py tem um servidor Apache usando virtual hosts.
Antes de prosseguirmos é importante fazer algumas considerações.
1- O web2py é um framework baseado no padrão WSGI (Web Server Gateway interactive), um avanço no antigo CGI, portanto vamos precisar de um arquivo intermediário entre o módulo wsgi do apache e o framework, chamado de handler.
2- O Apache ainda é o servidor WEB mais utilizado no mercado por tanto há vasta documentação espalhada por aí, logo não será muito difícil dar manutenção nele.
3- O Ubuntu também é a distro linux mais usada no mundo desktop portanto não teremos tantos problemas com documentação.
4- A escolha do SO e do servidor se baseou em facilidade de implementação com a urgência do momento, ou seja, aquilo que foi mais rápido fazer em um momento crítico.
5- Se os conceitos explicados aqui forem aprendidos será possível trabalhar com qualquer SO linux e servidor web.
Caso de uso
Vamos supor que tenhamos dois apps distintos onde cada um recebe um domínio respectivo além de tudo mais cada domínio possui o seu próprio certificado SSL.
domínio1.com.br -> app1
domínio2.com.br -> app2
O web2py consegue gerenciar vários domínios desde que eles estejam devidamente configurados no arquivo routes.py, na raiz do framework.
E o apache consegue lidar com vários domínios através dos VirtualHosts.
Preparando o ambiente
Com o servidor devidamente instalado e totalmente cru, faça acesso ao terminal como root e execute o script de instalação do web2py para ubuntu, o arquivo está na pasta scripts do framework e se chama setup-apache-ubuntu.sh.
NOTA: Você pode enviar o arquivo ao servidor usando comandos SSH ou SFTP (filezilla ou similar).
Depois de enviado o arquivo dê a ele a permissão de execução com:
# chmod +x setup-apache-ubuntu.sh
E execute-o usando:
# ./setup-apache-ubuntu.sh
Explicando o que aconteceu
Este script instala todas as dependências do python e configura automaticamente um certificado openSSl, ele também cria uma pasta em /home chamada www-data que será acessada pelo Apache, ela conterá a(s) instalação(ões) do web2py.
# ls -l /home/www-data/web2py
Além disso ele cria um arquivo virtualhost no diretório /etc/apache2/sites-available/default.conf. Esse arquivo é o nosso virtualhost apontando para a pasta do web2py e vamos descrevê-lo logo abaixo.
Configurando o virtual em
Antes de prosseguirmos é interessante configurarmos um virtualenv para nossa instalação do web2py, já que podemos ter outras instalações com configurações diferentes uma da outra.
Execute o comando abaixo para criarmos uma instalação do virtual em:
# virtualenv -p /usr/bin/python /opt/venv_versao/
Isso criará um diretório virtual em /opt/venv_versão com a versão do virtualenv, você pode escolher algo como venv_27, venv_1-0, venv_tests…..
NOTA: É possível que o script não tenha instalado o virtualenv da versão do python desejada, para fazê-lo você pode usar algo como:
# apt-get update && apt-get install -y python-virtualenv
Para rodar o web2py com mod_wsgi é preciso um arquivo intermediário, ele já vem com o framework na pasta handlers, ali estão disponíveis uma gama de arquivos para configurações diferentes, bastando apenas copiá-los para o diretório raiz e felizmente nosso script já fez isso.
Precisamos editar o arquivo wsgihandler.py para que ele use o virtualenv através do comando abaixo:
# vim /home/www-data/web2py/wsgihandler.py
Troque primeira linha onde se vê:
#!/usr/bin/env python
por:
#!/opt/venv_versao/bin/python
Isso fará com que o arquivo wsgihandler.py use o virtualenv que configuramos.
Testando o arquivo de configuração
Para saber se nosso arquivo está funcionando corretamente é preciso executar o seguinte comando abaixo:
# ./home/www-data/web2py/wsgihandler.py
Se não ocorrer erro nenhum é por que está tudo certo.
Configurando as rotas
Como dito no início o web2py gerencia rotas através de um arquivo routes.py em sua raiz, por padrão esse arquivo apenas define qual o app default.
Abra o arquivo e substitua o conteúdo pelo abaixo:
# -*- coding: utf-8 -*-
routers = dict(
# base router
BASE=dict(
applications = ['app1', 'app2'],
domains = {"dominio1.com.br" : "app1", "dominio2.com.br" : "app2" }
),
)
Configurando o Apache
Agora precisamos configurar o Virtual Hosts para os domínios funcionam, para isso navegue até o diretório abaixo.
# cd /etc/apache2/sites-available
O diretório acima guarda os arquivos de configuração dos sites virtuais, podemos ter quantos quisermos.
Crie e edite um arquivo chamado dominio1.com.br.conf.
# vim dominio1.com.br.conf
E cole o conteúdo abaixo nele.
WSGIDaemonProcess dominio1.com.br user=www-data group=www-data
<VirtualHost *:80>
ServerName dominio1.com.br
ServerAlias *.dominio1.com.br
WSGIProcessGroup dominio1.com.br
WSGIScriptAlias / /home/www-data/web2py/wsgihandler.py
WSGIPassAuthorization On
<Directory /home/www-data/web2py>
AllowOverride None
Require all denied
<Files wsgihandler.py>
Require all granted
</Files>
</Directory>
AliasMatch ^/([^/]+)/static/(?:_[\d]+.[\d]+.[\d]+/)?(.*) \
/home/www-data/web2py/applications/$1/static/$2
<Directory /home/www-data/web2py/applications/*/static/>
Options -Indexes
ExpiresActive On
ExpiresDefault "access plus 1 hour"
Require all granted
</Directory>
CustomLog /var/log/apache2/access.log common
ErrorLog /var/log/apache2/error.log
</VirtualHost>
<VirtualHost *:443>
ServerName dominio1.com.br
ServerAlias *.dominio1.com.br
SSLEngine on
SSLCertificateFile /etc/apache2/ssl/self_signed.cert # Caminho do certificado
SSLCertificateKeyFile /etc/apache2/ssl/self_signed.key
WSGIProcessGroup dominio1.com.br
WSGIScriptAlias / /home/www-data/web2py/wsgihandler.py
WSGIPassAuthorization On
<Directory /home/www-data/web2py>
AllowOverride None
Require all denied
<Files wsgihandler.py>
Require all granted
</Files>
</Directory>
AliasMatch ^/([^/]+)/static/(?:_[\d]+.[\d]+.[\d]+/)?(.*) \
/home/www-data/web2py/applications/$1/static/$2
<Directory /home/www-data/web2py/applications/*/static/>
Options -Indexes
ExpiresActive On
ExpiresDefault "access plus 1 hour"
Require all granted
</Directory>
CustomLog /var/log/apache2/ssl-access.log common
ErrorLog /var/log/apache2/error.log
</VirtualHost>
Explicando
A primeira linha contém o nome do processo que o Vhost irá rodar, ou seja, cada Virtual Host executa um processo no nosso servidor, logo não podemos ter nomes repetidos para apps diferentes. Por isso o nome do domínio.
Dentro de cada vhost temos o WSGIProcessGroup que também usamos o nome do domínio. Isso facilita na hora de matar um processo específico do app.
NOTA: Perceba que todos os virtualhosts apontam para o diretório do web2py, pois quem irá apontar o domínio para o app certo é o arquivo routes.py do quadro.
Veja, a necessidade de gerar um arquivo vhost para cada domínio é útil para separar os processos no app e para o uso de certificados SSL específicos, pois também podemos gerar um único certificado contendo todos os domínios, vamos tratar isso em outro artigo.
No caminho dos certificados SSL será preciso informar o caminho dos certificados originais para o domínio. Eles podem ser gerados pelo CERTBOT ou comprados avulso em uma CA.
Repita o processo para o dominio2.com.br para então ativarmos os dois arquivos.
Feito isso devemos ter dois arquivos em /etc/apache2/sites-available: dominio1.com.br.conf e dominio2.com.br.conf.
Para fazer a ativação dos sites precisamos rodar o seguinte comando.
# a2ensite dominio1.com.br.conf
# a2ensite dominio2.com.br.conf
# /etc/init.d/apache2 force-reload
Os comandos acima criam um atalho para os arquivos no diretório /etc/apache2/sites-enable. Poderíamos criar também um link simbólico para os arquivos de sites-available.
# ln -s /etc/apache2/sites-available/dominio1.com.br.conf /etc/apache2/sites-enable/
Estamos preparando a segunda parte.
Espero que este artigo esclareça as dúvidas gerais de todos que precisam configurar o web2py em ambiente de produção VPS ou dedicado. Ressalto que o tutorial foi feito com base em uma necessidade onde o mais óbvio foi escolhido, mas os conceitos podem ser aplicados em outras distros e servidores.
Não conseguiria fazer este artigo sem o apoio da comunidade Web2py, não deixe de visitar a comunidade Web2py Brasil no Telegram e no google Groups.
Telegram https://groups.google.com/forum/m/#!forum/web2py-users-brazil
Groups https://groups.google.com/forum/#!forum/web2py-users-brazil
Referências
Virtualenv
https://uwsgi-docs.readthedocs.io/en/latest/WSGIquickstart.html
Apache
https://www.hardware.com.br/livros/servidores-linux/instalando-apache.html
https://www.hardware.com.br/livros/linux-redes/instalando-apache.html
Openssl
http://wiki.ubuntu-br.org/OpenSSL
http://www.tesouro.fazenda.gov.br/-/como-gerar-um-certificado-de-producao-linux-openssl-
Comentários
Postar um comentário