[PYTHON] Afficher la page Web avec FastAPI + uvicorn + Nginx (conversion SSL / HTTPS)

0. Introduction

En conséquence, je modifierai et ajouterai les paramètres Nginx et j'essaierai d'ajouter l'authentification SSL (HTTPS) et BASIC.

  1. SSL

Structure du répertoire (extrait)

$ tree 
.
├── app
├── docker-compose.yml
└── web
    ├── conf.d
    │   └── app.conf
    └── ssl
        ├── server.crt
        └── server.key

--Modification de docker-compose.yml --Modifier / ajouter des fichiers dans le répertoire web --Modifier conf.d / app.conf --Préparation du certificat / clé (répertoire ssl /)

Besoin de chacun

le détail est juste en dessous:

docker-compose.yml

Fixé comme suit:

docker-compose.yml


version: '3'

services:
  web:
    container_name: web
    image: nginx:alpine
    depends_on:
      - app
    ports:
      - "80:80"
      - "${PORT:-8443:443}"
    volumes:
      - ./web/conf.d:/etc/nginx/conf.d
      - ./web/ssl:/etc/nginx/ssl
    networks:
      - nginx_network

  app:
    container_name: app
    image: test_fastapi_app
    build:
      context: ./app
      dockerfile: Dockerfile
    expose:
      - 8000
    networks:
      - nginx_network
    # volumes:
    #   - ./app/app:/app/app
    # command: "uvicorn app.main:app --host 0.0.0.0 --proxy-headers --forwarded-allow-ips * --reload"

networks:
  nginx_network:
    driver: bridge

Si vous extrayez uniquement la partie où il y a une différence,

docker-compose.yml(Extrait)


services:
  web:
    ports:
      # - "80:80"
      - "${PORT:-8443:443}"
    volumes:
      - ./web/conf.d:/etc/nginx/conf.d
      - ./web/ssl:/etc/nginx/ssl

--Modification du mappage de port pour SSL

web / ssl (clé / certificat)

web
└── ssl
    ├── server.crt
    └── server.key

Préparez ceux qui correspondent à server.crt et server.key dans ↑ et placez-les respectivement dans le répertoire web / ssl.

Dans cet exemple, le script (one-liner) qui a généré automatiquement le certificat oleore est placé tel quel:

make_key.sh


#!/usr/bin/env sh

openssl req -batch -new -x509 -newkey rsa:4096 -nodes -sha256 \
  -subj /CN=example.com/O=example -days 3650 \
  -keyout ./server.key \
  -out ./server.crt

web/conf.d/app.conf

Réécrivez le fichier de configuration Nginx.

conf:conf.d/app.conf


upstream backend {
    server app:8000;
}

server {
    listen 443 ssl;
    ssl_certificate     /etc/nginx/ssl/server.crt;
    ssl_certificate_key /etc/nginx/ssl/server.key;
    ssl_protocols        TLSv1.2 TLSv1.3;

    # server_name  _;
    index index.html index.htm;

    location / {
        proxy_set_header    Host    $http_host;
        proxy_set_header    X-Real-IP    $remote_addr;
        proxy_set_header    X-Forwarded-Host      $http_host;
        proxy_set_header    X-Forwarded-Server    $http_host;
        proxy_set_header    X-Forwarded-Server    $host;
        proxy_set_header    X-Forwarded-For    $proxy_add_x_forwarded_for;
        proxy_set_header    X-Forwarded-Proto  $scheme;
        proxy_redirect      http:// https://;

        proxy_pass http://backend;
    }

    # log
    # access_log /var/log/nginx/access.log;
    # error_log /var/log/nginx/error.log;
}

server_tokens off;

Changements critiques:

    listen 443 ssl;
    ssl_certificate     /etc/nginx/ssl/server.crt;
    ssl_certificate_key /etc/nginx/ssl/server.key;
    ssl_protocols        TLSv1.2 TLSv1.3;

--Modifié / ajouté proxy _ *** dans location / «Je ne me souviens pas beaucoup des détails parce que je l'ai fait tellement et j'ai eu beaucoup d'essais et d'erreurs. .. .. ――Il peut donc être mélangé avec des paramètres inutiles. .. ..

        proxy_set_header    Host    $http_host;
        proxy_set_header    X-Real-IP    $remote_addr;
        proxy_set_header    X-Forwarded-Host      $http_host;
        proxy_set_header    X-Forwarded-Server    $http_host;
        proxy_set_header    X-Forwarded-Server    $host;
        proxy_set_header    X-Forwarded-For    $proxy_add_x_forwarded_for;
        proxy_set_header    X-Forwarded-Proto  $scheme;
        proxy_redirect      http:// https://;

Pour le moment, avec ça docker-compose up -d Si vous accédez à https: // localhost: 8443 (port défini par vous-même), etc., vous pouvez confirmer que la communication https est utilisée.

2. (Bonus) Certification BASIC avec Nginx

Au fait, passons à la certification BASIC

--Générer .htpasswd à l'avance

.
├── app
├── docker-compose.yml
└── web
    ├── conf.d
    |   ├── .htpasswd
    │   └── app.conf
    └── ssl

conf:conf.d/app.conf


upstream backend {
    server app:8000;
}

server {
    listen 443 ssl;
    ssl_certificate     /etc/nginx/ssl/server.crt;
    ssl_certificate_key /etc/nginx/ssl/server.key;
    ssl_protocols        TLSv1.2 TLSv1.3;

    # basic-auth
    auth_basic "BASIC AUTH";
    auth_basic_user_file /etc/nginx/conf.d/.htpasswd;

    # server_name  _;
    index index.html index.htm;

    location / {
        proxy_set_header    Host    $http_host;
        proxy_set_header    X-Real-IP    $remote_addr;
        proxy_set_header    X-Forwarded-Host      $http_host;
        proxy_set_header    X-Forwarded-Server    $http_host;
        proxy_set_header    X-Forwarded-Server    $host;
        proxy_set_header    X-Forwarded-For    $proxy_add_x_forwarded_for;
        proxy_set_header    X-Forwarded-Proto  $scheme;
        proxy_redirect      http:// https://;

        proxy_pass http://backend;
    }

    # log
    # access_log /var/log/nginx/access.log;
    # error_log /var/log/nginx/error.log;
}

server_tokens off;

↑ J'ai ajouté ce qui suit:

app.conf (partie supplémentaire)


    # basic-auth
    auth_basic "BASIC AUTH";
    auth_basic_user_file /etc/nginx/conf.d/.htpasswd;

Avec cela, par exemple, l'authentification peut être effectuée comme suit:

スクリーンショット 2020-08-16 14-50-02.png

(* Cette fois, c'est mon certificat, donc un avertissement est émis)

référence

--Redirect de http vers https avec Nginx

--Générer .htpasswd

Recommended Posts

Afficher la page Web avec FastAPI + uvicorn + Nginx (conversion SSL / HTTPS)
Afficher une page Web avec FastAPI + uvicorn + Nginx (fonction Modèles de Jinja2)
Extraire des données d'une page Web avec Python
Lancer une application Web Python sur Nginx + Gunicorn avec Docker
Obtenez la page Web Python, encodez et affichez les caractères
[python, ruby] sélénium-Obtenez le contenu d'une page Web avec le pilote Web
Pratique de développement d'applications Web: Créez une page de création d'équipe avec Django! (Page de création de décalage)
Grattage WEB avec BeautifulSoup4 (page en couches)
Créer une application Web avec Django
Pratique de développement d'applications Web: Créez une page de création d'équipe avec Django! (Introduction)
[PyQt] Afficher des graphiques multi-axes avec QtChart
Afficher les diagrammes matplotlib dans une application Web
Jouez comme une application Web avec ipywidgets
Démonisez une application Web Python avec Supervisor
[Note personnelle] Scraping de pages Web en python3
Surveillez les mises à jour des pages Web avec LINE BOT
[Python] Une application web rapide avec Bottle!
Créez une application Web simple avec Flask
Exécutez une application Web Python avec Docker
Créer un service Web avec Docker + Flask
Grattage WEB avec BeautifulSoup4 (page du numéro de série)
Créez un framework Web avec Python! (2)
J'ai fait une application WEB avec Django