[PYTHON] A vous qui êtes acculé par le déploiement de Django. Déploiement de Django 2.2 version complète sur Ubuntu 18.04 + Nginx

introduction

Depuis que je suis débutant, j'ai l'intention de l'écrire pour les débutants. Si vous avez des questions ou des erreurs, veuillez laisser un commentaire.

J'ai dit que c'était une version complète, mais contrairement à la plupart des articles, je ne l'expliquerai pas à partir de la création d'un projet.

On a l'impression que Django 3.0 vient de sortir, mais je ne pense pas que cela changera autant avec Django 3.0. Cela a bien fonctionné dans la fourchette que j'ai faite.

environnement

supposition

Préparation locale

Structure de répertoire au stade prêt

YourProjekutName
        ├ YourProjectName
        │     ├ __init__.py
        │     ├ settings
        │     │     ├ __init__.py
        │     │     ├ base.py
        │     │     ├ local.py
        │     │     └ production.py
        │     ├ urls.py
        │     └ wsgi.py
        ├ YourAppName
        │     ├ migrations
        │     │     └ __init__.py
        │     ├ __init__.py
        │     ├ admin.py
        │     ├ apps.py
        │     ├ models.py
        │     ├ tests.py
        │     ├ urls.py
        │     └ views.py
        ├ collected_static
        ├ media
        ├ static
        │     ├ css
        │     ├ images
        │     └ js
        └ templates

Réécrivez votre nom de projet / settings.py

Il peut être plus précis de le refaire que de le réécrire.

YourProjectName/settings/base.py


import os

BASE_DIR = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))

INSTALLED_APPS = [
    'YourAppName',
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

ROOT_URLCONF = 'YourProjectName.urls'

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR, 'templates')],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
                'django.template.context_processors.static',
            ],
        },
    },
]

WSGI_APPLICATION = 'YourProjectName.wsgi.application'

AUTH_PASSWORD_VALIDATORS = [
    {
        'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
    },
]

LANGUAGE_CODE = 'en-us'

TIME_ZONE = 'Asia/Tokyo'

USE_I18N = True

USE_L10N = True

USE_TZ = True

STATIC_URL = '/static/'
STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static')]
STATIC_ROOT = os.path.join(BASE_DIR, 'collected_static')

MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')

YourProjectName/settings/local.py


from .base import *

SECRET_KEY = 'Secret Key Written on settings.py'

DEBUG = True

ALLOWED_HOSTS = []

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}

YoutProjectName/settings/production.py


from .base import *

SECRET_KEY = 'Secret Key Written on settings.py'

DEBUG = False

ALLOWED_HOSTS = ['YourHostName']

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}

Les détails seront ajoutés plus tard.

Créez un dossier collect_static dans le répertoire supérieur

Je verrai pourquoi plus tard.

Structure de répertoire au stade prêt

YourProjekutName
        ├ YourProjectName
        │     ├ __init__.py
        │     ├ settings
        │     │     ├ __init__.py
        │     │     ├ base.py
        │     │     ├ local.py
        │     │     └ production.py
        │     ├ urls.py
        │     └ wsgi.py
        ├ YourAppName
        │     ├ migrations
        │     │     └ __init__.py
        │     ├ __init__.py
        │     ├ admin.py
        │     ├ apps.py
        │     ├ models.py
        │     ├ tests.py
        │     ├ urls.py
        │     └ views.py
        ├ collected_static
        ├ media
        ├ static
        │     ├ css
        │     ├ images
        │     └ js
        └ templates

Pousser vers GitHub

Lors du transfert de données de l'environnement de développement vers l'environnement de production, nous utiliserons GitHub en tenant compte du développement futur. Il est recommandé de spécifier \ _ \ _ pychache \ _ \ _, db.sqlite3, collect_static / * dans .gitignore pour l'exclure de la cible de git.

Fonctionnement sur le serveur

Je pense que c'était difficile à préparer, mais maintenant il est temps de passer en direct. Je vais l'écrire pour le moment, mais à partir de maintenant, ce sera une opération sur le serveur.

Paramètres du pare-feu

Veuillez ouvrir le port 80. Assurez-vous de redémarrer le service de pare-feu avec le redémarrage sudo systemctl.

Installation de Nginx

sudo apt install nginx

Paramètres Nginx

À ce stade, saisissez le domaine dans votre navigateur et vous devriez voir Welcome to nginx!. S'il n'apparaît pas, l'installation peut avoir échoué, les paramètres du pare-feu peuvent ne pas être corrects ou les paramètres autour du domaine ou du serveur de noms peuvent ne pas être corrects.

Tout d'abord, modifiez la partie suivante.

/etc/nginx/nginx.conf


# user www-data;
user webmaster;

Veuillez créer un nouveau fichier ci-dessous.

/etc/nginx/sites-available/YourProjectName


server {
    server_name YourHostName;

    location /static {
        alias /home/webmaster/YourProjectName/collected_static;
    }

    location /media {
        alias /home/webmaster/YourProjectName/media;
    }

    location / {
        proxy_pass http://127.0.0.1:8080;
        proxy_set_header X-Forwarded_For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_redirect off;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

Lien symbolique

sudo ln -s /etc/nginx/sites-available/YourProjectName /etc/nginx/sites-enabled/YourProjectName

Utilisateur: Créer un webmaster

sudo adduser webmaster

Projet de clonage

Clonez le projet que vous venez de pousser localement sur GitHub. La chose importante à noter ici est de le cloner sur le répertoire utilisateur (/ home / webmaster /) de l'utilisateur (webmaster) que vous venez de créer.

Construction de l'environnement Python

Souvent, il existe de nombreux articles sur la création d'environnements virtuels, ce qui est préférable, mais c'est ennuyeux et pour une raison quelconque, cela n'a pas fonctionné, alors je vais le faire normalement.

Installez Python 3.8

sudo apt install python3.8 python3.8-dev python3-pip

Installer le package avec pip

Ce dont vous avez besoin ici est un package appelé Gunicorn ainsi que Django.

sudo python3.8 -m pip install django gunicorn

Assurez-vous d'installer tous les autres packages requis pour le projet créé.

Cette fois, le contrôle de fonctionnement de Gunicorn est omis.

migrer et collecter

python3.8 manage.py makemigrations --settings YourProjectsName.settings.production
python3.8 manage.py migrate --settings YourProjectsName.settings.production
python3.8 manage.py collectstatic --settings YourProjectsName.settings.production

Démon avec Gunicorn

Diabolisation

sudo gunicorn --daemon --bind 127.0.0.1:8080 YourProjectName.wsgi:application

Ajouter un service

Veuillez créer un nouveau fichier ci-dessous.

/etc/systemd/system/YourProjectName.service


[Unit]
Description=gunicorn
After=network.target

[Service]
WorkingDirectory=/home/webmaster/YourProjectName
ExecStart=/usr/local/bin/gunicorn --bind 127.0.0.1:8080 YourProjectName.wsgi:application

[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl restart nginx
sudo systemctl restart YourProjectName

Vérification

Tapez YourHostName dans votre navigateur et vous devriez le voir.

Conversion HTTPS

sudo apt install certbot python-certbot-nginx
sudo certbot --nginx
sudo certbot renew --dry-run

Tout ce que vous avez à faire est de suivre les instructions. Seulement ici, c'est vraiment facile.

à la fin

C'est assez difficile pour les débutants, mais même si vous êtes mentalement coincé avant de pouvoir le faire, vous pouvez certainement le faire un par un sans le jeter en chemin. J'ai pu le faire aussi. S'il vous plaît faites de votre mieux!! Comme je l'ai écrit au début, il se peut qu'il manque quelque chose, donc si vous avez des questions ou si vous trouvez une erreur, laissez un commentaire.

Recommended Posts

A vous qui êtes acculé par le déploiement de Django. Déploiement de Django 2.2 version complète sur Ubuntu 18.04 + Nginx
Ce que j'ai trouvé en déployant Django sur EC2
Déployer des applications Django sur Ubuntu + Nginx + MySQL (Build)
Mémo de déploiement de Django × Postgresql sur Docker vers Heroku
Vous permet de sélectionner par nom à partir du nom d'utilisateur Django