Comment héberger Django avec Nginx sur Ubuntu 18.04 Bionic Beaver Linux
Objectif
Installez et configurez Ubuntu 18.04 pour héberger le framework Django.
Distribution
Ubuntu 18.04
Exigences
Une installation de travail d'Ubuntu 18.04 avec les privilèges racine
Difficulté
Moyen
Conventions
- # - Exige que les commandes Linux soient exécutées avec des privilèges racine soit directement en tant qu'utilisateur racine, soit par l'utilisation de la commande
sudo - $ - Exige que les commandes Linux soient exécutées en tant qu'utilisateur régulier non privilégié
Présentation
Si vous cherchez à créer et à héberger des applications Web avec Python, Django est le choix le plus populaire. Étant donné que Python est si étroitement intégré dans le Linux, il n'est pas trop difficile de mettre en place un serveur Django sur Ubuntu.
Il n'y a pas de moyen défini d'accueillir des projets Django, mais une pile composée de Postgresql, Nginx, Gunicorn et Django est à peu près la norme.
Installez les packages
Avant de commencer, vous devez installer les packages requis. Il n'y en a pas beaucoup, mais assurez-vous de désactiver Apache ou tout autre serveur Web fonctionnant sur le port 80 avant de commencer.
$ sudo apt install python3 python3-venv nginx postgresqlCréer la base de données
Vous devrez également créer une base de données pour stocker les informations de votre application Django. PostgreSQL va remplir ce rôle. Si vous n'avez jamais utilisé PostgreSQL auparavant, ce n'est pas tout à fait la même que MySQL. Sa syntaxe est différente et il gère également les connexions de l'utilisateur différemment.
Pour vous connecter à PostgreSQL et le gérer, vous devez utiliser l'utilisateur postgres sur votre machine qui a été créé lorsque vous avez installé le package PostgreSQL. Passez à cet utilisateur avec su .
$ sudo su postgresUne fois que vous êtes sur l'utilisateur postgres , vous accédez à votre base de données avec la commande psql .
Après vous être connecté, vous devez ajouter un mot de passe à votre utilisateur d'administration avant de faire quoi que ce soit d'autre.
postgres=# ALTER USER postgres WITH ENCRYPTED PASSWORD 'yourpassword';Ensuite, créez votre base de données.
postgres=# CREATE DATABASE your_db;Créez un nouvel utilisateur ordinaire pour gérer la base de données. Il s'agit de l'utilisateur avec lequel Django se connectera.
postgres=# CREATE ROLE django_user WITH ENCRYPTED PASSWORD 'yourpassword';Ensuite, accordez aux autorisations de l'utilisateur d'utiliser la base de données.
postgres=# GRANT ALL PRIVILEGES ON DATABASE your_db TO django_user;Lorsque vous avez terminé, quittez avec \q . Quittez également l'utilisateur postgres .
Configurez votre répertoire
Ce n'est généralement pas une excellente idée d'installer à l'échelle du système Python. Il est beaucoup plus difficile de gérer les versions de package et de garder tout stable.
Python 3 prend en charge les environnements virtuels qui vous permettent de compartimenter vos projets Python par répertoire. Chaque environnement a son propre ensemble de packages Python, et vous pouvez les installer et les gérer en tant qu'utilisateur ordinaire.
Choisissez l'endroit où vous souhaitez héberger votre site Web. /var/www/volet est généralement un bon choix. Utilisez la commande intégrée pour créer votre environnement virtuel.
$ sudo python3 -m venv /var/www/yoursiteAllez dans votre répertoire et activez-le.
$ cd /var/www/yoursitesource bin/activateLorsque vous avez terminé dans le répertoire, vous pouvez facilement le désactiver.
$ deactivateInstaller django
Avec votre environnement virtuel démarré, vous pouvez installer Django lui-même avec quelques autres packages Python dont vous aurez besoin pour tout connecter.
$ pip install django psycopg2 gunicornCela prendra quelques secondes, mais PIP installera tout ce dont vous avez besoin pour configurer votre projet Django.
Créer un projet Django
Maintenant que vous avez Django, vous pouvez réellement créer votre projet. Assurez-vous que vous êtes dans votre environnement virtuel et que vous les activez.
$ django-admin startproject your-projectUne fois que vous aurez votre projet, vous devrez modifier la configuration pour configurer votre base de données. Par défaut, Django est configuré pour utiliser SQLite3 comme base de données. C’est plus à des fins de développement. Pour utiliser PostgreSQL, vous devrez modifier la configuration de Django principale à votre projection/votre-project/settings.py . Trouvez ce fichier et ouvrez-le. Recherchez le bloc des bases de données et modifiez pour ressembler à celle ci-dessous.
DATABASES = {
'default': {
#'ENGINE': 'django.db.backends.sqlite3',
#'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': 'your_db',
'USER': 'django_user',
'PASSWORD': 'yourpassword',
'HOST': 'localhost',
'PORT': '',
}
}Enregistrer et sortir. Maintenant, vous pouvez maintenant appliquer les migrations initiales et créer votre utilisateur d'administration. Revenez au répertoire racine de votre projet et exécutez les commandes Linux suivantes.
$ python manage.py migratepython manage.py createsuperuserConfigurer Gunicorn
La configuration de Gunicorn est assez simple, mais il est toujours important de faire. Créez un répertoire gunicorn dans la racine de votre site. Vous avez essentiellement besoin de lui dire où exécuter sa prise, combien de travailleurs à frayer et où se connecter. Créez un fichier python appelé gunicorn-config.py , et faites-le ressembler quelque chose comme celui ci-dessous.
import multiprocessing
bind = 'unix:/tmp/gunicorn.sock'
workers = multiprocessing.cpu_count() * 2 + 1
reload = True
daemon = True
accesslog = './access.log'
errorlog = './error.log'Une fois que vous l'avez, définissez-vous comme vous le souhaitez, enregistrez et sortez.
Vous pouvez démarrer Gunicorn à partir du répertoire racine de votre projet avec une commande similaire à ceci:
$ gunicorn -c gunicorn/gunicorn-config.py your-project.wsgiConfigurer nginx
Toute la configuration Nginx repose dans /etc/nginx . Il y a une tonne de fichiers dans ce répertoire, mais vous n'avez pas à vous en soucier de tous. Vous n'avez vraiment besoin que /etc/nginx/nginx.conf et le fichier spécifique au site que vous créez à /etc/nginx/sites-disponible/votre site . En fait, la configuration principale Nginx n'est pas si nécessaire, sauf si vous souhaitez optimiser votre site en production. Vous n'avez pas vraiment besoin de jouer avec juste pour faire fonctionner votre site.
Donc, créez un fichier pour votre site à /etc/nginx/sites-disponible/votre site .
Le premier élément du fichier dont vous avez besoin est le bloc en amont . Ce bloc indique à Nginx que le code d'application Web est exécuté ailleurs (Gunicorn, dans ce cas), et qu'il devrait échanger des demandes avec cette prise ou cette adresse.
upstream your-gunicorn {
server unix:/tmp/gunicorn.sock fail_timeout=0;
}Ce bloc crée plus ou moins une variable basée sur le nom que vous avez spécifié après Upstream et lui attribue la valeur du serveur de destination. Le serveur peut être une prise Unix ou une adresse IP et un numéro de port. Étant donné que Gunicorn fonctionnera localement, l'utilisation d'une prise Unix est meilleure. N'oubliez pas que vous avez configuré cela dans la configuration de Gunicorn plus tôt, alors pointez votre configuration Nginx dessus.
Ensuite, vous pouvez passer au bloc principal pour Nginx, le bloc Server . Ajoutez cela.
server {
}Les options de base indiquent à Nginx quel port écouter et quelle URL rechercher.
listen 80 default;
client_max_body_size 4G;
server_name your-site.com;
keepalive_timeout 70;Ensuite, ajoutez vos emplacements de journal.
access_log /var/log/nginx/your-site.access_log main;
error_log /var/log/nginx/your-site.error_log info;Point nginx au répertoire racine de votre site.
root /var/www/virtualenv/your-site;Gunicorn ne sert pas de fichiers statiques, vous devrez donc configurer Nginx pour servir les fichiers statiques de votre site. Exactement là où ces fichiers se trouvent est déterminé dans votre fichier de paramètres Django. Habituellement, il y a deux répertoires, un pour les fichiers statiques du site et un autre pour les fichiers téléchargés. Les blocs partagent la même structure. L'exemple ci-dessous suppose que vos fichiers statiques existent dans un répertoire appelé statique dans la racine de votre projet.
location /static/ {
autoindex on;
alias /var/www/virtualenv/your-site/static/;
expires 1M;
access_log off;
add_header Cache-Control "public";
proxy_ignore_headers "Set-Cookie";
}Il existe d'autres options qui font de bonnes valeurs par défaut pour la mise en cache.
Le bloc Emplacement suivant dont vous aurez besoin, vous gérez en fait la connexion avec Gunicorn. Comme en amont , il définit une autre variable et lui dit de transmettre des connexions à votre bloc en amont.
location @proxy_to_app {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_pass http://your-gunicorn;
}Enfin, configurez un bloc qui indique à Nginx de rechercher des fichiers statiques pour correspondre à toutes les demandes entrantes. Si aucun n'est trouvé, passez-le à Gunicorn.
location / {
try_files $uri @proxy_to_app;
}C’est tout ce dont vous avez absolument besoin. Vous pouvez faire beaucoup plus de réglage des performances, mais il n'est pas essentiel de faire fonctionner Django. Enregistrer et sortir.
Créez un lien entre votre nouveau fichier et le dossier SITES-STADABLED . Supprimez le fichier par défaut existant là-dedans.
$ sudo rm /etc/nginx/sites-enabled/defaultsudo ln -s /etc/nginx/sites-available/your-site /etc/nginx/sites-enabled/Redémarrer nginx.
$ sudo systemctl restart nginxÀ présent, vous devriez pouvoir ouvrir votre navigateur et voir la page Django par défaut.
Réflexions de clôture
Très bien, donc c'était une sorte de longue route. Que vous souhaitiez ou non passer par autant de configuration sur un serveur de développement entièrement à vous. Pour la production, cependant, il fournit une base solide pour héberger vos projets Django. Gardez à l'esprit, cependant, il y a certainement plus d'optimisation que vous pouvez faire à la fois dans la configuration Django et Nginx.