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

https://www.digitalocean.com/community/tutorials/como-configurar-apache-virtual-hosts-no-ubuntu-14-04-lts-pt


Openssl 

http://wiki.ubuntu-br.org/OpenSSL

http://www.tesouro.fazenda.gov.br/-/como-gerar-um-certificado-de-producao-linux-openssl-


Comentários

Postagens mais visitadas deste blog

Usando multiplos templates web2py

Placeholders em Campos de SQLFORM