Lancer une application Web Python sur Nginx + Gunicorn avec Docker

Constitution

--Serveur Web - nginx

Arrangement des termes

Qu'est-ce qu'un serveur WSGI?

--WSGI signifie Web Server Gateway Interface, qui est un protocole de communication entre un serveur Web et un serveur AP en Python.

Qu'est-ce qu'une socket de domaine UNIX?

Construire

Gunicorn

Création de projet

--Installez Django

$ pip install Django==3.0.2

--Créez un projet dans votre environnement de travail

$ django-admin.py startproject django_project .
$ tree
.
├── django_project
│   ├── __init__.py
│   ├── asgi.py
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
├── manage.py

Démarrer le conteneur Gunicorn

--Créer un Dockerfile

FROM python:3.8.0-alpine

WORKDIR /usr/src/app

ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1

RUN pip install --upgrade pip
COPY ./requirements.txt /usr/src/app/requirements.txt
RUN pip install -r requirements.txt

--requirements.txt se présente comme suit

requirements.txt


Django==3.0.2
gunicorn==20.0.4

--Construire

$ docker build -t gunicorn:tmp .
version: '3.7'

services:
  gunicorn:
    image: gunicorn:tmp 
    container_name: gunicorn
    command: python manage.py runserver 0.0.0.0:8000
    volumes:
      - .:/usr/src/app/
    ports:
      - 8000:8000
スクリーンショット 2020-01-12 20.57.11.png

Paramètres pour utiliser les sockets de domaine UNIX avec Nginx

gunicorn.conf


upstream gunicorn-django {
    server unix:///var/run/gunicorn/gunicorn.sock;
}

server {
    listen 80;
    server_name localhost;

    location / {
        try_files $uri @gunicorn;
    }

    location @gunicorn {
        proxy_pass http://gunicorn-django;
    }
}

--```upstream gunicorn-django {…} le contenu est les paramètres de socket de domaine UNIX --Communiquer avec gunicorn via le fichier socket dans le chemin décrit

version: '3.7'

services:
  nginx:
    image: nginx:1.17.7
    container_name: nginx
    ports:
      - "80:80"
    volumes:
      - ./gunicorn.conf:/etc/nginx/conf.d/default.conf

--Monter dans Nginx avec le nom / etc / nginx / conf.d / default.conf --Nginx lit /etc/nginx/nginx.conf au démarrage et ditinclure /etc/nginx/conf.d / *. Conf; `` dans ce fichier, donc Si vous montez le fichier de configuration que vous avez créé sous/ etc / nginx / conf.d```, il sera lu ensemble au démarrage.

Paramètres pour utiliser le socket de domaine UNIX avec Gunicorn

Commande de démarrage du conteneur

Paramètres WSGI

gunicorn django_project.wsgi

--Ceci lit wsgi.py sous django_project, qui est construit lorsque vous créez un projet appelé django_project cette fois. --Manage.py a été démarré lors du démarrage local, mais cette commande est requise lors de la communication avec WSGI.

Paramètres de socket de domaine UNIX

--Spécifiez le chemin du fichier de socket de démarrage avec --bind``` pour communiquer avec les sockets de domaine UNIX

gunicorn django_project.wsgi --bind=unix:/var/run/gunicorn/gunicorn.sock

Correction de Doickerfile

--Changed CMD of Dockerfile basé sur le contenu ci-dessus

Dockerfile


FROM python:3.8.0-alpine

WORKDIR /usr/src/app

ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1

RUN pip install --upgrade pip
COPY ./requirements.txt /usr/src/app/requirements.txt
RUN pip install -r requirements.txt

RUN mkdir -p /var/run/gunicorn

CMD ["gunicorn", "django_project.wsgi", "--bind=unix:/var/run/gunicorn/gunicorn.sock"]

--Construire à nouveau

$ docker build -t gunicorn:latest .

Spécifiez un hôte pouvant accéder au projet Django

--Spécifiez dans ʻALLOWED_HOSTS = [] dans setting.py créé sous django_project --Il devrait être restreint normalement, mais ici il est défini sur ʻALLOWED_HOSTS = [*] pour permettre l'accès de tous les hôtes.

Créer un volume à monter avec la communication de socket de domaine UNIX

docker-compose.yaml


version: '3.7'

services:
  gunicorn:
    image: gunicorn:latest
    container_name: gunicorn
    volumes:
      - .:/usr/src/app/
      - gunicorn:/var/run/gunicorn
  nginx:
    image: nginx:1.17.7
    container_name: nginx
    depends_on:
      - gunicorn
    ports:
      - "80:80"
    volumes:
      - ./gunicorn.conf:/etc/nginx/conf.d/default.conf
      - gunicorn:/var/run/gunicorn
volumes:
  gunicorn:
    driver: local

--Créez un volume appelé gunicorn et montez-le dans chaque conteneur (cette fois, / var / run / gunicorn est spécifié dans les deux conteneurs)

Opération

$ docker-compose up -d
Starting gunicorn ... done
Starting nginx    ... done
スクリーンショット 2020-02-08 14.44.28.png

--OK si l'écran est affiché

Code source

référence

Recommended Posts

Lancer une application Web Python sur Nginx + Gunicorn avec Docker
Exécutez une application Web Python avec Docker
[Python] Une application web rapide avec Bottle!
Démarrez un serveur Web Python simple avec Docker
Lancer un serveur Web avec Python et Flask
Application Web avec Python + Flask ② ③
Application Web avec Python + Flask ④
Un mémo sur la création d'une application Django (Python) avec Docker
Déployer l'application Django avec Docker
Créer une application Web avec Django
Développement d'applications avec Docker + Python + Flask
Déployer l'application Django sur EC2 avec Nginx + Gunicorn + Supervisor
Démonisez une application Web Python avec Supervisor
Créer un environnement Python + uWSGI + Nginx avec Docker
Environnement de lancement avec LineBot + Heroku + Docker + Python
Créez un framework Web avec Python! (1)
Créer un service Web avec Docker + Flask
Lancez l'application Flask avec Docker sur Heroku
Créez un framework Web avec Python! (2)
J'ai fait une application WEB avec Django
Créez rapidement un environnement d'exécution d'application Web Python3.4 + Nginx + uWSGI + Flask en utilisant pyenv sur Ubuntu 12.04
[GCP] Procédure de création d'une application Web avec Cloud Functions (Python + Flask)
[Streamlit] Je déteste JavaScript, donc je crée une application Web uniquement avec Python
Implémentez une application simple avec Python full scratch sans utiliser de framework web.
[Python] Créer un environnement de développement Django avec Docker
Étapes pour développer une application Web en Python
Créer un environnement de Nginx + uWSGI + Python (Django) avec docker
Exécutez Flask sur CentOS avec python3.4, Gunicorn + Nginx.
Facile à créer une application console Python avec Click
Extraire des données d'une page Web avec Python
Utiliser python avec docker
Mettez Docker dans Windows Home et exécutez un serveur Web simple avec Python
Créez rapidement un environnement d'exécution d'application Web Python3.4 + Nginx + uWSGI + Flask en utilisant venv sur Ubuntu 14.04 LTS
(Python) Essayez de développer une application Web en utilisant Django
Analyser et visualiser JSON (application Web ⑤ avec Python + Flask)
Application Web réalisée avec Python3.4 + Django (Construction de l'environnement Part.1)
Créer un environnement de développement d'applications d'apprentissage automatique avec Python
Créer une couche pour AWS Lambda Python dans Docker
Lancer Django sur un conteneur Docker à l'aide de docker-compose up
Web scraping avec python + JupyterLab
Créer une application Web avec Django
Préparer l'environnement python3 avec Docker
API Web avec Python + Falcon
Faites une loterie avec Python
Web scraping débutant avec python
Créer un répertoire avec python
Paramètres du serveur Python (nginx + Gunicorn)
Rationalisez la recherche Web avec Python
Créer une application Rails avec Docker
[Avec diagramme d'image] Nginx + gunicorn + Flask converti en Docker [Partie 2]
Créez une application Web qui reconnaît les nombres avec un réseau neuronal
Créez un environnement de développement Django avec Docker! (Docker-compose / Django / postgreSQL / nginx)
Comment convertir un tableau en dictionnaire avec Python [Application]
Créez un environnement de développement Python simple avec VSCode et Docker Desktop
Application Web avec Python3.3.1 + Bottle (1) - Changer le moteur de modèle en jinja2
[Avec diagramme d'image] Nginx + gunicorn + Flask converti en Docker [Partie 1]
Afficher la page Web avec FastAPI + uvicorn + Nginx (conversion SSL / HTTPS)
J'ai créé un environnement pour Masonite, un framework WEB Python similaire à Laravel, avec Docker!
[Python] Qu'est-ce qu'une instruction with?