Recherche de site Web

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.

Distributions

Ubuntu 18.04

Exigences

Une installation fonctionnelle d’Ubuntu 18.04 avec les privilèges root

Difficulté

Douleur moyenne

Conventions

  • # – nécessite que les commandes Linux données soient exécutées avec les privilèges root, soit directement en tant qu’utilisateur root, soit en utilisant la commande sudo
  • $ – nécessite que des commandes Linux données soient exécutées en tant qu’utilisateur régulier non privilégié

Introduction

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é à Linux, il n’est pas trop difficile de configurer un serveur Django sur Ubuntu.

Il n’y a pas de façon unique d’héberger des projets Django, mais une pile composée de PostgreSQL, Nginx, Gunicorn et Django est à peu près la norme.

Installer 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 postgresql

Cré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 chose que MySQL. Sa syntaxe est différente, et il gère également les connexions des utilisateurs différemment.

Pour vous connecter à PostgreSQL et le gérer, vous devez utiliser l’utilisateur postgres sur votre ordinateur qui a été créé lors de l’installation du package PostgreSQL. Passez à cet utilisateur avec su.

sudo su postgres

Une 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 administrateur 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 régulier 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 à cet utilisateur l’autorisation 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.

Configurer votre annuaire

Ce n’est généralement pas une bonne idée d’installer des paquets Python à l’échelle du système. Il est beaucoup plus difficile de gérer les versions des paquets et de tout garder stable.

Python 3 prend en charge les environnements virtuels qui vous permettent de compartimenter vos projets Python par répertoire. Chaque environnement dispose de son propre ensemble de packages Python, que vous pouvez installer et gérer en tant qu’utilisateur régulier.

Choisissez l’endroit où vous souhaitez héberger votre site web. /var/www/votresite 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/yoursite

Allez dans votre annuaire et activez-le.

cd /var/www/yoursite
source bin/activate

Lorsque vous avez terminé dans l’annuaire, vous pouvez facilement le désactiver.

deactivate

Installer Django

Une fois votre environnement virtuel démarré, vous pouvez installer Django lui-même ainsi que quelques autres packages Python dont vous aurez besoin pour tout connecter.

pip install django psycopg2 gunicorn

Cela ne prendra que 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 l’avez activé.

django-admin startproject your-project

Une fois que vous avez 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 allez devoir modifier la configuration principale de Django dans votre-projet/votre-projet/settings.py. Trouvez ce fichier et ouvrez-le. Recherchez le bloc DATABASES et modifiez-le pour qu’il ressemble à celui 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': '',
    }
}

Enregistrez et quittez. Maintenant, vous pouvez appliquer les migrations initiales et créer votre utilisateur administrateur. Retournez dans le répertoire racine de votre projet et exécutez les commandes linux suivantes.

python manage.py migrate
python manage.py createsuperuser

Configurer Gunicorn

La configuration de Gunicorn est assez simple, mais il est toujours important de le faire. Créez un répertoire gunicorn à la racine de votre site. Vous devez essentiellement lui dire où exécuter son socket, combien de workers générer et où loger. Créez un fichier Python appelé gunicorn-config.py et faites-le ressembler à 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 configuré comme vous le souhaitez, enregistrez et quittez.

Vous pouvez démarrer Gunicorn à partir du répertoire racine de votre projet avec une commande similaire à celle-ci :

gunicorn -c gunicorn/gunicorn-config.py your-project.wsgi

Configurer Nginx

Toute la configuration de Nginx repose dans /etc/nginx. Il y a une tonne de fichiers dans ce répertoire, mais vous n’avez pas à vous soucier de tous. Vous n’avez vraiment besoin que de /etc/nginx/nginx.conf et du fichier spécifique au site que vous allez créer dans /etc/nginx/sites-available/votre-site. En fait, la configuration principale de Nginx n’est pas si nécessaire que cela, sauf si vous souhaitez optimiser votre site en production. Vous n’avez pas vraiment besoin de vous en occuper juste pour faire fonctionner votre site.

Créez donc un fichier pour votre site à l’adresse /etc/nginx/sites-available/your-site.

La première partie du fichier dont vous avez besoin est le bloc en amont. Ce bloc indique à Nginx que le code de l’application web est exécuté ailleurs (Gunicorn, dans ce cas), et qu’il doit échanger des requêtes avec ce socket 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 l’amont et lui attribue la valeur du serveur de destination. Le serveur peut être soit un socket Unix, soit une adresse IP et un numéro de port. Comme Gunicorn fonctionnera localement, il est préférable d’utiliser un socket Unix. N’oubliez pas que vous l’avez configuré dans la configuration de Gunicorn plus tôt, alors pointez votre configuration Nginx vers celui-ci.

Ensuite, vous pouvez passer au bloc principal de Nginx, le bloc serveur. Ajoutez cela.

server {

}

Les options de base indiquent à Nginx sur 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;

Pointez Nginx dans le répertoire racine de votre site.

root /var/www/virtualenv/your-site;

Gunicorn ne sert pas les fichiers statiques, vous allez donc devoir configurer Nginx pour servir les fichiers statiques de votre site. L’emplacement exact de ces fichiers est déterminé dans votre fichier de paramètres Django. Habituellement, il y a deux répertoires, l’un pour les fichiers statiques du site et l’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é static à 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 prochain bloc d’emplacement dont vous aurez besoin gérera en fait la connexion avec Gunicorn. Comme en amont, il définit une autre sorte de variable et lui dit de transmettre les 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, mettez en place un bloc qui indique à Nginx de rechercher des fichiers statiques pour correspondre à toutes les requêtes entrantes. S’il n’en trouve pas, 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 ce n’est pas essentiel pour faire fonctionner Django. Enregistrez et quittez.

Créez un lien entre votre nouveau fichier et le dossier activé pour les sites. Supprimez le fichier par défaut existant qui s’y trouve.

sudo rm /etc/nginx/sites-enabled/default
sudo ln -s /etc/nginx/sites-available/your-site /etc/nginx/sites-enabled/

Redémarrez Nginx.

sudo systemctl restart nginx

À présent, vous devriez être en mesure d’ouvrir votre navigateur et de voir la page Django par défaut.

Réflexions finales

D’accord, donc c’était une sorte de long chemin. Que vous souhaitiez ou non passer par une telle configuration sur un serveur de développement dépend entièrement de vous. Pour la production, cependant, il fournit une base solide pour héberger vos projets Django. Gardez à l’esprit, cependant, qu’il y a certainement plus d’optimisation que vous pouvez faire dans la configuration de Django et de Nginx.

Articles connexes: