Configurando Flask para rodar com Apache

Hoje vamos tratar daquele warning que o Flask emite quando estamos rodando Flask em modo de desenvolvimento:

WARNING: This is a development server. Do not use it in a production deployment.
  Use a production WSGI server instead.
Isso ocorre porque em desenvovimento utilizamos um servidor HTTP que não cumpre os requisitos mínimos de segurança para colocar uma aplicação em produção. Muitos desenvolvedores iniciantes em Flask não sabem disso e para evitar problemas esse Warning é emitido.

O Warning nos sugere utilizar um Servidor WSGI.
Mas o que seria isso?

Web Server Gateway Interface (WSGI), em português Interface de Porta de Entrada do Servidor Web, é uma especificação para uma interface simples e universal entre servidores web e aplicações web ou frameworks para a linguagem de programação Python.

(Fonte: https://pt.wikipedia.org/wiki/Web_Server_Gateway_Interface)

Ou seja WSGI provê um middleware para unir servidores web como o Apache com frameworks web Python como é o caso do Flask.

O Apache continua sendo uma estrela quando se trata de WSGI. Não é de se estranhar que seja um dos servidores mais utilizados para colocar aplicações Flask em produção.

Nós veremos hoje como configurar uma aplicação Flask no Apache utilizando Linux.

Para este exemplo utilizaremos a aplicação disponível em: https://github.com/vladwoguer/flask-example

git clone https://github.com/vladwoguer/flask-example.git

cd flask-example

Utilizaremos a branch apache

git checkout apache

Vamos agora instalar o Python3 e o PIP(Gerenciador de dependencias do Python)

sudo apt-get install python3
sudo apt-get install python3-pip

Configuremos agora o python3 como o default

rm /usr/bin/python

ln -sf /usr/bin/python3 /usr/bin/python

Como tudo ok podemos instalar o Apache

sudo apt-get install apache2

Antes de começarmos é bom testar a aplicação

sh run.sh

Screenshot from 2019-11-12 15-48-16

A aplicação rodando

Screenshot from 2019-11-12 15-50-42

Pronto agora que sabemos que a aplicação roda sem problemas vamos editar o arquivo wsgi.py

Screenshot from 2019-11-12 15-52-40

Normalmente os sites são colocados na pasta /var/www do Apache

No nosso caso

Iremos criar uma pasta flask-example

Seu arquivo wsgi.py deve então referenciar a pasta /var/www/flask-example que iremos criar

Screenshot from 2019-11-12 16-03-47

#
# Conteudo do arquivo `wsgi.py`
#
import sys
sys.path.insert(0, “/var/www/flask-example”)
from server import app as application

Criemos então a pasta

sudo mkdir /var/www/flask-example
Copie o conteúdo da pasta do projeto para está nova pasta

sudo cp -r ./* /var/www/flask-example/

A localização do nosso projeto vai ser então

/var/www/flask-example

Instalemos agora o módulo WSGI do Apache

sudo apt-get install libapache2-mod-wsgi-py3

Antes de prosseguirmos vamos verificar se está tudo ok com nosso arquivo wsgi.py

python wsgi.py

Se nenhum erro foi mostrado está tudo ok para prosseguirmos.

O Apache suporta Virtual Host, isso significa que podemos ter vários sites na mesma porta e ele vai saber pra qual redirecionar utilizando o endereço da aplicação(site).
No nosso exemplo será flask-example-apache.com esse nome é de livre escolha em produção será provavelmente seu domínio.

Como não somos dono desse domínio vamos apenas coloca-lo diretamente no /etc/hosts para que ao navegar para ele sejamos redirecionados para localhost

sudo gedit /etc/hosts
Screenshot from 2019-11-12 16-19-11

127.0.0.1           localhost flask-example-apache.com

Nesse momento se você acessar flask-example-apache.com seu browser buscará o conteúdo em localhost:80

E você verá a página padrão do Apache:

“Apache <Seu Sistema Operacional> Default Page”

Agora vamos configurar nosso Virtual Host

sudo cp /etc/apache2/sites-available/000-default.conf /etc/apache2/sites-available/0
10-flask-example.conf

sudo gedit /etc/apache2/sites-available/002-flask.conf

Substitua o trecho <Directory …  </Directory> por:

WSGIDaemonProcess flask-example threads=5
WSGIScriptAlias / /var/www/flask-example/wsgi.py

<Directory /var/www/flask-example>
WSGIProcessGroup flask-example
WSGIApplicationGroup %{GLOBAL}
WSGIScriptReloading On
Order deny,allow
Allow from all
</Directory>

Na parte onde tem ServerName deve ser modificado para ficar igual a:

ServerAdmin seu.email@email.com
ServerName flask-example-apache.com
ServerAlias flask-example-apache.com
DocumentRoot /var/www/flask-example

Observação: os espaços devem ser substituidos por tabulações(4 espaços = 1 tab)
Habilitemos agora nosso novo site:
sudo a2ensite 002-flask.conf

Reinicie o apache
sudo service apache2 restart

Agora podemos acessar http://flask-example-apache.com e veremos nossa aplicação Flask

 

Screenshot from 2019-11-12 17-11-39

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

%d bloggers like this:
search previous next tag category expand menu location phone mail time cart zoom edit close