Usando Web2py com outros framesworks pelo uWSGI

Depois de ter acompanhado como instalar o web2py na hospedagem VPS, precisei fazer algumas correções.


1 - Precisei rodar o w2p com outros frames python.

2 - Trazer mais segurança pros apps.

3 - Facilitar a manutenção.


Do ponto de vista manutenção, centralizar é sempre o melhor caminho, centralizar e padronizar, porém do ponto de vista segurança a redundância nunca pode ser quebrada, sendo assim necessário descentralizar os apps.


O NGINX como vimos usa um usuário www-data para lidar com dados deixando o root como mero admin. Nesse caso, o www-data não possui login válido e só possui permissões para "mexer" naquilo que é dele.


Para rodar nossos apps foi preciso usar o uWSGI com o proxy do NGIX e é dessa vantagem que vamos nos valer.

Criando um usuário para cada app necessário, usando daemos uwsgi para cada app permitindo assim usar vários virtualenvs diferentes, vamos usar usuários com login válido para "mexer" somente nos aquivos do app evitando logar como root.


1 - Criar um usuário:

Crie um usuário com o nome que quiser, caso ele não seja sudo

[ para debianlikes ]

# adduser USUARIO sudo

[ para outros ]

# gpasswd -a USUARIO sudo


Feito isso vamos criar o virtualenv dentro desse home


mkdir .venvs

virtualenv -p /usr/bin/pythonX.Y.Z /home/USUARIO/.venvs/myproject

$ source /home/sammy/.venvs/myproject/bin/activate

$ pip install uwsgi

$ pip install -r project/requirements.txt


2 - Criar um diretorio com arquivos de configuração

$ mkdir config

$ cd config

arquivo config/myproject.service

[Unit]
Description=uWSGI instance to serve myproject
After=network.target

[Service]
User=sammy
Group=www-data
WorkingDirectory=/home/sammy/myproject
Environment="PATH=/home/sammy/.venvs/myproject/bin"
ExecStart=/home/sammy/.venvs/myproject/bin/uwsgi --ini config/myproject.ini

Primeiro esse arquivo cria um serviço uWSGI no systemd que será executado pelo seu suário no grupo www-data, dessa forma o nginx consegue acessar os arquivos.

O diretório de trabalho será o seu /home


arquivo config/myproject.ini

[uwsgi]

socket = /tmp/dominio.com.br.socket
pythonpath = /home/sammy/myproject/
mount = /=wsgi:app
processes = 4
master = true
max-requests = 2000
limit-as = 512
reload-on-as = 256
reload-on-rss = 192
uid = sammy
gid = sammy
chmod-socket = 664
chown-socket = sammy:www-data
no-orphans = true
logto = /home/sammy/uwsgi-%n.log

Aqui linkamos o socket citado no arquivo do nginx também usando o nome do nosso usuário com o grupo www-data


arquivo config/nginx.conf

server {

        listen          80;

        server_name     dominio.com.br;


        access_log /home/samy/myproject/nginx-access.log;

        error_log /home/samy/myproject/nginx-error.log;

        location / {

                try_files $uri @sopa; #$uri.inex.html $uri/;

        }

        location @sopa {

                uwsgi_pass      unix:///tmp/dominio.com.br.socket;

                include         uwsgi_params;

                uwsgi_param     UWSGI_SCHEME $scheme;

                uwsgi_param     SERVER_SOFRWARE nginx/$nginx_version;

        }

}

O arquivo aqui "linka" o socket citado lá no arquivo.ini e nada mais.


Repare que os arquivos estão todos dentro da pasta config, o que vamos fazer é criar links simbólicos para os diretórios importantes.

$ ln -s /home/sammy/config/nginx.conf /etc/nginx/sites-enable
$ ln -s /home/sammy/config/myproject.service /etc/systemd/system/

$ sudo systemctl start myproject.service
$ sudo systemctl enable myproject.service


Comentários

Postagens mais visitadas deste blog

Configurar o web2py no Apache e Ubuntu LTS

Limpando a sujeira para fazer backup

Recursive select with web2py