Et si vous saluiez tout le monde, ceci est mon premier article dans <» DesdeLinux (parmi plusieurs que j'ai dans mes brouillons xD), j'espère que cela vous sera utile 😀
Eh bien, dans mon nouveau travail actuel, en ce moment la migration de plusieurs systèmes vers Django est en cours (c'est étrange hein ?? xD) et l'une de mes tâches, en dehors du développement, est de les mettre en production, alors comment bon apprenti, puisque c'était la première fois que je mettais une application en production sur un vrai serveur: $ j'ai commencé à lire la doc officielle de chacun des packages requis de la pile (Gunicorn et Supervisord surtout), et en voyant que les tutoriels En espagnol, ils n'étaient pas très clairs pour moi sur certains aspects, j'ai décidé de créer un mini guide avec les étapes que j'ai suivies pour mettre l'application en production, basé sur la pile Django, Gunicorn, Supervisord, Nginx et Postgresql.
Dans le cas où je travaille, les serveurs exécutent toujours Debian Squeeze, mais le guide devrait être entièrement valide pour les autres distributions ... alors allons droit au but et commençons:
Je travaillerai en tant que super utilisateur. Tout d'abord, les packages suivants sont requis:
PIP -> Outil pour installer et gérer les packages pour Python
aptitude install python-pip
Nginx -> Serveur Web (nous l'utiliserons comme proxy inverse et pour mettre en cache les fichiers statiques 'img, js, css') Nous l'installons avec:
aptitude install nginx
Superviseur -> Application pour gérer et surveiller notre application, même si elle est utilisée pour beaucoup plus. Nous l'installons avec:
aptitude install supervisor
Environnement virtuel -> Cela nous aide à créer un environnement d'exécution virtuelle personnalisé pour notre application. Nous l'installons avec:
aptitude install python-virtualenv
Gunicorn -> serveur web pour python (nous ne l'installerons pas encore)
Je suppose qu'ils devraient déjà avoir postgresql installé et configuré
psychopg2 -> Connecteur Postgresql pour python (nous ne l'installerons pas encore non plus)
Créez un environnement virtuel avec virtualenv:
Nous allons d'abord passer au répertoire de travail que nous utiliserons pour la mise en production:
cd /var/www/
Ensuite, dans ce répertoire, nous allons créer l'environnement virtuel:
virtualenv ENV-nombreApp
Nous passons au répertoire que je viens de créer virtualenv
cd ENV-nombreAPP
Nous copions l'application dans ce répertoire et maintenant nous procédons à l'activation de l'environnement avec:
source bin/activate
L'invite devrait maintenant ressembler à (ENV)usuario@host:
Cela fera maintenant que tout ce que nous faisons est stocké dans le répertoire / var / www / ENV-appname / sans affecter les packages système
Maintenant, nous passons au répertoire de l'application:
cd nombreApp
Nous procédons à l'installation de la liste des dépendances d'application (si nécessaire), dans laquelle elles sont spécifiées dans le fichier conditions.txt:
pip install -r requirements.txt
Nous pouvons également installer des packages individuellement, par exemple pour installer le connecteur de PostgreSQL:
pip install psycopg2
Installation et configuration de GUnicorn:
Pour l'installer, nous le faisons de la même manière:
pip install gunicorn
Maintenant, nous allons le configurer, pour cela nous allons créer un fichier appelé gunicorn-deploy.py à la racine de notre application, (bien que le nom puisse être n'importe quoi) avec le contenu suivant:
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
Configuration du superviseur:
Maintenant, définissons le superviseur, pour cela nous générons le fichier de configuration avec
echo_supervisord_conf > /etc/supervisord.conf
Maintenant, nous éditons le fichier de configuration:
vim /etc/supervisord.conf
Et nous décommentons les lignes suivantes en supprimant le; (point-virgule):
[serveur_unix_http] file = / tmp / supervisor.sock [superviseur] logfile = / var / log / supervisord.log logfile_maxbytes = 50 Mo 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: [programme: appname] command = / 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
Maintenant, nous allons créer le script pour supervisord pour démarrer avec le système, pour cela nous allons créer le fichier:
vim /etc/init.d/supervisord
Et nous ajoutons le contenu suivant:
# Démarrage automatique du superviseur # # description: Démarrage automatique du superviseur # processname: supervisord # pidfile: /var/run/supervisord.pid SUPERVISORD = / usr / local / bin / supervisord SUPERVISORCTL = / usr / local / bin / supervisorctl case $ 1 au début) echo -n "Démarrage du superviseur:" $ SUPERVISORD echo ;; stop) echo -n "Arrêt du superviseur:" $ SUPERVISORCTL shutdown echo ;; restart) echo -n "Arrêt du superviseur:" $ SUPERVISORCTL shutdown echo echo -n "Démarrage du superviseur:" $ SUPERVISORD echo ;; Cette c
Et maintenant, nous donnons des autorisations d'exécution au fichier afin qu'il puisse démarrer avec le système:
sudo chmod +x /etc/init.d/supervisord
Nous mettons à jour les liens pour démarrer le service:
sudo update-rc.d supervisord defaults
Nous démarrons le service:
sudo /etc/init.d/supervisord start
Configuration de nginx:
Cette étape est également assez simple, nous allons créer le fichier de configuration suivant de nginx pour notre application:
vim /etc/nginx/sites-enabled/nombreApp
Et nous vous ajouterons le contenu suivant
serveur {écoute 9001; # port où ils veulent que nginx écoute nom_serveur www.domaine.com; # ou 192.168.0.100, adresse à laquelle nous accéderons access_log /var/log/nginx/Appname.access.log; # où nous aurons l'emplacement du journal d'application / {# où nginx appellera lors de l'accès à www.dominio.com/ proxy_pass http://127.0.0.1:8001; proxy_set_header Host $ http_host; } location / static / {# où nginx accédera lorsque nous entrons dans www.dominio.com/static/ alias / var / www / ENV-appname / appname / staticfiles /; }}
Et nous redémarrons nginx:
service nginx restart
Configurer Django:
Modifions le fichier de configuration de django:
vim nombreApp/settings.py
Nous cherchons la ligne qui dit DEBUG = True et nous changeons la valeur, restant DEBUG = False
Nous ajoutons les paramètres DB:
DATABASES = {'default': {'ENGINE': 'django.db.backends.postgresql_psycopg2', # ou mysql, ou tout ce qu'ils utilisent 'NAME': 'DBName', 'USER': 'DBUser', 'PASSWORD' : 'password DB', 'HOST': 'localhost', # ou celui dont ils ont besoin 'PORT': '', # ou celui qu'ils utilisent}}
Nous cherchons la ligne ALLOWED_HOSTS = [] et nous ajoutons le domaine ou l'adresse via laquelle nous allons accéder, laissant quelque chose comme ALLOWED_HOSTS = ['www.domaine.com']
Nous configurons le répertoire pour les fichiers statiques, nous cherchons la ligne qui dit STATIC_ROOT = ' '
et nous changeons la valeur, en plaçant le chemin absolu où nous voulons que nos fichiers statiques soient, dans mon cas je l'ai laissé plus ou moins comme ça STATIC_ROOT='/var/www/ENV-nombreApp/nombreApp/statics/'
Presque terminé, nous exécutons la commande suivante:
./manage.py collectstatic
Cela créera un dossier avec le nom 'statique dans le chemin que nous spécifions dans le settings.py », c'est là que tous nos fichiers statiques seront.
Et enfin nous redémarrons le superviseur pour prendre les nouveaux changements:
supervisorctl restart nombreApp
Et ce serait tout, à la fin ce n'était pas tellement vrai? ça m'a paru simple 😀
J'espère que cela vous sera utile, salutations 😉
Je comprends que l'application Django ne doit pas être placée à la racine du dossier du serveur Web (/ var / www)? Par sécurité, je ne sais pas si je me trompe.
Salutations.
Toute la raison!!! C'était quelque chose que j'ignorais totalement, je mettrai à jour l'entrée 😛 et dès que je reviendrai lundi, je ferai des changements dans l'application xD
merci
Epale frère bon tutoriel. Récemment j'étais aussi dans le même mais dans Debian 7, je devais chercher et lire plus ou moins. Je vous recommande de créer l'environnement virtuel de virtualenv dans la maison de l'utilisateur dans un dossier caché.
Salutations!
hahaha ctm J'ai documenté hier Django et vous êtes déjà en train de traverser la galaxie 999999 Salutations hommes xD
Très bon article =) il y a à peine une semaine, j'ai déployé mon application django mais je l'ai fait avec uwsgi et nginx, savez-vous quel avantage gunicorn a? Je l'ai vu beaucoup mentionné.
C'est agréable de voir que django devient très populaire, la vérité est le meilleur framework que j'ai vu =)
Pour le STATIC_ROOT ce que je fais est de définir une variable globale. Quelque chose comme cela:
import os
PROJECT_PATH = os.path.dirname(os.path.abspath(__file__))
STATIC_ROOT = os.path.join(PROJECT_PATH, '../backend/static')
Où backend est une application que j'ai créée. De cette façon, je m'assure que là où je déploie le projet, le chemin global est le même.
Intéressant, je vais essayer dans le futur.
Au fait, est-ce que quelqu'un sait comment activer les accents et les caractères non-ascii dans une application django?
J'ai cherché partout, aucune des méthodes suivantes ne fonctionne pour moi:
sys.setdefaultencoding ('utf-8') # dans sites.py
# - * - codage: utf-8 - * - # dans chaque fichier python
Editer site.py et mettre utf-8 au lieu de ascii est censé fonctionner, mais $ file models.py m'informe que mon fichier est toujours un ascii.
Aucune suggestion?
Ça a marché!!!!
très bon tutoriel mais pourriez-vous faire une des façons de télécharger mon application sur un serveur Web déjà en production
merci