[PYTHON] Webseite mit FastAPI + uvicorn + Nginx anzeigen (SSL / HTTPS-Konvertierung)

0. Einleitung

Als Fortsetzung werde ich die Nginx-Einstellungen bearbeiten und hinzufügen und versuchen, die SSL- (HTTPS) und BASIC-Authentifizierung hinzuzufügen.

  1. SSL

Verzeichnisstruktur (Auszug)

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

--Modifikation von docker-compose.yml --Modifizieren / Hinzufügen von Dateien im Verzeichnis "web"

Brauche jeden

Das Detail ist direkt unten:

docker-compose.yml

Wie folgt behoben:

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

Wenn Sie nur den Teil extrahieren, bei dem es einen Unterschied gibt,

docker-compose.yml(Auszug)


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

web / ssl (Schlüssel / Zertifikat)

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

Bereiten Sie diejenigen vor, die server.crt und server.key in ↑ entsprechen, und legen Sie sie im Verzeichnis web / ssl ab.

In diesem Beispiel wird das Skript (einzeilig), das das Oleore-Zertifikat automatisch generiert hat, so platziert, wie es ist:

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

Schreiben Sie die Nginx-Konfigurationsdatei neu.

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;

Kritische Änderungen:

    listen 443 ssl;
    ssl_certificate     /etc/nginx/ssl/server.crt;
    ssl_certificate_key /etc/nginx/ssl/server.key;
    ssl_protocols        TLSv1.2 TLSv1.3;
        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://;

Vorerst damit docker-compose up -d Wenn Sie auf https: // localhost: 8443 (von Ihnen selbst festgelegter Port) usw. zugreifen, können Sie bestätigen, dass die https-Kommunikation verwendet wird.

2. (Bonus) BASIC-Zertifizierung bei Nginx

Lassen Sie uns übrigens zur BASIC-Zertifizierung aufsteigen

.
├── 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;

↑ Ich habe folgendes hinzugefügt:

app.conf (zusätzlicher Teil)


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

Damit kann beispielsweise die Authentifizierung wie folgt erfolgen:

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

(* Diesmal ist es mein Zertifikat, daher wird eine Warnung ausgegeben.)

Referenz

--Nginx Reverse Proxy-Einstellungen

Recommended Posts

Webseite mit FastAPI + uvicorn + Nginx anzeigen (SSL / HTTPS-Konvertierung)
Zeigen Sie eine Webseite mit FastAPI + uvicorn + Nginx an (Vorlagenfunktion von Jinja2)
Extrahieren Sie mit Python Daten von einer Webseite
Starten Sie mit Docker eine Python-Webanwendung auf Nginx + Gunicorn
Holen Sie sich Python-Webseite, Zeichenkodierung und Anzeige
[Python, Ruby] Selen-Holen Sie sich Webseiteninhalte mit Webdriver
Entwicklungspraxis für Webanwendungen: Erstellen Sie mit Django eine Seite zum Erstellen von Schichten! (Schichterstellungsseite)
Erstellen Sie eine Webanwendung mit Django
Entwicklungspraxis für Webanwendungen: Erstellen Sie mit Django eine Seite zum Erstellen von Schichten! (Einführung)
[PyQt] Mehrachsendiagramme mit QtChart anzeigen
Anzeigen von Matplotlib-Diagrammen in einer Webanwendung
Spielen Sie wie eine Web-App mit ipywidgets
Dämonisieren Sie eine Python-Webanwendung mit Supervisor
[Persönlicher Hinweis] Scraping von Webseiten in Python3
Überwachen Sie Webseitenaktualisierungen mit LINE BOT
[Python] Eine schnelle Webanwendung mit Bottle!
Erstellen Sie eine einfache Web-App mit Flasche
Führen Sie eine Python-Webanwendung mit Docker aus
Erstellen Sie einen Webdienst mit Docker + Flask
WEB-Scraping mit BeautifulSoup4 (Seriennummernseite)
Erstellen Sie ein Webframework mit Python! (2)
Ich habe eine WEB-Bewerbung bei Django gemacht