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.
Pour compléter ce tutoriel,Vous aurez besoin de.
sudo
Non autorisé rootUtilisateurs. 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 .
À 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.
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. myprojectdir
Dans 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 .
InstalléPythonAprès assemblage, Vous pouvez créer DjangoDocumentation du projet.
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 (~/myprojectdir
Dans 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.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é .
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.
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.
Après certification, Vous pouvez accéder à la valeur par défaut DjangoInterface de gestion.
Quand vous aurez fini d'explorer , Cliquez dans la fenêtre du terminal CTRL+C
, Désactiver le serveur de développement .
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é.
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.
À 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 .
À 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.
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 .
Si la dernière étape ne montre pas votre application,Vous devrez dépanner votre installation.
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/myproject
Documentation, 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é .
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.
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.
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 .
sudo journalctl -u nginx
sudo less /var/log/nginx/access.log
sudo less /var/log/nginx/error.log
sudo journalctl -u gunicorn
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.
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.