Posts Tagged ‘PostgreSQL’

Django, Nginx, uWsgi, PostgreSQL, Virtualenv, Ubuntu 12.04 LTS

Instalarea Django impreuna cu serverul Web Nginx presupune urmarea mai multor pasi si anume, in prima faza instalarea aplicatiilor pe care platforma Django va rula:

sudo apt-get install nginx uwsgi uwsgi-plugin-python python-virtualenv libpq-dev python-dev

Dupa instalarea aplicatiilor de mai sus se instaleaza serverul de baze de date PostgreSQL:

sudo apt-get install postgresql python-psycopg2

Pentru ca acesta sa poata fi folosit, trebuie sa aiba o parola definita si apoi sa se creeze baza de date:
Se face conectarea la PostgreSQL:

sudo -u postgres psql template1

Se aloca o parola userului postgres:

ALTER USER postgres with encrypted password ‘strong_password’;

Dupa ce ce au fost urmate aceste proceduri se trece la crearea unui user, baza de date si alocarea privilegiilor userului asupra bazei de date:

CREATE DATABASE djangoweb;
CREATE USER django WITH PASSWORD ‘django_user_pass’;
GRANT ALL PRIVILEGES ON DATABASE django TO djangoweb;

Acum mai trebuie sa editam fisierul: /etc/postgresql/9.1/main/pg_hba.conf unde modificam urmatoarele linii:

local all postgres peer
CU
local all postgres md5

local all all peer
CU
local all all md5

evident se pot folosi si alte metode, dar am ales-o pe aceasta cu md5.
Ca setarile sa fie active se restarteaza serverul PostgresSQL cu comanda:

/etc/init.d/postgresql restart

Testarea userului creat se poate face ruland:

psql -d django -U django

Acum urmeaza instalarea Django, care o voi face foolosind Virtualenv, acesta fiind un environment virtual care ruleaza cu un alt user fata de cel principal (root?) intrucat daca pe un server avem mai multe aplicatii sa nu fie cazul ca pentru fiecare aplicatie sa incarcam modulele de pe toate celalate aplicatii.

Astfel creem grupul si userul djangoweb, si am ales sa stochez proiectul in /var/sites/djangoweb care va fi si home directory pentru userul djangoweb.

groupadd djangoweb

useradd -s /bin/bash -d /var/sites/djangoweb -m -g djangoweb djangoweb

caruia ii putem aloca mai apoi si o parola.

Acum ca avem userul creat ne logam cu acel user ruland comanda:

sudo -u djangoweb -i

unde folosind virtualenv creem proiectul djangoweb:

virtualenv djangoweb

cd djangoweb

activam virtual env folosind comanda:

source bin/activate

si instalam django folosind pip install:

pip install django

Si bine-nteles creem proiectul pe care eu am ales sa il numesc tot djangoweb:

django-admin.py startproject djangoweb

si aici observam ca s-a creat un folder djangoweb in interiorul folderului /var/sites/djangoweb. Urmeaza acum sa facem conectarea la baza de date PorstgreSQL

Editam fisierul /var/sites/djangoweb/djangoweb/settings.py unde adaugam liniile:

import os.path
PROJECT_DIR = os.path.dirname(__file__)

si evident facem setupul la baza de date creata adineauri cu PostgreSQL:

DATABASES = {
‘default’: {
‘ENGINE’: ‘django.db.backends.postgresql_psycopg2’, # Add ‘postgresql_psycopg2’, ‘mysql’, ‘sqlite3’ or ‘oracle’.
‘NAME’: ‘djangoweb’, # Or path to database file if using sqlite3.
‘USER’: ‘djangoweb’, # Not used with sqlite3.
‘PASSWORD’: ‘django_user_passwd’, # Not used with sqlite3.
‘HOST’: ”, # Set to empty string for localhost. Not used with sqlite3.
‘PORT’: ”, # Set to empty string for default. Not used with sqlite3.
}
}

De asemenea decomentam linia ‘django.contrib.admin’ de la INSTALLED_APPS astfel ca trebuie sa arate cam asa:

INSTALLED_APPS = (
‘django.contrib.auth’,
‘django.contrib.contenttypes’,
‘django.contrib.sessions’,
‘django.contrib.sites’,
‘django.contrib.messages’,
‘django.contrib.staticfiles’,
# Uncomment the next line to enable the admin:
‘django.contrib.admin’,
# Uncomment the next line to enable admin documentation:
# ‘django.contrib.admindocs’,
)

Editam apoi fisierul /var/sites/djangoweb/urls.py unde decomentam liniile:

from django.contrib import admin
admin.autodiscover()

url(r’^admin/’, include(admin.site.urls)),

Astfel ca fisierul sa arate asa:

from django.conf.urls import patterns, include, url

# Uncomment the next two lines to enable the admin:
from django.contrib import admin
admin.autodiscover()

urlpatterns = patterns(”,
# Examples:
# url(r’^$’, ‘myproject.views.home’, name=’home’),
#url(r’^myproject/’, include(‘myproject.foo.urls’)),

# Uncomment the admin/doc line below to enable admin documentation:
# url(r’^admin/doc/’, include(‘django.contrib.admindocs.urls’)),

# Uncomment the next line to enable the admin:
url(r’^admin/’, include(admin.site.urls)),
)

Atentie la indentare ca Python tine cont de asta.

Acum urmeaza sincronizarea bazei de date unde se creeaza tabelele:

pip install psycopg2

chmod +x manage.py

python manage.py syncdb

si tot aici se creeaza userul de administrator al Django:

Creating tables …
Creating table auth_permission
Creating table auth_group_permissions
Creating table auth_group
Creating table auth_user_user_permissions
Creating table auth_user_groups
Creating table auth_user
Creating table django_content_type
Creating table django_session
Creating table django_site
Creating table django_admin_log

You just installed Django’s auth system, which means you don’t have any superusers defined.
Would you like to create one now? (yes/no): yes
Username (leave blank to use ‘root’): admin
E-mail address: user@domeniu.tld
Password:
Password (again):
Superuser created successfully.
Installing custom SQL …
Installing indexes …
Installed 0 object(s) from 0 fixture(s)

Acum ca totul a decurs corect, putem testa Django fara sa avem serverul web functional, folosind serverul de debug, ruland comanda:
python manage.py runserver 0.0.0.0:80 #unde 0.0.0.0:8080 inseamna ca poate fi accesat de oriunde din internet pe portul 8080.
Rezultatul daca totul a decurs bine trebuie sa arate asa:

Validating models…

0 errors found
Django version 1.4, using settings ‘myproject.settings’
Development server is running at http://0.0.0.0:80/
Quit the server with CONTROL-C.

Daca este totul ok, putem configura serverul web Nginx, unde creem un VirtualHost numit Djangoweb:

vim /etc/nginx/sites-available/djangoweb

unde adaugam:

server {
server_name „”;
listen 80;

root /var/sites/djangoweb/djangoweb/djangoweb;

location /static/ {
alias /var/sites/djangoweb/djangoweb/lib/python2.7/site-packages/django/contrib/admin/static/;
}

location / {
include uwsgi_params;
client_max_body_size 256M;
uwsgi_pass unix:/var/run/uwsgi/app/djangoweb/socket;
uwsgi_send_timeout 60;
uwsgi_read_timeout 60;
uwsgi_connect_timeout 60;
}
}

Ca sa fie enable acest VirtualHost facem symlink in sites-enabled:

ln -s /etc/nginx/sites-available/djangoweb /etc/nginx/sites-enabled/

Pentru uWsgi fisierul de configurare il adaugam in /etc/uwsgi/apps-available

sudo vim /etc/uwsgi/apps-available/djangoweb

uwsgi:
uid: djangoweb
gid: djangoweb
env: DJANGO_SETTINGS_MODULE=djangoweb.settings
chdir: /var/sites/djangoweb/djangoweb/djangoweb/
pythonpath: /var/sites/djangoweb/djangoweb/djangoweb/
virtualenv: /var/sites/djangoweb/djangoweb/
module: djangoweb.wsgi:application
chmod-socket: 666
touch-reload: /var/sites/djangoweb/djangoweb/djangoweb/.uwsgi_reload
buffer-size: 32768

Ca aceasta aplicatie uWsgi sa fie enable ii creem un symlink in apps-enabled:

ln -s /etc/uwsgi/apps-available/djangoweb /etc/uwsgi/apps-enabled/

De asemenea creem si fisierul .uwsgi_reload care este apelat din uwsgi:

touch /var/sites/djangoweb/djangoweb/djangoweb/.uwsgi_reload

La final restartam Nginx, uWsgi si PostgreSQL:

sudo /etc/init.d/nginx restart
sudo /etc/init.d/uwsgi restart
sudo /etc/init.d/postgresql restart

Atentie ! Unele setari din acest tutorial este posibil sa nu se potriveasca cu ceea ce aveti pe serverul vostru. In cazul in care ceva nu functioneaza corect consultati logurile, iar pentru orice adaugari la acest tutorial va rog sa scrieti un comentariu si voi tine cont de el.

P.S. Sper ca nu v-am zapacit (tare) cu atatea directoare „djangoweb” 🙂 . Pe viitor o sa folosesc nume mai diferite 🙂

Probleme aparute pe parcursul instalarii:
1. Unele pachete lipseau si a fost nevoie sa fie instalate manual ulterior. Am mai completat in tutorial, dar e posibil ca unele sa le fi omis.
2. Probleme cu socketul uWsgi care nu putea fi accesat corect. Trebuie verificate drepturile asupra fisierelor.
3. Erori de tipul „upstream prematurely closed connection” care apareau din cauza la unele linii declarate incorect in uWsgi.
4. Problema cu incarcarea CSS-urilor pe care am rezolvat-o prin alocarea linkului spre /static din VirtualHost Nginx.
5. Erori de tipul: „current transaction is aborted commands ignored until end of transaction block django” care a aparut din cauza ca nu a fost corect sincronizata baza de date si am rezolvat prin rularea: python manage.py syncdb apoi restart la Nginx, uWsgi, PostgreSQL
6. Probleme de indentare in settings.py sau urls.py

Pe parcursul instalarii m-am consultat si cu documentatia de pe situel orifial Django: https://docs.djangoproject.com/en/dev/intro/

srv StandDuPp
Articole recente