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.
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment