Sunday, March 29, 2015

Flask pe Raspberry cu Postgres, nginx si uwsgi


Raspberry Arch Linux pe ARM. Install guide here

Se presupune ca sistemul e conectat la internet.

pacman -S nginx python2-virtualenv python-virtualenv uwsgi-plugin-python,uwsgi-plugin-python2 python2-setuptools python2-pip posgtresql bash-completion gcc pithon-pip vim htop atpo sudo nload minicom links tcpdump git tmux ntpd zsh

Comanda de mai sus va instala mai multe pachete decat este necesar dar pot folosi în anumite situații de troubleshooting sau compilarea de pachete.

Dupa instalarea postgres este necesara logarea cu userul postgres apoi

initdb --locale en_US.UTF-8 -E UTF8 -D '/var/lib/postgres/data'

Si crearea unui user / rol

[postgres]$ createuser --interactive

In nginx.conf din /etc/nginx putem comenta blocul care defineste serverul pentru ca vom declara serverul in alte fisiere .conf pentru un management mai bun al domeniilor virtuale.

Astfel vom crea o structura a folderelor similara cu ce a apache-ului unde pentru site-urile inacitve exista sites-available si sites-enabled care va contine numai simlink-uri din sites-available. Pentru asta trebuie, pe langa comentarea blocului de server din nginx.conf, adaugam si

http {
   include       mime.types;
   include sites-enabled/*;
   default_type  application/octet-stream;

respectiva optiune pentru ca nginx sa stie de unde va incarca fisierele de config pentru site-uri.

Tree-ul va arata in felul urmator dupa setup.

|-- nginx.conf
|-- sites-available
|   `-- demoapp_nginx.conf
|-- sites-enabled
|   `-- demoapp_nginx.conf -> ../sites-available/demoapp_nginx.conf
|-- uwsgi_params

Definirea serverului din demoapp_nginx.conf

server {
   listen      80;
   server_name localhost;
   charset     utf-8;
   client_max_body_size 75M;
   location / { try_files $uri @yourapplication; }
   location @yourapplication {
       include uwsgi_params;
       uwsgi_pass unix:/var/www/demoapp/demoapp_uwsgi.sock;
   }
}

In mare descrie pe ce port asculta, unde sa gaseasca fisierele si socketul la care se conecteaza cu uwsgi pentru a crea interfata cu python dat fiind ca nginx este doar un webserver si nu serverste decat continut static.

Crearea unui serviciu pentru arch pentru systemd e ciudata dar nginx documentează asta pe sit-ul lor. Vezi aici. Il salvezi in /usr/lib/systemd/system/nginx.service .După asta trebuie activat cu comanda systemctl enable nginx.service. Ulterior se poate porni cu comanda systemd start nginx.

2.

Se face  in /var/www un folder demoapp
Tree-ul final va fi ceva in genul acesta

-- demoapp
   |-- demoapp_uwsgi.ini
   |-- demoapp_uwsgi.sock
   |-- hello.py
   `-- venv

Se da cd in demoapp si se incepe prin crearea containerului virtual care va contine flask, sqlalchemy, psycopg2 si alte trăznăi care fac o aplicație web. Librariile astea e bine sa le ai undeva unde nu va polua sistemul inutil. Pentru asta virtualenv s-a creat.

$virtualenv venv

sau

$virtualenv2.7 venv

diferența este data de care versiune de python vrei sa lucrezi 3.x sau 2.x

va crea un folder venv in folderul demoapp. Daca dam comanda

. venv/bin/activate

va trece din consola bash într-o noua consola virtuala care ne va permite instalarea de pachete python fara sa polueze sistemul.

Mediul este izolat. Astfel încât dacă dam comanda virtualenv2.7 și activam consola, când dam comanda python atunci va face referire la python2.7 nu la versiunea instalata pe sistem care este 3.4 atunci când se executa direct python.

Deci.pip install flask, psycopg, sqlalchemy.Se poate iesi cu comanda deactivate.

3.

Se face un fișier hello.py care va conține următorul cod: (se poate crea chiar dacă sunteți in shell-ul virtual)

from flask import Flask
app = Flask(__name__)

@app.route("/")
def hello():
   return "Hello World!"

if __name__ == "__main__":
   app.run(host='0.0.0.0', port=8080)

se salvează fișierul și se pornește webserverul integrat

python hello.py sau python2.7 hello.py

apoi ne ducem la adresa pe portul 8080 si ar trebui sa raspunda.

4.

Acum ca avem nginx și aplicația web instalata trebuie sa facem sa comunice uwsgi cu cele doua.

Instalam global

pacman -S uwsgi-plugin-python
pacman -S uwsgi-plugin-python2

și definim demoapp_uwsgi.ini

[uwsgi]
#applications base folder
base = /var/www/demoapp

#python module to import
app = hello
module = %(app)

plugins = python2
home = %(base)/venv
pythonpath = %(base)

#socket file location
socket = /var/www/demoapp/%n.sock

#permission for the socket file
chmod-socket = 666
# the variable that holds a flask application inside the module imported
callable  = app

#location of log file
logto = /var/log/uwsgi/%n.log

Se pornește cu comanda

uwsgi --plugin python2 --ini /var/www/demoapp/demoapp_uwsgi.ini

opțiunea plugin este doar daca aplicația web folosește python2.Toate bune si frumoase numai ca pornirea uwsgi asa e aiurea.

Când am instalat uwsgi in /etc/uwsgi un fisier emperor.ini. Mai trebuie sa creeam un folder vassals. Ideea este ca aplicația poate funcționa pe post de superserver care sa spawneze instante pentru cate aplicatii ai, pe langa asta putem porni la startup astfel încât sa avem comunicare cu aplicația si sa nu avem doar webserverul up.

Folderul vassals va conține un simlink catre fisierul ini care se afla in /var/www/demoapp.

systemctl start emperor.uwsgi va porni master-ul si slave-ul va porni dacă va exista un fisier de config in vassals.

 

No comments:

Post a Comment