Paano mag-deploy ng isang application ng Django:

Kumusta ang pagbati sa lahat, ito ang aking unang artikulo sa <» DesdeLinux (de varios que tengo en mis borradores xD), espero les sea de utilidad 😀

Sa gayon, sa aking bago at kasalukuyang trabaho, sa sandaling ito ang paglipat ng maraming mga sistema sa Django ay isinasagawa (gaano kakaiba eh ?? xD) at ang isa sa aking mga gawain, bukod sa pag-unlad, ay ang paglalagay sa produksyon ng mga ito, pagkatapos ay bilang mahusay na mag-aaral, dahil ito ang aking unang pagkakataon sa paglalagay ng isang application sa paggawa sa isang tunay na server: $ Sinimulan kong basahin ang opisyal na dokumento ng bawat isa sa mga kinakailangang mga pakete ng stack (Gunicorn at Supervisord higit sa lahat), at nakikita na ang mga tutorial Sa Espanyol hindi nila gaanong malinaw sa akin sa ilang mga aspeto, nagpasya akong lumikha ng isang mini gabay na may mga hakbang na sinusunod ko upang mailagay ang aplikasyon, batay sa Django, Gunicorn, Supervisord, Nginx at Postgresql stack.

Sa kaso kung saan ako nagtatrabaho, tumatakbo pa rin ang mga server sa Debian Squeeze, ngunit ang gabay ay dapat na ganap na may bisa para sa iba pang mga pamamahagi ... kaya't diretso tayo sa puntong ito at magsimula:

Magtatrabaho ako bilang isang super user. Una sa lahat, ang mga sumusunod na pakete ay kinakailangan:

PIP -> Tool upang mai-install at pamahalaan ang mga pakete para sa Python
aptitude install python-pip

Nginx -> Web server (gagamitin namin ito bilang isang reverse proxy at upang i-cache ang mga static na file na 'img, js, css') I-install namin ito sa:
aptitude install nginx

Supervisord -> Application upang pamahalaan at subaybayan ang aming aplikasyon, kahit na ginagamit ito para sa higit pa. I-install namin ito sa:
aptitude install supervisor

virtualenv -> Tumutulong ito sa amin upang lumikha ng isang pasadyang kapaligiran sa pagpapatupad ng virtual para sa aming aplikasyon. I-install namin ito sa:
aptitude install python-virtualenv

gunicorn -> web server para sa sawa (hindi pa namin ito mai-i-install)

Ipagpalagay ko na dapat na mayroon silang naka-install at na-configure na postgresql

psychopg2 -> Konektor ng Postgresql para sa sawa (hindi pa namin ito mai-i-install)

Lumikha ng virtual na kapaligiran sa virtualenv:

Una ay lilipat kami sa gumaganang direktoryo na gagamitin namin para sa paglalagay:
cd /var/www/

Pagkatapos sa direktoryong ito lilikha kami ng virtual na kapaligiran:
virtualenv ENV-nombreApp

Lumipat kami sa direktoryo na nilikha ko lang virtualenv
cd ENV-nombreAPP

Kinokopya namin ang application sa direktoryo na ito at nagpapatuloy kami upang buhayin ang kapaligiran sa:
source bin/activate

Ang prompt ay dapat magmukhang ngayon (ENV)usuario@host:

Gagawin nito ngayon ang lahat ng aming ginagawa ay nakaimbak sa direktoryo / var / www / ENV-appname / nang hindi nakakaapekto sa mga package ng system

Lumipat kami ngayon sa direktoryo ng application:
cd nombreApp

Nagpapatuloy kaming mai-install ang listahan ng mga dependency ng aplikasyon (kung kinakailangan), kung saan tinukoy ang mga ito sa file mga kinakailangan.txt:
pip install -r requirements.txt

Maaari din kaming mag-install ng mga pakete nang isa-isa, halimbawa, upang mai-install ang konektor ng postgresql:
pip install psycopg2

Pag-install at pagsasaayos ng GUnicorn:

Upang mai-install ito ginagawa namin ito sa parehong paraan:
pip install gunicorn

Ngayon ay i-configure namin ito, para dito lilikha kami ng isang file na tinawag gunicorn-deploy.py sa ugat ng aming aplikasyon, (kahit na ang pangalan ay maaaring maging anumang) kasama ang sumusunod na nilalaman:

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

Pagsasaayos ng Supervisord:

Itakda na natin ang supervisord, para sa iyon binubuo namin ang file ng pagsasaayos kasama

echo_supervisord_conf > /etc/supervisord.conf

Ngayon ay nai-edit namin ang file ng pagsasaayos:
vim /etc/supervisord.conf

At hindi namin pinapansin ang mga sumusunod na linya sa pamamagitan ng pag-aalis ng; (semicolon):

[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] utos = / 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 = Username redirect_stderr = true stdout_logfile = / var / www / logs / appname / supervisord.log

Ngayon ay lilikha kami ng script para sa supervisord upang magsimula sa system, para doon lilikha kami ng file:
vim /etc/init.d/supervisord

At idinagdag namin ang sumusunod na nilalaman:

 # Supervisord auto-start # # paglalarawan: Awtomatikong pagsisimula ng supervisord # proseso ng pangalan: supervisord # pidfile: /var/run/supervisord.pid SUPERVISORD = / usr / local / bin / supervisord SUPERVISORCTL = / usr / local / bin / supervisorctl case $ 1 sa pagsisimula) echo -n "Simula ng superbisor:" $ SUPERVISORD echo ;; huminto) echo -n "Natigil ang superbisor:" $ SUPERVISORCTL shutdown echo ;; restart) echo -n "Natigil ang supervisord:" $ SUPERVISORCTL shutdown echo echo -n "Simula ng supervisord:" $ SUPERVISORD echo ;; na C

At ngayon binibigyan namin ang file ng mga pahintulot upang magsimula ito sa system:
sudo chmod +x /etc/init.d/supervisord

Ina-update namin ang mga link upang simulan ang serbisyo:
sudo update-rc.d supervisord defaults

Sinimulan namin ang serbisyo:
sudo /etc/init.d/supervisord start

Pagse-set up nginx:

Ang hakbang na ito ay medyo simple din, lilikha kami ng sumusunod na file ng pagsasaayos ng nginx para sa aming aplikasyon:

vim /etc/nginx/sites-enabled/nombreApp

At idaragdag namin ang sumusunod na nilalaman sa iyo

server {makinig 9001; # port kung saan nais nilang makinig nginx sa server_name www.domain.com; # o 192.168.0.100, address kung saan mai-access namin ang access_log /var/log/nginx/Appname.access.log; # kung saan magkakaroon kami ng lokasyon ng pag-log ng aplikasyon / {# kung saan tatawag ang nginx kapag na-access ang www.dominio.com/proxy_pass http://127.0.0.1:8001; proxy_set_header Host ng $ http_host; } lokasyon / static / {# kung saan a-access nginx kapag ipinasok namin ang www.dominio.com/static/ alias / var / www / ENV-appname / appname / staticfiles /; }}

At restart namin ang nginx:
service nginx restart

Pagse-set up ng Django:

Baguhin natin ang file ng pagsasaayos ng django:
vim nombreApp/settings.py

Hahanapin namin ang linya na nagsasabi DEBUG = Totoo at binabago namin ang halaga, natitira DEBUG = Mali

Nagdagdag kami ng mga parameter ng DB:

DATABASES = {'default': {'ENGINE': 'django.db.backends.postgresql_psycopg2', # o MySQL, o kung anuman ang 'NAME': 'DBName', 'USER': 'DBUser', 'PASSWORD' ay gumagamit ng : 'password DB', 'HOST': 'localhost', # o ang kailangan nila ng 'PORT': '', # o ang ginagamit nila}}

Hahanapin namin ang linya ALLOWED_HOSTS = [] at idinagdag namin ang domain o ang address kung saan kami makaka-access, na nag-iiwan ng tulad ALLOWED_HOSTS = ['www.domain.com']

I-configure namin ang direktoryo para sa mga static na file, hinahanap namin ang linya na nagsasabing STATIC_ROOT = ' ' at binabago namin ang halaga, inilalagay ang ganap na landas kung saan nais naming maging ang aming mga static na file, sa aking kaso iniwan ko ito ng higit pa o mas kaunti tulad nito STATIC_ROOT='/var/www/ENV-nombreApp/nombreApp/statics/'

Halos tapos na, isinasagawa namin ang sumusunod na utos:
./manage.py collectstatic

Lilikha ito ng isang folder na may pangalang 'mga static sa landas na tinukoy namin sa settings.py ', doon makikita ang lahat ng aming mga static na file.

At sa wakas ay restart namin ang superbisor upang gawin ang mga bagong pagbabago:
supervisorctl restart nombreApp

At iyon ang magiging lahat, sa huli hindi ito masyadong totoo? parang simple lang sa akin 😀

Umaasa ako na ito ay kapaki-pakinabang sa iyo, pagbati 😉

Dokumentasyon ng GUnicorn

Dokumentasyon ng supervisord


9 na puna, iwan mo na ang iyo

Iwanan ang iyong puna

Ang iyong email address ay hindi nai-publish. Mga kinakailangang patlang ay minarkahan ng *

*

*

  1. Responsable para sa data: Miguel Ángel Gatón
  2. Layunin ng data: Kontrolin ang SPAM, pamamahala ng komento.
  3. Legitimation: Ang iyong pahintulot
  4. Komunikasyon ng data: Ang data ay hindi maiparating sa mga third party maliban sa ligal na obligasyon.
  5. Imbakan ng data: Ang database na naka-host ng Occentus Networks (EU)
  6. Mga Karapatan: Sa anumang oras maaari mong limitahan, mabawi at tanggalin ang iyong impormasyon.

  1.   f3niX dijo

    Nauunawaan ko na ang Django app ay hindi dapat mailagay sa ugat ng folder ng web server (/ var / www)? Para sa kaligtasan, hindi ko alam kung mali ako.

    Pagbati.

    1.    urKh dijo

      Lahat tama !!! Ito ay isang bagay na hindi ko namamalayan, ia-update ko ang entry 😛 at sa aking pagbabalik sa Lunes ay gagawa ako ng mga pagbabago sa aplikasyon ng xD
      Salamat

  2.   Rodrigo Bravo (goidor) dijo

    Epale kapatid magandang tutorial. Kamakailan lang ay pareho din ako ngunit sa Debian 7, kailangan kong maghanap at magbasa nang higit pa o mas kaunti. Inirerekumenda ko na lumikha ka ng virtual na kapaligiran ng virtualenv sa bahay ng gumagamit sa isang nakatagong folder.

    Pagbati!

  3.   maglingkod kay fenriz dijo

    hahaha ctm ako kahapon ang pagdodokumento sa Django at dumaan ka na sa galaxy 999999 Pagbati sa mga kalalakihan xD

  4.   daniel2ac dijo

    Napakagandang artikulo =) isang linggo lamang ang nakalilipas na ipinakalat ko ang aking django app ngunit ginawa ko ito sa uwsgi at nginx, alam mo ba kung anong kalamangan ang mayroon ang gunicorn? Marami akong nakita na nabanggit dito.
    Napakasarap na makita na ang django ay nagiging napakapopular, ang katotohanan ay ang pinakamahusay na balangkas na nakita ko =)

  5.   ay ozkan dijo

    Para sa STATIC_ROOT kung ano ang ginagawa ko ay tukuyin ang isang pandaigdigang variable. Isang bagay na tulad nito:

    import os
    PROJECT_PATH = os.path.dirname(os.path.abspath(__file__))
    STATIC_ROOT = os.path.join(PROJECT_PATH, '../backend/static')

    Kung saan ang backend ay isang app na nilikha ko. Kaya't tinitiyak ko na kung saan ko mailalagay ang proyekto, ang pandaigdigang landas ay pareho.

  6.   matalino dijo

    Nakakatuwa, susubukan ko sa hinaharap.

    Sa pamamagitan ng paraan, may nakakaalam ba Paano paganahin ang mga accent at hindi-character na character sa isang django application?

    Tumingin ako kahit saan, wala sa mga sumusunod na pamamaraan ang gumagana para sa akin:
    sys.setdefaultencoding ('utf-8') # sa sites.py

    # - * - coding: utf-8 - * - # sa bawat python file

    Ang pag-edit sa site.py, at paglalagay ng utf-8 sa halip na ang Alexa ay dapat na gumana, ngunit ipinapaalam sa akin ng $ file models.py na ang aking file ay isang Alexa pa rin.

    Anumang mga Mungkahi?

    1.    matalino dijo

      Gumana ito!!!!

  7.   anime230 dijo

    napakahusay na tutorial ngunit magagawa mo ba ang isa kung paano i-upload ang aking app sa isang web server na nasa paggawa na
    salamat