Implementierung der Nginx-Domänennamenweiterleitung für den HTTPS-Zugriff

Implementierung der Nginx-Domänennamenweiterleitung für den HTTPS-Zugriff

Ein Wort vorab:

Plötzlich erhielt ich die Aufgabe, den Zugriff mehrerer Domänennamen an https weiterzuleiten. Tatsächlich ist die Verwendung von Niginx sehr einfach und die Dokumentation ist auch vollständig (egal, ob es sich um Tencent Cloud oder Alibaba Cloud handelt). Der Grund dafür, dass ich in diese Falle getappt bin, war die Unkenntnis des Niginx-Servers und die Umwege, die ich gemacht habe.

1. Umweg: Tomcat unterstützt SSL

Tencent Cloud Tomcat Server-Zertifikatkonfiguration

Ändern der Datei server.xml

<Anschluss 
   Port="443" 
   Protokoll="org.apache.coyote.http11.Http11NioProtocol" 
   SSLEnabled="true" 
   Schema="https" 
   sicher="true" 
   keystoreFile="conf\ssl\erstellter Zertifikatsname. Ich verwende einen relativen Pfad.jks" 
   keystoreType="JKS" 
   keystorePass="Zum Zertifikat gehörendes Passwort" 
   clientAuth="false" 
   sslProtocol="TLSv1+TLSv1.1+TLSv1.2"
   maxThreads="150" ciphers="TLS_RSA_MIT_AES_128_CBC_SHA,TLS_RSA_MIT_AES_256_CBC_SHA,TLS_ECDHE_RSA_MIT_AES_128_CBC_SHA,TLS_ECDHE_RSA_MIT_AES_128_CBC_SHA256,TLS_RSA_MIT_AES_128_CBC_SHA256,TLS_RSA_MIT_AES_256_CBC_SHA256">
</Anschluss>

<!-- Definieren Sie einen AJP 1.3-Connector auf Port 8009 -->
<Connector port="8209" protocol="AJP/1.3" redirectPort="8443" secretRequired="" useBodyEncodingForURI="true" URIEncoding="UTF-8"/>

keystoreType="JKS": Bitte beachten Sie, dass sich diese Konfiguration von Alibaba Cloud unterscheidet. Denken Sie daran, sie zu ändern

<Engine defaultHost="Mein Domänenname" name="Catalina" jvmRoute="tomcat1" URIEncoding="UTF-8">
 <Cluster-Klassenname="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>
 <Realm-Klassenname="org.apache.catalina.realm.LockOutRealm">
  <Realm-Klassenname="org.apache.catalina.realm.UserDatabaseRealm" Ressourcenname="Benutzerdatenbank"/>
 </Reich>
 <Hostname="Mein Domänenname" appBase="webapps" unpackWARs="true" autoDeploy="true">
  <Valve-Klassenname="org.apache.catalina.valves.AccessLogValve" Verzeichnis="Protokolle"
    Präfix="localhost_access_log" Suffix=".txt"
    Muster="%h %l %u %t &quot;%r&quot; %s %b" />
 </Host>
</Engine>

Von meinen Kollegen habe ich gehört, dass man nur die Konfiguration braucht. Das gleiche passierte auch. Nachdem der Server gestartet war, war auch Port 443 belegt. Das war wirklich eine Falle. Wenn die Weiterleitung nicht benötigt wird, kann man die Konfiguration ändern.

Beim Starten von nginx ist ein Fehler aufgetreten. bind() an 0.0.0.0:443 ist fehlgeschlagen (10013: Es wurde versucht, auf einen Socket auf eine Weise zuzugreifen, die durch seine Zugriffsberechtigungen verboten ist.

2. Kommen wir zurück zum Thema

2.1 Anforderungen im Überblick

Wenn auf einem Server (der IP-Adresse des Tencent Cloud-Servers) mehrere Dienste bereitgestellt werden und auf verschiedene Dienste über unterschiedliche Domänennamen zugegriffen werden muss, kann die Domänennamenweiterleitung über einen Nginx-Proxy erfolgen und der https-Zugriff durch Konfigurieren des SSL-Moduls erreicht werden. (Mein Server verwendet das Windows-System. Wenn kein SSL-Modul vorhanden ist, müssen Sie es selbst aktivieren. Es wird standardmäßig unterstützt.)

Stellen Sie drei Dienste gleichzeitig auf einem Server bereit: Dienst A, Dienst B und Dienst C. Die Dienste müssen mit den folgenden Domänennamen konfiguriert werden:

  • Der Domänenname pangsir01.domain.com entspricht Dienst A;
  • Der Domänenname pangsir02.domain.com entspricht Dienst B;
  • Der Domänenname pangsir03.domain.com entspricht Dienst C;

Der Zugriff auf den Dienst erfolgt über https und http-Anfragen werden auf https umgeleitet.

2.2 Service-Proxy-Einstellungen

Konfigurieren Sie Nginx so, dass es auf Port 443 lauscht (== Ich steckte hier wegen der Tomcat-Konfiguration lange fest und es war erfolglos ==), implementieren Sie die Domänennamenweiterleitung und den https-Zugriff. Das in diesem Beispiel verwendete Zertifikat ist ein Zertifikat im CRT-Format

(1) Konfiguration des Dienstes A

Server {
 listen 443 ssl; #Abhörport, Nginx1.5 und höher empfehlen die Verwendung von server_name pangsir01.domain.com; #Domänennamen anfordern ssl_certificate ssl/Zertifikatname A.crt; #CRT-Zertifikatpfad, Speicherort Nginx‘ conf/ssl-Ordner, Sie können den absoluten Pfad verwenden ssl_certificate_key ssl/Zertifikatname A.key; #CRT-Zertifikatschlüsselpfad ssl_session_timeout 5m; #Sitzungstimeout ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4; #Verschlüsselungsalgorithmus ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #SSL-Protokoll #Alle Anfragen abfangen location / {
  proxy_http_version 1.1; #vom Proxy verwendetes HTTP-Protokoll proxy_set_header Host $host; #Header fügt Host-Informationen der Anfrage hinzu proxy_set_header X-Real-IP $remote_addr; #Header fügt IP-Informationen der Anfragequelle hinzu proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # Proxy-Eintrag hinzufügen proxy_pass http://127.0.0.1:8001; #Zugriffsadresse von Dienst A}
}

(2) Konfiguration des Dienstes B

Server {
 listen 443 ssl; #Abhörport, Nginx1.5 und höher empfehlen die Verwendung von server_name pangsir02.domain.com; #Domänennamen anfordern ssl_certificate ssl/Zertifikatname B.crt; #CRT-Zertifikatpfad, Speicherort Nginx‘ conf/ssl-Ordner, Sie können den absoluten Pfad verwenden ssl_certificate_key ssl/Zertifikatname B.key; #CRT-Zertifikatschlüsselpfad ssl_session_timeout 5m; #Sitzungstimeout ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4; #Verschlüsselungsalgorithmus ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #SSL-Protokoll #Alle Anfragen abfangen location / {
  proxy_http_version 1.1; #vom Proxy verwendetes HTTP-Protokoll proxy_set_header Host $host; #Header fügt Host-Informationen der Anfrage hinzu proxy_set_header X-Real-IP $remote_addr; #Header fügt IP-Informationen der Anfragequelle hinzu proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # Proxy-Eintrag hinzufügen proxy_pass http://127.0.0.1:8002; #Zugriffsadresse für Dienst B}
}

(3) Konfiguration des Dienstes C

Server {
 listen 443 ssl; #Abhörport, Nginx1.5 und höher empfehlen die Verwendung von server_name pangsir03.domain.com; #Domänennamen anfordern ssl_certificate ssl/Zertifikatname C.crt; #CRT-Zertifikatpfad, Speicherort Nginx‘ conf/ssl-Ordner, Sie können den absoluten Pfad verwenden ssl_certificate_key ssl/Zertifikatname C.key; #CRT-Zertifikatschlüsselpfad ssl_session_timeout 5m; #Sitzungstimeout ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4; #Verschlüsselungsalgorithmus ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #SSL-Protokoll #Alle Anfragen abfangen location / {
  proxy_http_version 1.1; #vom Proxy verwendetes HTTP-Protokoll proxy_set_header Host $host; #Header fügt Host-Informationen der Anfrage hinzu proxy_set_header X-Real-IP $remote_addr; #Header fügt IP-Informationen der Anfragequelle hinzu proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # Proxy-Eintrag hinzufügen proxy_pass http://127.0.0.1:8003; #Zugriffsadresse für Dienst B}
}

2.3 Automatische Weiterleitung von http-Anfragen

Serverkonfiguration hinzufügen, Port 80 überwachen und alle Domänennamen auf https umleiten

Server {
 listen 80; #Abhörport Servername a.domain.com b.domain.com c.domain.com; #Domänennamen anfordern return 301 https://$host$request_uri; #Umleitung zum https-Zugriff.
}

Meine Bedürfnisse werden hier erfüllt. Der folgende Inhalt ist erweiterter Inhalt. Bitte notieren Sie ihn.

3. SSL-Konfiguration für WebSocket

Wenn WebSocket in Dienst A verwendet wird (die Zugriffsschnittstelle ist: /websocket), muss das WS-Protokoll durch das WSS-Protokoll ersetzt werden. Der Serverkonfiguration von Dienst A kann eine Standortkonfiguration hinzugefügt werden, um WebSocket für einen separaten Proxy abzufangen.

Die Konfiguration von Dienst A nach der Änderung:

Server {
  listen 443 ssl; #Abhörport Servername pangsir01.domain.com; #Domänenname anfordern ssl_certificate ssl/Zertifikatname A.crt; #CRT-Zertifikatpfad ssl_certificate_key ssl/Zertifikatname A.key; #CRT-Zertifikatschlüsselpfad ssl_session_timeout 5m; #Sitzungstimeout ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4; #Verschlüsselungsalgorithmus ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #SSL-Protokoll #Alle Anfragen abfangen location / {
   proxy_http_version 1.1; #vom Proxy verwendetes HTTP-Protokoll proxy_set_header Host $host; #Header fügt Host-Informationen der Anfrage hinzu proxy_set_header X-Real-IP $remote_addr; #Header fügt IP-Informationen der Anfragequelle hinzu proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # Proxy-Eintrag hinzufügen proxy_pass http://127.0.0.1:8001; #Zugriffsadresse von Dienst A}
  
  #WebSocket-Anforderung abfangen Standort /websocket {
   Proxy-Passwort http://127.0.0.1:8001;
   Proxy_http_Version 1.1;
   Proxy_Set_Header-Upgrade $http_upgrade;
   proxy_set_header Verbindung "Upgrade";
  }
 }

Dies ist das Ende dieses Artikels über die Implementierung der Nginx-Domänennamenweiterleitung per https-Zugriff. Weitere relevante Inhalte zur Nginx-Domänennamenweiterleitung per https-Zugriff finden Sie in früheren Artikeln auf 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, dass jeder 123WORDPRESS.COM in Zukunft unterstützen wird!

Das könnte Sie auch interessieren:
  • Nginx-Konfigurationsbeispiel zum Verteilen von Inhalten basierend auf Domänennamen http und https
  • So konfigurieren Sie mehrere HTTPS-Domänennamen in Nginx
  • Detaillierte Erklärung der Lösung für NGINX zum Umstieg von https auf http
  • So zwingen Sie Nginx zur Verwendung des https-Zugriffs (http springt zu https)
  • Detaillierte Erläuterung der Nginx-Konfiguration des SSL-Zertifikats zur Erlangung des HTTPS-Zugriffs
  • Detaillierte Erklärung zur Konfiguration von HTTPS in nginx
  • Detaillierter Prozess der Konvertierung von http in https durch Nginx

<<:  So verwenden Sie MySQL „group by“ und „order by“ gemeinsam

>>:  WeChat Mini-Programm Lotterienummerngenerator

Artikel empfehlen

Fünf Verzögerungsmethoden für die MySQL-Zeitblindinjektion

Fünf Verzögerungsmethoden für die MySQL-Zeitblind...

JavaScript zur Implementierung der Schaltfläche „Zurück nach oben“

In diesem Artikel wird der spezifische Code für J...

Detaillierte Erklärung der Primärschlüssel und Transaktionen in MySQL

Inhaltsverzeichnis 1. Kommentare zu MySQL-Primärs...

Zeichnen Sie ein Herz mit CSS3

Ergebnisse erzielenAnforderungen/Funktionalität: ...

Lösung für das Problem ungenauer JS-Zahlen

Die verständlichste Erklärung des Genauigkeitspro...

JavaScript-Closures erklärt

Inhaltsverzeichnis 1. Was ist ein Abschluss? 2. D...

MySQL-Sequenz AUTO_INCREMENT ausführliche Erklärung und Beispielcode

MySQL-Sequenz AUTO_INCREMENT ausführliche Erkläru...

Reines CSS, um den Listen-Pulldown-Effekt auf der Seite zu erzielen

Möglicherweise sehen Sie häufig den folgenden Eff...

Entwerfen Sie eine einfache HTML-Anmeldeoberfläche im CSS-Stil

login.html-Teil: <!DOCTYPE html> <html l...