Kiel pri saluto al ĉiuj, jen mia unua artikolo en <»El Linukso (el kelkaj, kiujn mi havas en miaj projektoj xD), mi esperas, ke ĝi estos utila 😀
Nu, en mia nova kaj aktuala laboro, nuntempe la migrado de pluraj sistemoj al Django efektivigas (kiel strange ĉu ?? xD) kaj unu el miaj taskoj, krom disvolviĝo, estas la produktado de ĉi tiuj, tiam kiel bona metilernanto, ĉar ĝi estis la unua fojo, ke mi produktis programon sur vera servilo: $ Mi komencis legi la oficialan dokumenton de ĉiu el la bezonataj pakoj de la stako (Gunicorn kaj Supervisord pli ol ĉiuj), kaj vidante, ke la lerniloj En la hispana ili ne estis tre klaraj al mi laŭ iuj aspektoj, mi decidis krei mini-gvidilon kun la paŝoj, kiujn mi sekvis por produkti la programon, surbaze de la stako Django, Gunicorn, Supervisord, Nginx kaj Postgresql.
Se mi laboras, la serviloj ankoraŭ funkcias Debian Squeeze, sed la gvidilo estu plene valida por aliaj distribuoj ... do ni iru rekte al la afero kaj komencu:
Indekso
Mi laboros kiel superuzanto. Unue necesas la jenaj pakoj:
Pip -> Ilo por instali kaj administri pakojn por Python
aptitude install python-pip
Nginx -> Retservilo (ni uzos ĝin kiel inversan prokurilon kaj kaŝmemorigos la statikajn dosierojn 'img, js, css') Ni instalas ĝin per:
aptitude install nginx
Kontrolisto -> Apliko por administri kaj kontroli nian aplikaĵon, kvankam ĝi estas uzata por multe pli. Ni instalas ĝin per:
aptitude install supervisor
virtualenv -> Ĝi helpas nin krei personecigitan virtualan ekzekutan medion por nia programo. Ni instalas ĝin per:
aptitude install python-virtualenv
Gunicorno -> retservilo por python (ni ankoraŭ ne instalos ĉi tion)
Mi supozas, ke ili jam devas havi postgresql instalitan kaj agorditan
psikopg2 -> Postgresql-konektilo por python (ni ankaŭ ne instalos ĝin ankoraŭ)
Kreu virtualan medion per virtualenv:
Unue ni transiros al la labora dosierujo, kiun ni uzos por produkti:
cd /var/www/
Tiam en ĉi tiu dosierujo ni kreos la virtualan medion:
virtualenv ENV-nombreApp
Ni moviĝas al la dosierujo, kiun mi ĵus kreis virtualenv
cd ENV-nombreAPP
Ni kopias la aplikaĵon en ĉi tiu dosierujo kaj nun ni aktivigas la medion per:
source bin/activate
La peto nun aspektas kiel (ENV)usuario@host:
Ĉi tio nun faros, ke ĉio, kion ni faros, estas konservita en la dosierujo / var / www / ENV-appname / sen tuŝi sistemajn pakaĵojn
Nun ni moviĝas al la aplika dosierujo:
cd nombreApp
Ni procedas por instali la liston de dependaj programoj (se necese), en kiuj ili estas specifitaj en la dosiero postuloj.txt:
pip install -r requirements.txt
Ni ankaŭ povas instali pakaĵojn individue, ekzemple por instali la konektilon de postgreska:
pip install psycopg2
Instalado kaj agordo de GUnicorn:
Por instali ĝin ni faras ĝin same:
pip install gunicorn
Nun ni agordos ĝin, por tio ni kreos dosieron nomatan gunicorn-deploy.py en la radiko de nia aplikaĵo, (kvankam la nomo povas esti io ajn) kun la jena enhavo:
bind = "127.0.0.1:8001" # dirección a donde accederá Nginx
logfile = "/var/www/logs/nombreApp/gunicorn.log" # dirección donde estarán los logs de la aplicación
workers = 1 # dependerá en medida de la carga de trabajo que tenga la aplicación, también depende del hardware con que se cuente
loglevel = 'info' # tipo de logging
Konfiguracio de Supervisord:
Nun ni starigu la kontrolisto, por tio ni generas la agordan dosieron per
echo_supervisord_conf > /etc/supervisord.conf
Nun ni redaktas la agordan dosieron:
vim /etc/supervisord.conf
Kaj ni komentas la jenajn liniojn forigante la; (punktokomo):
[unix_http_server] file = / tmp / supervisor.sock [supervisord] logfile = / var / log / supervisord.log logfile_maxbytes = 50MB logfile_backups = 10 loglevel = debug pidfile = / var / run / supervisord.pid nodaemon = false minfds = 1024 minprocs = 200 [rpcinterface: supervisor] supervisor.rpcinterface_factory = supervisor.rpcinterface: make_main_rpcinterface [supervisorctl] serverurl = unix: [program: appname] komando = / var / www / ENV-appname / bin / django_unicorn -c / var / www / ENV -appname / appname / gunicorn-deploy.py directory = / var / www / ENV-appname / appname / autostart = true autorestart = true user = uzantnomo redirect_stderr = vera stdout_logfile = / var / www / logs / appname / supervisord.log
Nun ni kreos la skripton por supervisord komenci per la sistemo, por tio ni kreos la dosieron:
vim /etc/init.d/supervisord
Kaj ni aldonas la jenan enhavon:
# Supervisord auto-start # # description: Aŭtomate startas supervisord # processname: supervisord # pidfile: /var/run/supervisord.pid SUPERVISORD = / usr / local / bin / supervisord SUPERVISORCTL = / usr / local / bin / supervisorctl case $ 1 en komenco) echo -n "Komenca superreganto:" $ SUPERVISORD echo ;; stop) echo -n "Stopping supervisord:" $ SUPERVISORCTL shutdown echo ;; restart) echo -n "Stopping supervisord:" $ SUPERVISORCTL shutdown echo echo -n "Starting supervisord:" $ SUPERVISORD echo ;; ke C
Kaj nun ni donas al la dosiero ekzekutajn permesojn, por ke ĝi komencu per la sistemo:
sudo chmod +x /etc/init.d/supervisord
Ni ĝisdatigas la ligojn por komenci la servon:
sudo update-rc.d supervisord defaults
Ni komencas la servon:
sudo /etc/init.d/supervisord start
Agordi nginx:
Ĉi tiu paŝo ankaŭ estas sufiĉe simpla, ni kreos la jenan agordan dosieron de nginx por nia kandidatiĝo:
vim /etc/nginx/sites-enabled/nombreApp
Kaj ni aldonos la sekvan enhavon al vi
servilo {aŭskultu 9001; # haveno, kie ili volas, ke nginx aŭskultu servilnomon www.domajno.com; # aŭ 192.168.0.100, adreso al kiu ni aliros access_log /var/log/nginx/Appname.access.log; # kie ni havos la registran lokon de la aplikaĵo / {# kie nginx telefonos alirante www.dominio.com/ proxy_pass http://127.0.0.1:8001; proxy_set_header Gastiganto $ http_host; } loko / statika / {# kie nginx aliros kiam ni eniros www.domain.com/static/ alias / var / www / ENV-appname / appname / staticfiles /; }}
Kaj ni rekomencas nginx:
service nginx restart
Starigi Django:
Ni modifu la agordan dosieron django:
vim nombreApp/settings.py
Ni serĉas la linion, kiu diras DEBUG = Vera kaj ni ŝanĝas la valoron, restanta DEBUG = Falsa
Ni aldonas la DB-parametrojn:
DATABASES = {'default': {'ENGINE': 'django.db.backends.postgresql_psycopg2', # aŭ mysql, aŭ kion ajn ili uzas 'NAME': 'DBName', 'USER': 'DBUser', 'PASSWORD' : 'pasvorto DB', 'HOST': 'localhost', # aŭ tiu, kiun ili bezonas 'PORT': '', # aŭ tiu, kiun ili uzas}}
Ni serĉas la linion ALLOWED_HOSTS = [] kaj ni aldonas la domajnon aŭ la adreson per kiuj ni aliros, lasante ion similan ALLOWED_HOSTS = ['www.domajno.com']
Ni agordas la dosierujon por la statikaj dosieroj, ni serĉas la linion, kiu diras STATIC_ROOT = ' '
kaj ni ŝanĝas la valoron, metante la absolutan vojon kie ni volas, ke niaj statikaj dosieroj estu, en mia kazo mi lasis ĝin pli-malpli tiel STATIC_ROOT='/var/www/ENV-nombreApp/nombreApp/statics/'
Preskaŭ finita, ni plenumas la jenan komandon:
./manage.py collectstatic
Ĉi tio kreos dosierujon kun la nomo 'statiko en la vojo, kiun ni specifas en la settings.py ', jen ĉiuj niaj statikaj dosieroj.
Kaj fine ni rekomencas la kontroliston por preni la novajn ŝanĝojn:
supervisorctl restart nombreApp
Kaj jen ĉio, finfine ĝi ne estis tiel vera? ŝajnis al mi simpla 😀
Mi esperas, ke ĝi utilas al vi, salutojn 😉
9 komentoj, lasu la viajn
Mi komprenas, ke la programo Django ne devas esti metita en la radikon de la teko-servila dosierujo (/ var / www)? Por sekureco, mi ne scias, ĉu mi eraras.
Salutojn.
Bone !!! Ĝi estis io, kion mi tute ne sciis, mi ĝisdatigos la eniron 😛 kaj tuj kiam mi revenos lundon, mi faros ŝanĝojn en la xD-aplikaĵo
danke
Epale frato bona lernilo. Lastatempe mi ankaŭ estis en la sama sed en Debian 7, mi devis serĉi kaj legi pli-malpli. Mi rekomendas al vi krei la virtualan medion de virtualenv en la hejmo de la uzanto en kaŝita dosierujo.
Dankon!
hahaha ctm mi hieraŭ dokumentis Django kaj vi jam trapasas la galaksion 999999 Salutojn viroj xD
Tre bona artikolo =) antaŭ nur unu semajno mi deplojis mian django-programon sed mi faris ĝin per uwsgi kaj nginx, ĉu vi scias, kian avantaĝon havas gunicorno? Mi vidis ĝin mencii multe.
Estas agrable vidi, ke django fariĝas tre populara, la vero estas la plej bona kadro, kiun mi vidis =)
Por la STATIC_ROOT kion mi faras estas difini tutmondan variablon. Io tia:
import os
PROJECT_PATH = os.path.dirname(os.path.abspath(__file__))
STATIC_ROOT = os.path.join(PROJECT_PATH, '../backend/static')
Kie backend estas programo, kiun mi kreis. Do mi certigas, ke kie mi disvolvas la projekton, la tutmonda vojo estas la sama.
Interese, mi provos estontece.
Cetere, ĉu iu scias kiel ebligi supersignojn kaj ne-ascii-signojn en django-aplikaĵo?
Mi rigardis ĉien, neniu el la sekvaj metodoj funkcias por mi:
sys.setdefaultencoding ('utf-8') # en sites.py
# - * - kodigo: utf-8 - * - # en ĉiu pitona dosiero
Redakti site.py, kaj meti utf-8 anstataŭ ascii supozeble funkcias, sed $ file models.py informas min, ke mia dosiero ankoraŭ estas ascii.
Iuj Sugestoj?
Ĝi funkciis!!!!
tre bona lernilo, sed vi povus fari unu el la manieroj por alŝuti mian programon en retservilo jam produktanta
gracias