Reverse-Proxy-https-Protokoll zur HTTP-Protokollanforderung über Nginx

1. Problemhintergrund

Derzeit unterstützt ein System nur den HTTPS-Protokollzugriff. Da der Back-End-Dienst auf dem SSL-Protokoll basiert, muss das Front-End auch HTTPS-Anfragen des SSL-Protokolls für den Zugriff unterstützen. Der aktuelle Proxyserver ist Nginx, jetzt möchte ichGreifen Sie über http auf das System zu, Sie müssen den Reverse-Proxy oder die Umleitungsmethode

1. Stellen Sie sicher, dass das Backend zwei Ports öffnet. Ein Port unterstützt den HTTP-Protokollzugriff und ein Port unterstützt den HTTP-Protokollzugriff. Anschließend wird die Front-End-Anfrage über den Nginx-Proxy weitergeleitet. Gleichzeitig öffnet Nginx auch zwei Ports (z. B. Port 80). wird für den HTTP-Zugriff und Port 443 für den HTTP-Zugriff verwendet. (Zugriff auf das System). Sorgen Sie dafür, dass unterschiedliche Protokolle unterschiedliche Back-End-Dienste nutzen

2. Verwenden Sie die Umleitungsfunktion von Nginx, um jede http-Anfrage in eine https-Anfrage umzuleiten.

3. Verwenden Sie die Reverse-Proxy-Funktion von Nginx, um das https-Protokoll umgekehrt auf die HTTP-Protokollanforderung umzustellen.

2. Führen Sie die Reverse-Proxy-Funktion von Nginx ein und konfigurieren Sie das https-Protokoll

Ein Reverse-Proxy ist eine Serverarchitektur, die Anfragen von Clients empfängt, diese Anfragen an einen oder mehrere Backend-Server weiterleitet und Antworten von den Backend-Servern an den Client zurückgibt.
Unterschiede zum Forward-Proxy:

Der Forward-Proxy istClient und Proxyserverein Agenturmodell zwischen. Beim Forward-Proxy wird die Client-Anfrage zunächst an den Proxy-Server gesendet, der die Anfrage dann an den Zielserver weiterleitet. Der Proxyserver sendet Anfragen im Namen des Clients.Der Zielserver kennt nicht die Identität des Clients, der die Anfrage tatsächlich gestellt hat
Der Reverse-Proxy istServer und Backend-Serverein Agenturmodell zwischen. Bei einem Reverse-Proxy werden Client-Anfragen zunächst an den Reverse-Proxy-Server gesendet, der die Anfrage dann je nach Konfiguration an einen oder mehrere Server im Backend weiterleitet. Die Antwort vom Backend-Server wird vom Reverse-Proxy-Server an den Client zurückgegeben.Der Client muss die tatsächliche Existenz des Backend-Servers nicht kennen.
Ein Reverse-Proxy ist wie ein Verkäufer in einem Geschäft. Wenn Sie in das Geschäft gehen, um einzukaufen, haben Sie es mit dem Verkäufer zu tun, aber die Waren werden tatsächlich aus dem Lager auf der Rückseite entnommen. Der Verkäufer hilft Ihnen bei der Beschaffung des Produkts und überreicht es Ihnen dann. In dieser Metapher ist der Verkäufer der Reverse-Proxy, das Lager der Backend-Server und Sie der Kunde.

Nginx konfiguriert https-Anfragen hauptsächlich auf die folgende Weise und verwendet die Standortanweisung, um die Anfragen an die https-Schnittstelle des Backends weiterzuleiten.

server {
    listen 443 ssl;
    server_name example.com www.example.com;
    
    ssl_certificate /path/to/ssl/certificate.crt;
    ssl_certificate_key /path/to/ssl/private.key;

    location / {
        # 处理HTTPS请求的配置
        proxy_pass https://backend_server;
    }
}

3. Konkrete Umsetzung

3.1 Methoden zur Unterstützung des Backend-Dienstes

In der Springboot-Anwendung kann der offene Port über die Konfigurationsdatei konfiguriert werden, es kann jedoch nur ein Protokoll wie folgt angegeben werden: Ein Anwendungsport, auf den über das https-Protokoll zugegriffen wird, kann über das Serverattribut der Anwendung konfiguriert werden. yml
Fügen Sie hier eine Bildbeschreibung ein
Wenn Sie einen Port erneut öffnen möchten, um HTTP-Anfragen zu unterstützen, müssen Sie eine Konfigurationsklasse entsprechend dem verwendeten Back-End-Server schreiben. Das aktuelle Projekt verwendet den Jeety-Server und die Konfiguration Der Klassencode lautet wie folgt:

import org.springframework.boot.web.embedded.jetty.JettyServletWebServerFactory;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class HttpConfig {
    
    

    @Bean
    public WebServerFactoryCustomizer<JettyServletWebServerFactory> servletContainer() {
    
    
        return server -> {
    
    
            server.setPort(8081); // 这里配置 HTTP 端口为 8081,也可以通过加配置文件方式获取
        };
    }
}

Wenn das Projekt zu diesem Zeitpunkt gestartet wird, werden zwei Ports gleichzeitig geöffnet und dann kann der Nginx-Proxy verwendet werden.

3.2 Nginx-Umleitungsmethode

Konfigurieren Sie Nginx zum Abhören von HTTP- (80) und HTTPS- (443) Ports: Erstellen Sie einen Serverblock in der Nginx-Konfiguration, der jeweils HTTP- und HTTPS-Ports abhört.
Die Konfiguration ist wie folgt:

server {
    
    
    listen 80;
    server_name yourdomain.com www.yourdomain.com;

    location / {
    
    
        return 301 https://$host$request_uri;  # 将 HTTP 请求重定向到 HTTPS
    }
}

server {
    
    
    listen 443 ssl;
    server_name yourdomain.com www.yourdomain.com;

    ssl_certificate /path/to/ssl/certificate.crt;
    ssl_certificate_key /path/to/ssl/private.key;

    # 这里可以添加其他 HTTPS 相关的配置
}

return: Dies ist eine Nginx-Direktive, die zum Generieren einer HTTP-Antwort verwendet wird.
301: Dies ist der HTTP-Statuscode, der eine permanente Weiterleitung anzeigt. Wenn der Browser oder Client diesen Statuscode empfängt, weiß er, dass die angeforderte URL dauerhaft an einen neuen Speicherort verschoben wurde und daher das Lesezeichen oder der Cache aktualisiert werden sollte.
https://$ host $ request_uri: Dies ist die Weiterleitungsziel-URL. $host ist eine in Nginx integrierte Variable, die den vom Benutzer angeforderten Hostnamen darstellt. $request_uri ist auch eine integrierte Variable, die den vom Benutzer angeforderten URI (einschließlich Abfrageparametern) darstellt. In diesem Abschnitt wird die HTTPS-Version der URL angegeben, zu der der Benutzer umgeleitet wird, einschließlich desselben Hostnamens und Anforderungspfads.

Später durch Neuladen der Nginx-Konfiguration: Speichern Sie die Konfigurationsdatei und laden Sie Nginx neu, damit die Änderungen wirksam werden. Der Befehl lautet wie folgt:

sudo ./nginx -s neu laden

ist auf ein Problem gestoßen: Auf diese Weise wird die eigentliche Anfrage weiterhin unter dem https-Protokoll gesendet und der Browser wird beim Zugriff auf http auf https umgeleitet. Das heißt, es kann erst nach dem HTTP-Zugriff in das HTTPS-Protokoll konvertiert werden und kann den HTTP-Anforderungszugriff nicht wirklich nutzen.
Fügen Sie hier eine Bildbeschreibung ein
Das eigentliche Ergebnis ist eine 301-Weiterleitung:
Fügen Sie hier eine Bildbeschreibung ein

3.3. Nginx-Reverse-Proxy-Methode

Um HTTP-Anfragen an HTTPS weiterzuleiten, ohne eine Umleitung durchzuführen, können Sie den Proxy im HTTP-Serverblock verwenden. Diese Konfiguration leitet HTTP-Anfragen an HTTPS weiter, ohne eine Umleitung durchzuführen. Dies bedeutet, dass der Browser weiterhin HTTP-Anfragen sendet, Nginx diese jedoch an den HTTPS-Port desselben Domänennamens weiterleitet und die Antwort dann an den Browser zurückgibt. Und intern werden weiterhin HTTPS-Verbindungen verwendet, sodass die Daten weiterhin verschlüsselt übertragen werden. Wie folgt:

# 配置 HTTP 服务器块,监听 HTTP 请求并代理到 HTTPS
server {
    
    
    listen 80;
    server_name yourfrontenddomain.com;  # 指定前端域名

    location / {
    
    
        proxy_pass https://yourdomain.com;  # 将 HTTP 请求代理到 HTTPS
        add_header 'Access-Control-Allow-Origin' 'http://yourfrontenddomain.com';  # 允许跨域请求来自指定域名
        add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';  # 允许的 HTTP 方法
        add_header 'Access-Control-Allow-Headers' 'Authorization, Origin, X-Requested-With, Content-Type, Accept';  # 允许的请求头

		#代理后保证cookie传递
		proxy_cookie_path / /;

		# 启用WebSocket支持
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }
}

# 配置 HTTPS 服务器块,用于 HTTPS 请求
server {
    
    
    listen 443 ssl;
    server_name yourdomain.com www.yourdomain.com;  # 指定后端域名和可能的 www 子域名

    ssl_certificate /path/to/ssl/certificate.crt;  # 指定 SSL 证书的路径
    ssl_certificate_key /path/to/ssl/private.key;  # 指定 SSL 私钥的路径

    # 这里可以添加其他 HTTPS 相关的配置,如 SSL 版本、密码套件等
}

Wenn bei HTTP-Proxy-HTTP-Anfragen über Nginx ein Cookie nicht zugestellt werden kann oder andere domänenübergreifende Fehler auftreten, müssen Sie das Problem möglicherweise im Detail analysieren, dies ist jedoch derzeit machbar.
Die Ergebnisse des HTTP-Zugriffs sind wie folgt:
Fügen Sie hier eine Bildbeschreibung ein
Die Ergebnisse des HTTP-Zugriffs sind wie folgt:
Fügen Sie hier eine Bildbeschreibung ein
Und die statischen Ressourcen und Die dahinter liegenden Back-End-Schnittstellen erfolgen über http und https. Der Zugriff über beide Protokolle ist normal.

4. Über allgemeine Nginx-Module und Anweisungen

Kernmodul:
http: Definieren Sie die HTTP-Protokoll-bezogene Konfiguration.
Ereignisse: Konfigurieren Sie ereignisgesteuerte Modelle wie Epoll und Kqueue.
Server: Virtuellen Host und Serverblock konfigurieren.
Standort: Konfigurieren Sie den angeforderten Standort und die URI-Übereinstimmungsregeln.

Http-Modul:
Zugriff: Steuert die angeforderten Zugriffsberechtigungen.
gzip: Gzip-Komprimierung aktivieren, um die Größe der übertragenen Daten zu reduzieren.
ssl: Konfigurieren Sie SSL/TLS-bezogene Einstellungen, um HTTPS zu aktivieren.
rewrite: URL neu schreiben, kann für die URL-Umleitung und das Umschreiben verwendet werden.
Upstream-Modul:

Sicherheitsmodul:
http_auth_basic: HTTP-Basisauthentifizierung aktivieren.
http_limit_req: Begrenzen Sie die Anforderungsrate, um DDoS-Angriffe zu verhindern.
http_limit_conn: Begrenzen Sie die Anzahl gleichzeitiger Verbindungen, um den Server vor Verbindungsüberlastungsangriffen zu schützen.

Protokollierungsmodul:
access_log: Konfigurieren Sie das Format und den Pfad des Zugriffsprotokolls.
error_log: Konfigurieren Sie das Format und den Pfad des Fehlerprotokolls.

Mail-Modul:
Mail: unterstützt die Mail-Proxy-Server-Funktion und kann zum Konfigurieren von E-Mail-Servern verwendet werden.
imap: Unterstützt das IMAP-Protokoll.
smtp: Unterstützt das SMTP-Protokoll.

Drittanbietermodul:
ngx_http_geoip_module: Stellt geografische Standortinformationen bereit, die für regionale Einschränkungen und die Ausrichtung auf Benutzer verwendet werden können.
ngx_pagespeed: Webseiten automatisch optimieren, um die Leistung zu verbessern.
ngx_lua: Bietet Lua-Skriptunterstützung für erweiterte Anpassung und erweiterte Funktionalität.
ngx_cache_purge: Bietet eine Cache-Löschfunktion zum manuellen Löschen des Proxy-Cache.

Stream-Modul: unterstützt für TCP- und UDP-Proxys den Lastausgleich.
Stream: TCP/UDP-Proxyserver konfigurieren.
Upstream: Konfigurieren Sie den Backend-Serverpool.
Proxy: Reverse-Proxy-Einstellungen konfigurieren.

Fügen Sie hier eine Bildbeschreibung ein

おすすめ

転載: blog.csdn.net/qq_40454136/article/details/132687619