Comment configurer une application ASGI Django avec Postgres, nginx et uvicorn sur Ubuntu 20.04

Le Sommet de l'arrière 2021-10-29 04:33:55
comment configurer une application asgi

Introduction

DjangoEst un cadre de réseau puissant,Ça pourrait t'aiderPythonLancement d'une application ou d'un site Web.DjangoY compris un serveur de développement simplifié,Pour tester votre code localement,Mais pour tout ce qui concerne la production,Tous ont besoin d'unWebServeur.

MinistèreDépartementDjangoApplication La façon traditionnelle Est d'utiliserWebInterface de passerelle du serveur(WSGI).Et pourtant,AvecPython 3L'émergence de l'asynchrone et le soutien à l'asynchrone, Vous pouvez maintenant passer par asynchrone Interface de passerelle du serveur(ASGI)Le programme callable asynchrone dePythonApplication.En tant queWSGIHéritier de,PythonDansASGILa norme est:WSGIUn superensemble de,Peut être utilisé commeWSGISolutions de remplacement.

DjangoAllow " Asynchrone externe , Synchronisation interne "Mode, Permettre la synchronisation interne de votre code ,EtASGI Traitement asynchrone des demandes par le serveur .En permettantwebserver Il y a une invocabilité asynchrone ,Il peut gérer plusieurs événements entrants et sortants pour chaque application.DjangoL'application est toujours synchronisée à l'intérieur, Pour permettre la rétrocompatibilité , Et éviter la complexité de l'informatique parallèle . Ça veut dire aussi le vôtre. Django L'application peut être modifiée à partir de WSGIPasser àASGI.

Dans ce guide,Vous serezUbuntu 20.04Installer et configurer certains composants pour le support et le serviceDjangoApplication.Tu vasConfigurer unPostgreSQLBase de données,Au lieu d'utiliser par défautSQLiteBase de données. Vous configurerez GunicornServeur d'application avecUvicorn,UnASGIRéalisation,Connectez - vous asynchrone à votre application.Et puis,Que vous définissiezNginxEn tant queGunicornAgent inverse de,Vous permet d'utiliser ses caractéristiques de sécurité et de performance pour servir votre application.

Conditions préalables

Pour compléter ce tutoriel,Vous aurez besoin de.

No1Pas - DeUbuntu Installer des paquets dans la bibliothèque

Pour commencer le processus , Vous allez UbuntuTélécharger et installer tous les éléments dont vous avez besoin dans la Bibliothèque de logiciels. Vous l'utiliserez plus tard Python Gestionnaire de paquetspip Pour installer d'autres composants .

Tout d'abord,, Vous devez mettre à jour localement apt Index des paquets, Puis Téléchargez et installez le paquet ..Le paquet que vous installez dépend de la version que votre projet utilisera Python.

Utilisez la commande suivante pour installer les paquets système nécessaires.

sudo apt update
sudo apt install python3-venv libpq-dev postgresql postgresql-contrib nginx curl
Copier le Code

Cette commande installeraPythonBibliothèque、PostgresSystèmes de bases de données et bibliothèques nécessaires pour interagir avec eux,EtNginxServeur réseau.Et puis..., Vous serez DjangoCréation d'applicationsPostgreSQL Bases de données et utilisateurs .

No2Pas - CréationPostgreSQL Bases de données et utilisateurs

À ce stade, Vous serez DjangoL'application crée une base de données et un utilisateur de base de données.

Par défaut,Postgres Utilisez une connexion locale appelée " Certification par les pairs " Système de certification .Cela signifie,Si le nom d'utilisateur du système d'exploitation de l'utilisateur est validePostgres Nom d'utilisateur correspondant , L'utilisateur peut se connecter , Sans autre certification .

InPostgresPendant l'installation,Créé un nompostgres Utilisateurs du système d'exploitation pour ,Avecpostgres PostgreSQL Gérer la correspondance utilisateur .Vous devrez utiliser cet utilisateur pour effectuer des tâches administratives.Vous pouvez utilisersudoEt à travers-u Options pour saisir un nom d'utilisateur .

Connectez - vous à un interactif en tapantPostgresSession.

sudo -u postgres psql
Copier le Code

Tu vas avoir unPostgreSQLConseils pour, Vous pouvez définir les exigences ici .

Tout d'abord,,Créer une base de données pour votre projet.

CREATE DATABASE myproject;
Copier le Code

**Attention!:**ChaquePostgresL'instruction doit se terminer par un point - virgule. Si vous avez des problèmes , Assurez - vous que votre commande se termine par un point - virgule .

Et puis...,Créer un utilisateur de base de données pour ce projet. Assurez - vous de sélectionner un mot de passe sécurisé .

CREATE USER myprojectuser WITH PASSWORD 'password';
Copier le Code

Après,Vous allez modifier certains paramètres de connexion pour l'utilisateur que vous venez de créer. Cela accélérera le fonctionnement de la base de données ,Il n'est donc pas nécessaire d'interroger et de définir les valeurs correctes chaque fois qu'une connexion est établie.

Vous définissez l'encodage par défaut à UTF-8 ,C'estDjangoAttendu.Vous définissez également le schéma d'isolement des transactions par défaut à "read committed",Cela empêchera la lecture des données dans les transactions qui n'ont jamais été engagées.Enfin, Vous devez définir le fuseau horaire .Par défaut,Django Le projet sera configuré pour utiliser UTC .C'est tout.Django Le projet lui - même La proposition de.

ALTER ROLE myprojectuser SET client_encoding TO 'utf8';
ALTER ROLE myprojectuser SET default_transaction_isolation TO 'read committed';
ALTER ROLE myprojectuser SET timezone TO 'UTC';
Copier le Code

Maintenant,Vous pouvez donner à vos nouveaux utilisateurs la permission de gérer la nouvelle base de données.

GRANT ALL PRIVILEGES ON DATABASE myproject TO myprojectuser;
Copier le Code

Quand tu auras fini , Sortie par type PostgreSQLL'invite.

\q
Copier le Code

MaintenantPostgres C'est réglé. ,Alors...DjangoPeut se connecter et gérer ses informations de base de données.

No3Pas - Créer un pour votre projet PythonEnvironnement virtuel

Maintenant que vous avez une base de données,Vous pouvez commencer à préparer les autres besoins de votre projet.Vous installerez votrePythonBesoins,Pour faciliter la gestion.

Tout d'abord,,Créer et déplacer dans un répertoire où les fichiers du projet peuvent être sauvegardés.

mkdir ~/myprojectdir
cd ~/myprojectdir
Copier le Code

Ensuite, utilisez Python Outils d'environnement virtuel intégrés pour créer un nouvel environnement virtuel.

python3 -m venv myprojectenv
Copier le Code

Ceci crée un myprojectenvÀ toi. myprojectdirDans la table des matières. À l'intérieur, Il installera une version locale de Python Et une version locale pip . Vous pouvez l'utiliser pour installer et configurer un projet isolé Python Environnement.

Lors de l'installation du projet Python Avant la demande ,Vous devez activer cet environnement virtuel.Vous pouvez le faire en tapant ce qui suit.

source myprojectenv/bin/activate
Copier le Code

Vos conseils devraient changer , Pour montrer que vous êtes dans un Python Fonctionnement dans un environnement virtuel . Ça va ressembler à ça.. (myprojectenv)[email protected]:~/myprojectdir$.

Vous installerez dans un environnement virtuel Django.Oui.DjangoInstaller dans un environnement spécifique à votre projet,Votre projet et ses besoins seront traités séparément. Après l'activation de votre environnement virtuel ,Avecpip Installation de l'instance locale pour Django、Gunicorn、UvicornEtpsycopg2 PostgreSQLAdaptateur.

**Attention!:** Lorsque l'environnement virtuel est activé ( Quand votre invite est précédée (myprojectenv) ) ,Utiliserpip Au lieu depip3 , Même si vous utilisez Python 3.Une copie de l'outil dans un environnement virtuel est toujours nomméepip ,Peu importe Python Quelle est la version de .

pip install django gunicorn uvicorn psycopg2-binary
Copier le Code

Maintenant vous devriez avoir le démarrage Django Tous les logiciels nécessaires au projet .

Quatrième étape - Créer et configurer un nouveau Django Projets

InstalléPythonAprès assemblage, Vous pouvez créer DjangoDocumentation du projet.

CréationDjangoProjets

Parce que vous avez déjà un catalogue de projets,Tu peux le dire.Django Installer les fichiers ici .Il va créer un répertoire secondaire avec le Code réel,C'est normal.,Et mettre un script d'administration dans ce répertoire..La clé est que vous définissez clairement ce répertoire,Au lieu de laisserDjangoPrendre une décision par rapport à votre répertoire actuel.

django-admin startproject myproject ~/myprojectdir
Copier le Code

À ce stade, Votre catalogue de projets (~/myprojectdirDans ce tutoriel) Il devrait y avoir ce qui suit: .

  • ~/myprojectdir/manage.py: UnDjango Script de gestion de projet .
  • ~/myprojectdir/myproject/: DjangoPaquet de projets. Cela devrait inclure: __init__.py,asgi.py, settings.py ,urls.py, Etwsgi.py Documentation.
  • ~/myprojectdir/myprojectenv/: Répertoire d'environnement virtuel que vous avez créé précédemment.

Ajuster les paramètres du projet

Après avoir créé le fichier du projet , Vous devez ajuster certains paramètres .Ouvrez le fichier de configuration dans votre éditeur de texte.

nano ~/myprojectdir/myproject/settings.py
Copier le Code

Trouve d'abord.ALLOWED_HOSTS Directives.Ceci définit une liste d'adresses de serveur ou de noms de domaine,Peut être utilisé pour se connecter àDjangoExemple.Tout avecHostLes demandes entrantes dans l'en - tête lancent une exception.Django Je t'ai demandé de régler ça. ,Pour prévenir une sorte de vulnérabilité à la sécurité.

Entre crochets, Liste des liens avec votre Django Lié au serveur IPAdresse ou nom de domaine. Lister chaque article en guillemets , Les entrées sont séparées par des virgules .Pour autoriser le nom de domaine entier et tout sous - domaine,Veuillez ajouter un point au début de l'entrée. Dans le clip suivant , Voici quelques exemples annotés , Pour montrer comment faire cela .

**Attention!:**S'il vous plaît assurez - vous quelocalhost Comme option , Parce que vous allez passer par le local Nginx Instance pour la connexion Proxy .

~/myprojectdir/myproject/settings.py

. . .
# The simplest case: just add the domain name(s) and IP addresses of your Django server
# ALLOWED_HOSTS = [ 'example.com', '203.0.113.5']
# To respond to 'example.com' and any subdomains, start the domain with a dot
# ALLOWED_HOSTS = ['.example.com', '203.0.113.5']
ALLOWED_HOSTS = ['your_server_domain_or_IP', 'second_domain_or_IP', . . ., 'localhost']
Copier le Code

Et puis...,Trouver la section configurer l'accès à la base de données.Il seraDATABASES C'est parti.. La configuration dans ce fichier est destinée à SQLiteDe la base de données. Vous avez créé unPostgreSQLBase de données, Donc vous devez ajuster ces paramètres .

Prends le tien.PostgreSQL Paramètres de modification des informations de la base de données . Tu dois le dire. Django Utilisez - le. pip Installationpsycopg2 Adaptateur. Vous devez donner le nom de la base de données 、Nom d'utilisateur de la base de données、 Mot de passe de l'utilisateur de la base de données ,Spécifiez ensuite que la base de données est située sur l'ordinateur local.Vous pouvez mettrePORT Définir comme une chaîne vide .

~/myprojectdir/myproject/settings.py

. . .
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': 'myproject',
'USER': 'myprojectuser',
'PASSWORD': 'password',
'HOST': 'localhost',
'PORT': '',
}
}
. . .
Copier le Code

Et puis..., Déplacer vers le bas du fichier ,Ajouter un paramètre,Indiquer où placer les fichiers statiques.C'est nécessaire.,Pour queNginxCapacité de traiter les demandes de ces projets. La ligne suivante dit: DjangoLes placer dans un répertoire de projet de base appeléstatic Dans le catalogue de.

~/myprojectdir/myproject/settings.py

. . .
STATIC_URL = '/static/'
import os
STATIC_ROOT = os.path.join(BASE_DIR, 'static/')
Copier le Code

Enregistrer et fermer le fichier une fois terminé .

Terminer la configuration initiale du projet

Maintenant,Vous pouvez utiliser le script d'administration pour migrer le schéma de base de données initial vers votrePostgreSQLBase de données.

~/myprojectdir/manage.py makemigrations
~/myprojectdir/manage.py migrate
Copier le Code

Créer un utilisateur administratif pour le projet en tapant.

~/myprojectdir/manage.py createsuperuser
Copier le Code

Vous devez sélectionner un nom d'utilisateur , Fournir une adresse électronique , Et sélectionnez et confirmez un mot de passe .

.Vous pouvez collecter tout le contenu statique à l'emplacement du répertoire que vous avez configuré en tapant.

~/myprojectdir/manage.py collectstatic
Copier le Code

Vous devrez confirmer l'opération . Et puis,Les fichiers statiques seront placés dans votre répertoire de projet sous le nom destatic Dans le catalogue de.

Si vous suivez le Guide de configuration initial du serveur, Tu devrais en avoir un. UFW Le pare - feu protège votre serveur . Pour tester le serveur de développement ,Vous devez autoriser l'accès au port que vous utiliserez.

En tapant comme 8000 Le port crée une exception .

sudo ufw allow 8000
Copier le Code

Enfin, Vous pouvez démarrer avec cette commande DjangoDévelopper un serveur pour tester votre projet.

~/myprojectdir/manage.py runserver 0.0.0.0:8000
Copier le Code

Dans votre navigateur Web , Accédez au nom de domaine de votre serveur ou IPAdresse,Puis entrez:8000 .

http://server_domain_or_IP:8000
Copier le Code

Vous devriez recevoir le défaut DjangoPage Index.

Django index page

Si vous êtes dans la barre d'adresse URLAjouter à la fin/admin , Vous serez invité à utiliser createsuperuser Nom d'utilisateur administratif et mot de passe créés par la commande.

Django admin login

Après certification, Vous pouvez accéder à la valeur par défaut DjangoInterface de gestion.

Django admin interface

Quand vous aurez fini d'explorer , Cliquez dans la fenêtre du terminal CTRL+C , Désactiver le serveur de développement .

TestsGunicorn Capacité de service au projet

Dans ce tutoriel,Vous utiliserezGunicornAvecUvicorn Pour déployer des applications .Bien queGunicorn Traditionnellement utilisé pour le déploiement WSGIApplication,Mais il offre aussi une interface pluggable pourASGIDéploiement. Il vous permet de consommer ASGIServeur(uvicorn )Des classes de travailleurs exposés pour faire ça.Parce queGunicorn Est un produit plus mature ,QueUvicorn Plus de configurations disponibles ,Uvicorn Recommandé par le responsable gunicorn ,Et utiliseruvicorn Ergonomie en tant que serveur complet et gestionnaire de processus.

Avant de quitter l'environnement virtuel , Tu vas le tester. GunicornPour s'assurer qu'il peut servir l'application.

À utiliseruvicorn Travailleurs et gunicorn Serveur,Entrez votre répertoire de projets,Utilisez ce qui suitgunicorn Commande pour charger le projet ASGIModule.

cd ~/myprojectdir
gunicorn --bind 0.0.0.0:8000 myproject.asgi -w 4 -k uvicorn.workers.UvicornWorker
Copier le Code

Ce seraDjangoDémarrer sur la même interface que le serveur de développement exécuteGunicorn.Vous pouvez retourner tester l'application à nouveau.

**Attention!:**Pas besoin d'utiliserGunicornPour courir le tien.ASGIApplication.Si seulementuvicorn ,Vous pouvez utiliser les commandes suivantes.

uvicorn myproject.asgi:application --host 0.0.0.0 --port 8080
Copier le Code

**Attention!:**L'interface de gestion n'applique aucun style,Parce queGunicornJe ne sais pas comment trouver la statique responsableCSSContenu.

Si vous lancez ces commandes ,Django La page d'accueil apparaît toujours , C'est confirmé. gunicorn Cette page a été servie , Et travailler comme prévu .En utilisantgunicorn Les ordres, Vous avez Django Deasgi.py Le chemin de répertoire relatif du fichier est passé à Gunicorn Un module,Ce fichier est l'entrée de votre application,Utiliser Python Syntaxe du module pour . Dans ce fichier ,Qui définit un système appeléapplication Fonction de,Il est utilisé pour communiquer avec l'application.Pour en savoir plusASGI Informations sur les spécifications ,Veuillez visiterASGISite officiel.

Quand vous aurez terminé le test , Cliquez dans la fenêtre du terminal CTRL+C ,Arrêtez!Gunicorn.

Maintenant, tu as fini. Django Configuration de l'application .Vous pouvez quitter l'environnement virtuel en tapant.

deactivate
Copier le Code

L'indicateur d'environnement virtuel de votre invite sera supprimé.

Étape 5 - Pour Gunicorn Création systemd Socket Documents de service

Dans la section précédente, Tu l'as testé. GunicornPeut être lié àDjangoInteraction des applications.À ce stade, Vous allez créer systemd Services et fichiers socket pour une manière plus puissante de démarrer et d'arrêter le serveur d'application.

Gunicorn La prise sera créée au démarrage , Et connectera le moniteur . Lorsqu'une connexion se produit ,systemd Démarre automatiquement Gunicorn Processus pour gérer les connexions .

Tout d'abord,,Parsudo Les permissions pour Gunicorn Créer et ouvrir un systemd Fichier Socket.

sudo nano /etc/systemd/system/gunicorn.socket
Copier le Code

Dans le fichier, Vous allez créer un [Unit] Section décrivant la prise ,Un[Socket] Section pour définir l'emplacement de la prise ,Il y en a un autre.[Install] Section pour s'assurer que la prise est créée au bon moment.

/etc/systemd/system/gunicorn.socket

[Unit]
Description=gunicorn socket
[Socket]
ListenStream=/run/gunicorn.sock
[Install]
WantedBy=sockets.target
Copier le Code

Enregistrer et fermer le fichier une fois terminé .

Et puis..., Dans l'éditeur de texte sudo Les permissions pour Gunicorn Créer et ouvrir un systemd Fichiers de service.Le nom du fichier de service doit correspondre au nom du fichier socket avec l’extension.

sudo nano /etc/systemd/system/gunicorn.service
Copier le Code

De[Unit] Début partiel ,Cette section est utilisée pour spécifier les métadonnées et les dépendances.Vous allez écrire ici une description de vos services,Et disinitLe système ne démarre ce service qu'après avoir atteint l'objectif de réseautage.Parce que le service dépend des sockets dans le fichier socket, C'est pour ça que tu dois en faire partie. Requires La directive indique cette relation .

/etc/systemd/system/gunicorn.service

[Unit]
Description=gunicorn daemon
Requires=gunicorn.socket
After=network.target
Copier le Code

Et puis...,Ouvre.[Service] Section.Vous spécifierez les utilisateurs et les groupes du processus.Vous transférerez la propriété du processus à votre compte utilisateur ordinaire, Parce qu'il a tous les documents pertinents . Vous donnerez la propriété du Groupe www-data Groupe,Voilà.Nginx Il est facile d'interagir avec GunicornCommunications.

Et puis, Vous allez dessiner un répertoire de travail , Et spécifiez la commande pour démarrer le Service .Dans ce cas,,Vous devez préciserGunicorn Chemin complet vers l'exécutable ,Ce fichier est déjà installé dans un environnement virtuel. Vous allez lier le processus à votre /run Créé dans le Répertoire UnixSur la prise, Afin que le processus puisse interagir avec NginxCommunications.Vous enregistrerez toutes les données dans la sortie standard,Pour quejournald Le processus peut recueillir GunicornLog.Vous pouvez également spécifier ici toute optionGunicornAjustement.Voici un exemple de spécification de trois processus de travail.

/etc/systemd/system/gunicorn.service

[Unit]
Description=gunicorn daemon
Requires=gunicorn.socket
After=network.target
[Service]
User=sammy
Group=www-data
WorkingDirectory=/home/sammy/myprojectdir
ExecStart=/home/sammy/myprojectdir/myprojectenv/bin/gunicorn \
--access-logfile - \
-k uvicorn.workers.UvicornWorker \
--workers 3 \
--bind unix:/run/gunicorn.sock \
myproject.asgi:application
Copier le Code

Enfin, Vous souhaitez ajouter un [Install] Section.Ça va diresystemd,Si vous laissez ce service démarrer au démarrage, Où devrait - il être relié? .Vous voudrez que ce service démarre lorsque le système multi - utilisateurs normal démarre.

/etc/systemd/system/gunicorn.service

[Unit]
Description=gunicorn daemon
Requires=gunicorn.socket
After=network.target
[Service]
User=sammy
Group=www-data
WorkingDirectory=/home/sammy/myprojectdir
ExecStart=/home/sammy/myprojectdir/myprojectenv/bin/gunicorn \
--access-logfile - \
-k uvicorn.workers.UvicornWorker \
--workers 3 \
--bind unix:/run/gunicorn.sock \
myproject.asgi:application
[Install]
WantedBy=multi-user.target
Copier le Code

Jusqu'ici.,systemd Document de service terminé . Enregistrer et fermer maintenant .

Vous pouvez maintenant démarrer et activer GunicornSocket.Ce sera/run/gunicorn.sock ,Et créer un fichier socket au démarrage. Lorsqu'une connexion entre dans la prise ,systemd Démarre automatiquementgunicorn.service Pour s'en occuper..

sudo systemctl start gunicorn.socket
sudo systemctl enable gunicorn.socket
Copier le Code

Maintenant que vous avez construit systemd Fichiers de service et de socket ,Vous vérifierez le succès de l'opération en vérifiant le fichier Socket.

No6Pas - VérifiezGunicorn Existence d'un fichier Socket

À ce stade, Vous allez vérifier Gunicorn Situation du fichier Socket .Tout d'abord,, Vérifier l'état du processus , Savoir s'il peut démarrer .

sudo systemctl status gunicorn.socket
Copier le Code

Les résultats de sortie seront similaires .

Output● gunicorn.socket - gunicorn socket
Loaded: loaded (/etc/systemd/system/gunicorn.socket; enabled; vendor prese>
Active: active (listening) since Fri 2020-06-26 17:53:10 UTC; 14s ago
Triggers: ● gunicorn.service
Listen: /run/gunicorn.sock (Stream)
Tasks: 0 (limit: 1137)
Memory: 0B
CGroup: /system.slice/gunicorn.socket
Copier le Code

Et puis...,Vérifiez/run Sous la table des matièresgunicorn.sock Le fichier existe - t - il?.

file /run/gunicorn.sock
Copier le Code
Output/run/gunicorn.sock: socket
Copier le Code

Sisystemctl status La commande indique qu'une erreur s'est produite , Ou non trouvé dans ce répertoire gunicorn.sock Documentation,Ça veut direGunicorn Socket n'a pas été créé correctement . Vérifier en tapant Gunicorn Journal de socket .

sudo journalctl -u gunicorn.socket
Copier le Code

Regarde encore le tien. /etc/systemd/system/gunicorn.socket Documentation, Résoudre tout problème avant de continuer .

No7Pas - Activation de la prise d'essai

À ce stade,Vous testerez l'activation de la prise.Pour l'instant, Si vous ne démarrez que gunicorn.socket Unité,gunicorn.service Pas encore activé,Parce que socket n'a pas encore reçu de connexion.Vous pouvez vérifier cela en tapant.

sudo systemctl status gunicorn
Copier le Code
Output● gunicorn.service - gunicorn daemon
Loaded: loaded (/etc/systemd/system/gunicorn.service; disabled; vendor preset: enabled)
Active: inactive (dead)
Copier le Code

Pour tester le mécanisme d'activation de la prise, Vous pouvez taper curl , Envoyer une connexion à la prise .

curl --unix-socket /run/gunicorn.sock localhost
Copier le Code

Vous devriez recevoir de votre application dans le terminalHTMLProduits.Ça veut direGunicorn Lancé et capable de Django Services de fourniture d'applications . Vous pouvez entrer :Pour vérifierGunicornLe service fonctionne - t - il?.

sudo systemctl status gunicorn
Copier le Code
Output
● gunicorn.service - gunicorn daemon
Loaded: loaded (/etc/systemd/system/gunicorn.service; disabled; vendor preset: enabled)
Active: active (running) since Thu 2021-06-10 21:03:29 UTC; 13s ago
TriggeredBy: ● gunicorn.socket
Main PID: 11682 (gunicorn)
Tasks: 4 (limit: 4682)
Memory: 98.5M
CGroup: /system.slice/gunicorn.service
├─11682 /home/sammy/myprojectdir/myprojectenv/bin/python3 /home/sammy/myprojectdir/myprojectenv/bin/gunicorn --access-logfile - --workers 3 -k uvicorn.workers.UvicornWorker --bind unix:/run/gunicorn.sock myproject.asgi:application
├─11705 /home/sammy/myprojectdir/myprojectenv/bin/python3 /home/sammy/myprojectdir/myprojectenv/bin/gunicorn --access-logfile - --workers 3 -k uvicorn.workers.UvicornWorker --bind unix:/run/gunicorn.sock myproject.asgi:application
├─11707 /home/sammy/myprojectdir/myprojectenv/bin/python3 /home/sammy/myprojectdir/myprojectenv/bin/gunicorn --access-logfile - --workers 3 -k uvicorn.workers.UvicornWorker --bind unix:/run/gunicorn.sock myproject.asgi:application
└─11708 /home/sammy/myprojectdir/myprojectenv/bin/python3 /home/sammy/myprojectdir/myprojectenv/bin/gunicorn --access-logfile - --workers 3 -k uvicorn.workers.UvicornWorker --bind unix:/run/gunicorn.sock myproject.asgi:application
Jun 10 21:03:29 django gunicorn[11705]: [2021-06-10 21:03:29 +0000] [11705] [INFO] ASGI 'lifespan' protocol appears unsupported.
Jun 10 21:03:29 django gunicorn[11705]: [2021-06-10 21:03:29 +0000] [11705] [INFO] Application startup complete.
Jun 10 21:03:30 django gunicorn[11707]: [2021-06-10 21:03:30 +0000] [11707] [INFO] Started server process [11707]
Jun 10 21:03:30 django gunicorn[11707]: [2021-06-10 21:03:30 +0000] [11707] [INFO] Waiting for application startup.
Jun 10 21:03:30 django gunicorn[11707]: [2021-06-10 21:03:30 +0000] [11707] [INFO] ASGI 'lifespan' protocol appears unsupported.
Jun 10 21:03:30 django gunicorn[11707]: [2021-06-10 21:03:30 +0000] [11707] [INFO] Application startup complete.
Jun 10 21:03:30 django gunicorn[11708]: [2021-06-10 21:03:30 +0000] [11708] [INFO] Started server process [11708]
Jun 10 21:03:30 django gunicorn[11708]: [2021-06-10 21:03:30 +0000] [11708] [INFO] Waiting for application startup.
Jun 10 21:03:30 django gunicorn[11708]: [2021-06-10 21:03:30 +0000] [11708] [INFO] ASGI 'lifespan' protocol appears unsupported.
Jun 10 21:03:30 django gunicorn[11708]: [2021-06-10 21:03:30 +0000] [11708] [INFO] Application startup complete.
Copier le Code

Si vous venez de curl Produit ou systemctl status La sortie de ,Veuillez vérifier le journal pour plus de détails.

sudo journalctl -u gunicorn
Copier le Code

Vérifiez le vôtre./etc/systemd/system/gunicorn.service Y a - t - il un problème avec le fichier? .Si vous avez raison/etc/systemd/system/gunicorn.service Fichier modifié ,Rechargez le démon pour relire la définition du service, Et redémarrer en tapant GunicornProcessus.

sudo systemctl daemon-reload
sudo systemctl restart gunicorn
Copier le Code

Avant de continuer,Veuillez vous assurer que vous avez corrigé le problème ci - dessus.

No8Pas - ConfigurationNginx Passer par procuration à Gunicorn

MaintenantGunicorn C'est réglé. ,Vous devez configurerNginx Transmettre le trafic au processus .À ce stade,Vous serezGunicorn Configuration avant Nginx,Pour profiter de son mécanisme de traitement de connexion haute performance et de ses fonctions de sécurité faciles à réaliser.

Tout d'abord,,InNginxDesites-available Créer et ouvrir un nouveau bloc serveur dans le répertoire.

sudo nano /etc/nginx/sites-available/myproject
Copier le Code

À l'intérieur, Ouvrir un nouveau bloc de serveur .Vous allez d'abord spécifier que ce bloc devrait écouter normalement80Port,Et devrait répondre au nom de domaine du serveur ouIPAdresse.

/etc/nginx/sites-available/myproject

server {
listen 80;
server_name server_domain_or_IP;
}
Copier le Code

Et puis...,Dis - le.Nginx Ignorer toute recherche faviconLa question de. Tu dois lui dire. , Où puis - je vous trouver? ~/myprojectdir/static Actifs statiques dans le Répertoire .Tous ces fichiers ont un standardURIPréfixe"/static",Donc vous pouvez créer un bloc de localisation pour correspondre à ces demandes.

/etc/nginx/sites-available/myproject

server {
listen 80;
server_name server_domain_or_IP;
location = /favicon.ico { access_log off; log_not_found off; }
location /static/ {
root /home/sammy/myprojectdir;
}
}
Copier le Code

Enfin,Créer unlocation / {} Bloc, Pour correspondre à toutes les autres demandes .Dans cette position, Vous inclurez: Nginx Normes incluses lors de l'installation proxy_params Documentation,Ensuite, vous transmettrez le trafic directement àGunicornSocket.

/etc/nginx/sites-available/myproject

server {
listen 80;
server_name server_domain_or_IP;
location = /favicon.ico { access_log off; log_not_found off; }
location /static/ {
root /home/sammy/myprojectdir;
}
location / {
include proxy_params;
proxy_pass http://unix:/run/gunicorn.sock;
}
}
Copier le Code

Une fois terminé,Enregistrer et fermer le fichier.Maintenant,Vous pouvez le faire en reliant le fichier àsites-enabled Dans le Répertoire pour l'activer .

sudo ln -s /etc/nginx/sites-available/myproject /etc/nginx/sites-enabled
Copier le Code

Entrez le code suivant,TestsNginx Configuration des erreurs de syntaxe .

sudo nginx -t
Copier le Code

Si aucune erreur n'est signalée , Continuer l'entrée et redémarrer Nginx.

sudo systemctl restart nginx
Copier le Code

Enfin, Vous devez ouvrir le pare - feu ,Faire80 Le débit du port est normal . Parce que vous n'avez plus besoin d'accéder au serveur de développement, Vous pouvez supprimer l'ouverture 8000 Règles pour les ports .

sudo ufw delete allow 8000
sudo ufw allow 'Nginx Full'
Copier le Code

Vous devriez maintenant avoir accès au nom de domaine de votre serveur ouIPAdresse, Voir les photos de fusées DjangoPage d'accueil.

**Attention!:**Après la configurationNginxAprès, L'étape suivante devrait être d'utiliser SSL/TLS Pour assurer la sécurité du trafic du serveur .C'est important., Parce que sans ça, ,Toutes les informations,Y compris le mot de passe,Tout a été envoyé sur le Web en texte clair.

Si vous avez un nom de domaine ,La façon la plus simple est d'utiliserLet's EncryptPour obtenirSSLCertificat, Pour assurer votre flux .Selon Ce guide ,InUbuntu 20.04Vas - y.NginxParamètresLet's Encrypt. Utilisez le Nginx Bloc serveur , Suivez cette procédure .

No9Pas - ExclusionNginxEtGunicornFaute

Si la dernière étape ne montre pas votre application,Vous devrez dépanner votre installation.

Nginx Afficher la page par défaut au lieu de DjangoApplication

SiNginx Afficher la page par défaut ,Au lieu d'être délégué à votre application, Cela signifie généralement que vous devez ajuster server_name Intérieur /etc/nginx/sites-available/myprojectDocumentation, Pour pointer vers votre serveur IPAdresse ou nom de domaine.

NginxUtiliserserver_name Pour décider quel bloc de serveur utiliser pour répondre à la demande. Si vous recevez NginxPage par défaut pour,Ça veut direNginxImpossible de faire correspondre explicitement la requête à un bloc de serveur, Donc il est revenu /etc/nginx/sites-available/default Blocs par défaut définis dans .

Blocs de serveurs dans votre projet server_name ,Doit être plus spécifique que dans le bloc serveur par défaut, Pour être sélectionné .

NginxAfficher502 Erreur de mauvaise passerelle ,Au lieu deDjangoApplication

502Indication d'erreurNginx La demande de procuration n'a pas réussi . De nombreux problèmes de configuration peuvent survenir 502Erreur,Des informations supplémentaires sont donc nécessaires pour corriger correctement le problème.

Pour en savoir plusNginxJournal des erreurs pour.En général,.Cela vous indiquera quelles conditions ont causé le problème dans l'événement proxy.SelonNginxJournal des erreurs pour,Entrée.

sudo tail -F /var/log/nginx/error.log
Copier le Code

Maintenant, Faire une autre requête dans le Navigateur , Générer une nouvelle erreur ( Tentative de rafraîchir la page ).Vous devriez recevoir un nouveau message d'erreur écrit dans le journal. Si vous regardez le message ,Cela devrait vous aider à réduire la portée du problème.

Vous pouvez recevoir les informations suivantes: .

"`[secondary_label Output]
connect() to unix:/run/gunicorn.sock failed (2: No such file or directory)

OutputThis indicates that Nginx could not find the `gunicorn.sock` file at the given location. You should compare the `proxy_pass` location defined within `/etc/nginx/sites-available/myproject` file to the actual location of the `gunicorn.sock` file generated by the `gunicorn.socket` systemd unit.
If you cannot find a `gunicorn.sock` file within the `/run` directory, it generally means that the systemd socket file was unable to create it. Go back to the [section on checking for the Gunicorn socket file](#checking-for-the-gunicorn-socket-file) to step through the troubleshooting steps for Gunicorn.
```
connect() to unix:/run/gunicorn.sock failed (13: Permission denied)
Copier le Code

Ça veut direNginxImpossible de se connecter àGunicornSocket. Lorsque le programme utilise l'utilisateur racine au lieu de sudo Temps d'utilisation, Ça pourrait arriver. . Bien quesystemdCapable de créerGunicornFichier Socket,Mais...Nginx Mais je ne peux pas y accéder. .

Si dans le Répertoire racine (/)Etgunicorn.sock .Permissions limitées à n'importe quel point entre les fichiers,Ça arrive..Vous pouvez passer le chemin absolu du fichier socket ànamei Les ordres,Pour voir les permissions et les valeurs de propriété du fichier socket et de chacun de ses répertoires parents.

namei -l /run/gunicorn.sock
Copier le Code
Outputf: /run/gunicorn.sock
drwxr-xr-x root root /
drwxr-xr-x root root run
srw-rw-rw- root root gunicorn.sock
Copier le Code

La sortie affiche les permissions pour chaque composant du Répertoire. Voir les permissions (Première colonne)、Propriétaire(Deuxième colonne) Et propriétaire du Groupe (Troisième colonne), Vous pouvez trouver la permission. socket Quel type d'accès aux fichiers .

Dans l'exemple ci - dessus,,.Le fichier socket et chaque répertoire vers le fichier socket ont la permission de lire et d'exécuter dans le monde entier( La barre de permission du Répertoire r-x Fin,Au lieu de--- ). NginxLe processus devrait pouvoir accéder avec succès à la socket.

.Si l'un des répertoires menant à la socket n'a pas la permission du monde de lire et d'exécuter,Nginx La prise ne sera pas accessible ,Sauf si le monde est autorisé à lire et à exécuter les permissions,Ou s'assurer que la propriété du Groupe est accordéeNginxGroupe auquel appartient.

DjangoAfficher:"could not connect to server:Connexion refusée"

Lorsque vous essayez d'accéder à certaines parties de l'application dans un navigateur web,Tu pourrais venir deDjangoUn message reçu.

"`[secondary_label Output]
OperationalError at /admin/login/
could not connect to server:Connexion refusée
Si le serveur est sur l'hôte "localhost"(127.0.0.1)Cours.,Et
In5432 Acceptation du port TCP/IPConnexion?


This indicates that Django is unable to connect to the Postgres database. Make sure that the Postgres instance is running by typing:
```command
sudo systemctl status postgresql
Copier le Code

Si ce n'est pas le cas,, Vous pouvez le démarrer. ,.Et le faire démarrer automatiquement au démarrage en tapant(Si elle n'a pas encore été configurée comme ça).

sudo systemctl start postgresql
sudo systemctl enable postgresql
Copier le Code

Si vous avez encore des problèmes ,Assurez - vous que~/myprojectdir/myproject/settings.py Les paramètres de base de données définis dans le fichier sont corrects.

Dépannage supplémentaire

Pour le dépannage supplémentaire ,Les journaux peuvent aider à réduire les causes profondes.Vérifiez chacun d'eux à tour de rôle, Rechercher des informations indiquant les domaines problématiques .

Les journaux suivants peuvent être utiles .

  • Vérification par type Nginx Journal des processus .sudo journalctl -u nginx
  • Vérifier en tapant NginxJournal d'accès pour.sudo less /var/log/nginx/access.log
  • Vérifier en tapant NginxJournal des erreurs pour.sudo less /var/log/nginx/error.log
  • Vérifier en tapant Gunicorn Journal de l'application .sudo journalctl -u gunicorn
  • Vérification par type Gunicorn Journal de socket .sudo journalctl -u gunicorn.socket

Lorsque vous mettez à jour votre configuration ou votre application,Vous devrez peut - être redémarrer ces processus, Pour s'adapter à vos changements .

Si vous avez mis à jour votre DjangoApplication, Vous pouvez redémarrer en tapant Gunicorn Processus pour recevoir ces changements .

sudo systemctl restart gunicorn
Copier le Code

Si vous changez Gunicorn Socket ou fichier de service pour , Veuillez recharger le démon , Et redémarrer le processus en tapant .

sudo systemctl daemon-reload
sudo systemctl restart gunicorn.socket gunicorn.service
Copier le Code

Si vous changez Nginx Configuration du bloc serveur ,Configuration du test, Puis en tapant Nginx.

sudo nginx -t && sudo systemctl restart nginx
Copier le Code

Ces commandes vous aident à saisir les changements pendant que vous ajustez votre configuration.

Résumé

Dans ce guide,Vous avez mis en place unASGI DjangoProjets. Vous avez configuré GunicornEtUvicorn Pour traduire asynchrone les demandes des clients ,Pour queDjango Capable de les gérer .Après,Tu l'as mis en place.NginxAgir comme agent inverse pour gérer les connexions client,Et fournir le bon projet selon la demande du client.

DjangoSimplifie le processus de création de projets et d'applications, Fournit de nombreuses parties communes ,Vous permet de vous concentrer sur des éléments uniques.En utilisant la chaîne d'outils générale décrite ici,Vous pouvez servir les applications que vous créez à partir d'un seul serveur.

版权声明
本文为[Le Sommet de l'arrière]所创,转载请带上原文链接,感谢
https://pythonmana.com/2021/10/20211029043132968j.html

  1. OpenCV - Python Real play (14) - face detection details (six lignes de code seulement pour apprendre 4 méthodes de détection de visage)
  2. 你好,python开发mes系统,能分享下吗,我最近也想搞这方面的
  3. 你好,python開發mes系統,能分享下嗎,我最近也想搞這方面的
  4. Bonjour, Python a développé mon système, pouvez - vous le partager?
  5. Introduction to tuples in Python
  6. Introduction to strings in python (Part 2)
  7. Introduction to strings in python (Part 1)
  8. python关于 if 的简单操作时,输出结果不是预期所要的结果 的问题
  9. python關於 if 的簡單操作時,輸出結果不是預期所要的結果 的問題
  10. Lorsque Python fonctionne simplement sur if, la sortie n'est pas le résultat attendu
  11. Python中字典问题请求解惑
  12. Python中字典問題請求解惑
  13. Demande de résolution de problèmes de dictionnaire en python
  14. Python中字典问题请求解惑
  15. Python technique 2: advanced usage of function parameters
  16. Demande de résolution de problèmes de dictionnaire en python
  17. Preliminary Knowledge - Python Core use Common Data Analysis Library (ⅱ)
  18. 关于python的代码问题,终端打印为什么会起飞
  19. En ce qui concerne les problèmes de code Python, pourquoi l'impression du terminal décolle - t - elle?
  20. Python中种子seed的运用问题
  21. L'application de Seed en python
  22. Python functional programming series 008: Testability
  23. [must see for getting started with Python] the difference and connection between cookie and session in Python!
  24. Python Xiaobai from scratch pyqt5 project actual combat (4) basic controls
  25. Python Xiaobai starts the pyqt5 project from scratch (3) connection between signal and slot
  26. Echarts ne peut pas afficher le HTML en PDF en utilisant le pdfkit de Python
  27. 一只Python 小white 的日常提问(づ ●─● )づ
  28. 2021 tutoriel complet d'automatisation des tests d'interface python [matériel d'apprentissage joint]
  29. Décrivez ce que les connaissances pertinentes jouent dans votre travail en utilisant arduino ou Python, y compris les bibliothèques pertinentes, en conjonction avec votre travail quotidien.
  30. Une question quotidienne d'un petit morceau de Python (づ● - ●)
  31. Python中字典问题请求解惑
  32. 一只Python 小white 的日常提問(づ ●─● )づ
  33. 在python中的问题,请问如何解决
  34. Only 10 questions are needed to easily master Matplotlib graphics processing | Python skill tree
  35. 在python中的問題,請問如何解决
  36. Comment résoudre le problème en python
  37. Demande de résolution de problèmes de dictionnaire en python
  38. 使用python,在一个命名为.txt文本文档写入n m乘法表。
  39. En utilisant Python, écrivez une table de multiplication n m dans un document texte nommé.txt.
  40. 使用python,在一個命名為.txt文本文檔寫入n m乘法錶。
  41. Python,前缀后缀相同时合并
  42. 关于#python#的问题:python
  43. 關於#python#的問題:python
  44. Python,前綴後綴相同時合並
  45. Questions sur # # Python #: Python
  46. Python, préfixe et suffixe combinés en même temps
  47. python manage.py shell无法运行,
  48. python manage.py shell無法運行,
  49. Le shell Python manage.py ne fonctionne pas,
  50. python中使用vscode Import 'matplotlib.pyplot' could not be resolved from source 问题
  51. [Chapter 11 of the full version] Python advanced crawler practice - system master Po anti climbing skills challenge high salary
  52. L'utilisation de vscode Import 'matplotlib.pyplot' en python ne peut pas être résolue à partir du problème source
  53. Python fusionne les deux listes et supprime les éléments dupliqués lors de la fusion
  54. [JS Reverse AES Reverse Encryption] python crawler combat, les jours sont de plus en plus décisifs
  55. 30 jeux Python. Je peux jouer à la pêche au travail pendant une journée.
  56. J'a i collecté un nouveau hit de liste en python, donc c'est un secret que quelqu'un d'autre peut devenir un magnat des médias!
  57. J'a i utilisé Python pour ramper à travers 5000 belles photos de papier peint, un jour oublié Premier amour!
  58. [Python planting system] the best green plant for your girlfriend. Girls love it when they see it! Attachment: should be able to feed - right??!
  59. [Python love guide] two small programs for sweetness burst table are released! Afraid you can't find someone?
  60. J'ai utilisé Python pour me connecter à la plus grande plate - forme de jeu au monde, et à quel point le cryptage steam est intelligent [code source inclus]