So verwenden Sie Nginx zum Proxy mehrerer Anwendungssites in Docker

So verwenden Sie Nginx zum Proxy mehrerer Anwendungssites in Docker

Vorwort

Was ist die Rolle eines Agenten?
- Mehrere Domänennamen werden auf denselben Server aufgelöst

- Praktisch für einen Server, um nur einen Port für mehrere Anwendungen zu öffnen

- Zugriff auf Anwendungen ohne störende Ports, direkter Zugriff über den Domänennamen

Anwendungsisolierung

- Kopplung reduzieren

- ...

Im Allgemeinen ist es leicht zu warten und die Wartung einer Anwendung wirkt sich nicht auf andere Anwendungen aus.

Wie funktioniert der Proxy (wie kommunizieren Container miteinander)?

Sie können die Proxy-Funktion von nginx direkt verwenden (siehe zugehörige Funktionen separat). Das Problem hierbei ist die Kommunikation zwischen Docker-Containern.

Für die Kommunikation von Docker -Containern gibt es im Wesentlichen vier Möglichkeiten:

- Zugriff über Container-IP: Nach dem Neustart des Containers ändert sich die IP.

- Zugriff über die IP:Port-Methode des Hostcomputers: Wenn sich die IP des Hostcomputers ändert, muss jede Anwendung geändert und der Port gebunden werden, was mühsam ist.

- Verknüpfungen durch Verknüpfung herstellen: Zu viel Interdependenz ist der Wartung nicht förderlich.

- Benutzerdefiniertes Netzwerk: Container im selben Bridge-Netzwerk können aufeinander zugreifen.

Offensichtlich wird die benutzerdefinierte Netzwerkmethode gewählt, um verwandte Anwendungen mit demselben Netzwerk zu verknüpfen. Auf diese Weise besteht keine Abhängigkeit zwischen Anwendungen und Agenten und Agenten, was nicht nur für die Wartung, sondern auch für die Migration praktisch ist. Auch die Konfiguration ist nicht schwierig, Sie müssen lediglich die reguläre IP oder den Domänennamen durch den entsprechenden Containernamen ersetzen.

1. Einheitliches Netzwerk

Sie müssen also zunächst ein gemeinsames Bridge-Netzwerk erstellen:

Docker-Netzwerk, Proxy-Netzwerk erstellen

# Docker-Netzwerk ls anzeigen

2. Proxy-Dienstcontainer

Erstellen Sie einen Nginx-Servicecontainer speziell für Proxys mit dem Namen Proxy-Nginx, der mit Docker-Compose erstellt wird. Die endgültige Verzeichnisstruktur sieht wie folgt aus:

Proxy-Nginx
├── docker-compose.yml
├── Protokolle # Protokolle│ └── error.log
├── nginx
│ ├── Docker-Datei
│ ├── nginx.conf
│ └── startup.sh
├── sites #Konfiguration der Proxy-Site│ ├── baipiaoquan.com.conf
│ └── chaohuahui.com.conf
└── SSL # Zertifikatsdatei └── baipiaoquan.com.pem

Einige Dateien werden im nachfolgenden laufenden Prozess generiert. Bei der Konfiguration müssen Sie nur die erforderlichen Dateien und Verzeichnisse erstellen.

docker-compose.yml

Version: "3"

Netzwerke:
 Standard:
  extern:
   Name: Proxy-Netzwerk

Leistungen:
 nginx:
  bauen:
   Kontext: ./nginx
  Bände:
   - ./logs:/var/log/nginx
   - ./sites:/etc/nginx/sites-available
   - ./ssl:/etc/nginx/ssl
  Häfen:
   - "80:80"
   - „443:443“

Binden Sie die externen Ports 80 und 443 an den Proxyserver, und alle Anwendungen können von hier aus zugreifen.

Docker-Datei

VON nginx:alpine

LABEL-Betreuer="chuoke"

KOPIEREN Sie nginx.conf /etc/nginx/

APK-Update ausführen
  && APK-Upgrade
  && apk add --no-cache openssl
  && apk add --no-cache bash

AUSFÜHREN set -x;
  addgroup -g 82 -S www-Daten;
  adduser -u 82 -D -S -G www-Daten www-Daten && exit 0 ; exit 1

HINZUFÜGEN ./startup.sh /opt/startup.sh

RUN sed -i 's/.//g' /opt/startup.sh

CMD ["/bin/bash", "/opt/startup.sh"]

AUSSETZEN 80 443

Hier erstellen wir eine laufende Benutzergruppe und Benutzer-WWW-Daten zur einfachen Konfiguration und Steuerung. Dieser Name wird in der Nginx-Konfiguration verwendet.

nginx.conf

Benutzer-WWW-Daten;
Arbeitsprozesse 4;
pid /run/nginx.pid;
Daemon aus;

Ereignisse {
 Arbeiterverbindungen 2048;
 multi_accept ein;
 verwenden Sie epoll;
}

http {
 Server-Tokens aus;
 sendfile an;
 tcp_nopush ein;
 tcp_nodelay ein;
 KeepAlive-Timeout 15;
 Typen_Hash_max_Größe 2048;
 Maximale Client-Körpergröße: 20 M;
 /etc/nginx/mime.types einschließen;
 Standardtyp Anwendung/Oktett-Stream;
 Zugriffsprotokoll /dev/stdout;
 Fehlerprotokoll /dev/stderr;

 gzip an;
 gzip_disable "msie6";

 SSL-Protokolle TLSv1 TLSv1.1 TLSv1.2;
 SSL_CIPHERS 'ECDHE-ECDSA-CHACHA20-POLY1305: ECDHE-RSA-CHACHA20-Poly1305: ECDHE-ECDSA-AES128-GCM-SHA256: ECDHE-RSA-AES128-GCM-SHA256: ECDHE-ECDS256-RSA-AES256-GCM-SHA384: ECDHE-ECDS256-GCM-SHA384: ECDHE-ECDS256-GCM-SHA384: ECDHE-ECDS256: 384. ECDHE-ECDSA-AES256-SHA384: ECDHE-ECDSA-AES256-SHA: ECDHE-RSA-AES256-SHA: DHE-RSA-AES128-SHA256 -RSA-DES-CBC3-SHA: EDH-RSA-DES-CBC3-SHA: AES128-GCM-SHA256: AES256-GCM-SHA384: AES128-SHA256: AES256-SHA256: AES128-SHA: AES256-SHA: DES-CBC3-SHA:! DSS ';

 schließen Sie /etc/nginx/conf.d/*.conf ein;
 Fügen Sie /etc/nginx/sites-available/*.conf ein.

 open_file_cache off; # Deaktiviert für Problem 619
 Zeichensatz UTF-8;
}

Kopieren Sie einfach den Standardinhalt von nginx. Was geändert werden muss, ist der aktuelle Benutzername. Beachten Sie, dass der Benutzername mit der vorherigen Einstellung übereinstimmen muss.

start-up.sh

#!/bin/bash

# Crond im Hintergrund starten
crond -l 2 -b

# Starten Sie nginx im Vordergrund
nginx

Dies wird zum Starten des Nginx-Programms verwendet. Der Inhalt ist derzeit relativ klein, hauptsächlich um zukünftige Erweiterungen zu vereinfachen.

Starten Sie den Proxy-Dienstcontainer

docker-compose up -d nginx

Überprüfen Sie mit docker-compose ps, ob der Start normal ist. Wenn nicht, prüfen Sie, ob in der Konfiguration Fehler vorliegen.

Das war’s, lassen Sie es vorerst so und erstellen Sie eine Anwendung.

3. Anwendung hinzufügen

Fügen Sie eine Site hinzu: https://baipiaoquan.com/.

Konfigurieren des Anwendungscontainers

Verwenden Sie zum Erstellen der Anwendung auch Docker-Compose.

Dies ist ein PHP-Projekt, daher erfordert diese Anwendung mindestens zwei Servicecontainer, nginx und php-fpm. Die Projektverzeichnisstruktur ist wie folgt:

baipiaoquan/
├── docker-compose.yml
├── Protokoll
│ └── nginx
│ └── Fehler.log
├── nginx
│ ├── Docker-Datei
│ ├── Protokoll
│ ├── nginx.conf
│ ├── Seiten
│ │ └── baipiaoquan.com.conf
│ ├── SSL
│ │ ├── baipiaoquan.com.key
│ │ ├── baipiaoquan.com.pem
│ └── startup.sh
└── php-fpm
  ├── Docker-Datei
  └── php.ini

docker-compose.yml

Version: '3'

Netzwerke:
 Proxy:
  extern:
    Name: ${PROXY_NETWORK_NAME}
 Backend:
  Treiber: ${NETWORKS_DRIVER}

Leistungen:
 php-fpm:
   bauen:
    Kontext: ./php-fpm
   Bände:
    - ./php-fpm/php.ini:/usr/local/etc/php/php.ini
    - ${APP_CODE_PATH_HOST}:${APP_CODE_PATH_CONTAINER}${APP_CODE_CONTAINER_FLAG}
   Netzwerke:
    - Backend

 nginx:
   bauen:
    Kontext: ./nginx
    Argumente:
     – PHP_UPSTREAM_CONTAINER=${NGINX_PHP_UPSTREAM_CONTAINER}
     – PHP_UPSTREAM_PORT=${NGINX_PHP_UPSTREAM_PORT}
   Bände:
    - ${APP_CODE_PATH_HOST}:${APP_CODE_PATH_CONTAINER}${APP_CODE_CONTAINER_FLAG}
    - ./log:/var/log/nginx
    - ./sites:/etc/nginx/sites-available
    - ./ssl:/etc/nginx/ssl
   Containername: ${COMPOSE_PROJECT_NAME}_nginx
   hängt ab von:
    -php-fpm
   Netzwerke:
    - Proxy
    - Backend

Um die Anpassung zu erleichtern, werden hier Umgebungsvariablen verwendet.

Beachten Sie den Nginx-Containernamen container_name: ${COMPOSE_PROJECT_NAME}_nginx. Dieser Wert ist kritisch und wird in nachfolgenden Proxys verwendet.

.env

# Speicherort des Codes im Host APP_CODE_PATH_HOST=../

# Speicherort des Codes im Container APP_CODE_PATH_CONTAINER=/var/www

# Dies wurde von Laradock kopiert
APP_CODE_CONTAINER_FLAG=:zwischengespeichert

# Wählen Sie den Speicherpfad auf dem Computer. Gilt für alle Speichersysteme DATA_PATH_HOST=~/.baipiaoquan/data

### Treiber ######################################################

# Treiber für alle Volumes 
VOLUMES_DRIVER=lokal 

# Netzwerktreiber NETWORKS_DRIVER=bridge 

#Proxy-Netzwerkname, dies ist das zuvor erstellte PROXY_NETWORK_NAME=Proxy-Netzwerk

### Docker-Compose-Dateien #######################################
# 
COMPOSE_FILE=docker-compose.yml

# Ändern Sie unter Windows das Trennzeichen von : in ;
COMPOSE_PATH_SEPARATOR=:

# Projektname COMPOSE_PROJECT_NAME=baipiaoquan

Der verwendete Proxy-Netzwerkname lautet: Proxy-Netzwerk, das zuvor erstellt wurde;
Der Containername von nginx lautet: baipiaoquan_nginx.

Dockerfile für nginx

Diese Datei kann direkt aus der vorherigen übernommen und anschließend mit den relevanten Informationen zu PHP ergänzt werden.

VON nginx:alpine

KOPIEREN Sie nginx.conf /etc/nginx/

APK-Update ausführen
  && APK-Upgrade
  && apk --update logrotate hinzufügen
  && apk add --no-cache openssl
  && apk hinzufügen --no-cache bash

AUSFÜHREN set -x;
  addgroup -g 82 -S www-Daten;
  adduser -u 82 -D -S -G www-Daten www-Daten && exit 0 ; exit 1

ARG PHP_UPSTREAM_CONTAINER=php-fpm
ARG PHP_UPSTREAM_PORT=9000

# Upstream-Konfiguration festlegen und die Standardkonfiguration entfernen
RUN echo "upstream php-upstream { server ${PHP_UPSTREAM_CONTAINER}:${PHP_UPSTREAM_PORT}; }" > /etc/nginx/conf.d/upstream.conf
  && rm /etc/nginx/conf.d/default.conf

HINZUFÜGEN ./startup.sh /opt/startup.sh
RUN sed -i 's/.//g' /opt/startup.sh

CMD ["/bin/bash", "/opt/startup.sh"]

AUSSETZEN 80 443

Dockerfile für php-fpm

VON php:7.3-fpm

ARG-PUID=1000

ENV-PUID ${PUID}

ARG PGID=1000

ENV-PGID ${PGID}

RUN groupmod -o -g ${PGID} www-data &&
  usermod -o -u ${PUID} -g www-Daten www-Daten

EXPOSE 9000

ARBEITSVERZEICHNIS /var/www

CMD ["php-fpm"]

Vergessen Sie nicht die Datei php.ini. Sie können auch die Standarddatei verwenden. Anschließend müssen Sie die zugehörige Konfiguration löschen.

Konfiguration des Dienstes baipiaoquan.com.conf

Server {

  hören Sie 80 Standardserver;

  # Für https
  hören Sie 443 SSL-Standardserver;
  SSL-Zertifikat /etc/nginx/ssl/3243258_baipiaoquan.com.pem;
  SSL-Zertifikatsschlüssel /etc/nginx/ssl/3243258_baipiaoquan.com.key;
  SSL-Sitzungszeitüberschreitung 5 Min.
  SSL-Protokolle TLSv1 TLSv1.1 TLSv1.2;
  ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HOCH:!aNULL:!MD5:!RC4:!DHE; 
  ssl_prefer_server_ciphers ein;

  add_header X-Frame-Optionen "SAMEORIGIN";
  add_header X-XSS-Schutz "1; Modus=blockieren";
  add_header X-Inhaltstyp-Optionen "nosniff";

  # localhost muss Servername localhost baipiaoquan.com www.baipiaoquan.com sein;
  root /var/www/; # Dies entspricht der vorherigen Konfiguration index index.php index.html index.htm;

  Standort / {
     try_files $uri $uri/ /index.php$ist_args$args;
  }

  Standort ~ .php$ {
    versuche_dateien $uri /index.php =404;
    fastcgi_pass php-upstream; # Dies ist der im nginx Dockerfile konfigurierte fastcgi_index index.php;
    fastcgi_buffers 16 16k;
    fastcgi_buffer_size 32k;
    fastcgi_param SCRIPT_FILENAME $Dokumentstammsatz$fastcgi_script_name;
    #behebt Timeouts
    fastcgi_read_timeout 600;
    fastcgi_params einschließen;
  }

  Standort ~ /.ht {
    alles leugnen;
  }

  Standort /.well-known/acme-challenge/ {
    Wurzel /var/www/letsencrypt/;
    log_not_found aus;
  }
}

Ich habe hier alles konfiguriert, aber es kann vereinfacht werden und Sie müssen nur das konfigurieren, was Sie benötigen.

Starten Sie die Anwendung

An diesem Punkt können Sie den Dienst baipiaoquan.com starten. Führen Sie ihn im Verzeichnis baipiaoquan aus:

docker-compose up -d nginx

Wenn alles gut geht, sollte die App starten und Dienste empfangen können. Sie können es auch testen, indem Sie den Container eingeben und auf localhost zugreifen, um zu sehen, ob das Ergebnis Ihren Wünschen entspricht. Ich habe es folgendermaßen getestet:

Docker-Compose-Exec Nginx Wget Localhost

Sehen Sie sich dann die Größe der zurückgegebenen Daten an und bestimmen Sie je nach Situation, ob es erfolgreich ist.
Mit dem folgenden Befehl können Sie überprüfen, ob die Anwendung erfolgreich mit dem Proxy-Netzwerk verbunden ist:

Docker-Netzwerk prüfen Proxy-Netzwerk

Der nächste Schritt besteht darin, diese Anwendung Menschen auf der ganzen Welt zugänglich zu machen.

Proxy-Konfiguration zu nginx-proxy hinzufügen

Hinweis: Starten Sie zuerst die Anwendung und dann den Proxy. Andernfalls meldet nginx einen Fehler, dass der Upstream nicht gefunden werden kann.

Speicherort: proxy-nginx/sites/baipiaoquan.com.conf. Kopiere einfach die obige Konfiguration und ändere ein paar Stellen. Die endgültige Konfiguration sieht dann so aus:

# Meine Konfiguration unterstützt nur https. Wenn keine Anforderung besteht, ist kein Server erforderlich {
  hören Sie 80;
  Servername baipiaoquan.com www.baipiaoquan.com;
  gibt 301 https://$host$request_uri zurück; 
}

Server {

  # Wenn es http ist, konfigurieren Sie dies. # listen 80 default_server;

  # Wenn es https ist, konfigurieren Sie dies: listen 443 ssl;
  SSL-Zertifikat /etc/nginx/ssl/3243258_baipiaoquan.com.pem;
  SSL-Zertifikatsschlüssel /etc/nginx/ssl/3243258_baipiaoquan.com.key;
  SSL-Sitzungszeitüberschreitung 5 Min.
  SSL-Protokolle TLSv1 TLSv1.1 TLSv1.2;
  ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HOCH:!NULL:!aNULL:!MD5:!ADH:!RC4;
  ssl_prefer_server_ciphers ein;

  Servername baipiaoquan.com www.baipiaoquan.com;

  add_header X-Frame-Optionen "SAMEORIGIN";
  add_header X-XSS-Schutz "1; Modus=blockieren";
  add_header X-Inhaltstyp-Optionen "nosniff";

  Standort / {
    Proxy_Set_Header Host $host;
    Proxy_Set_Header X-Real-IP $Remote_Addr;
    proxy_set_header X-Weitergeleitet-Für $proxy_add_x_forwarded_for;
    Proxy_set_header X-Weitergeleitet-Proto $scheme;
    Proxy_set_header X-Weitergeleiteter Host $host;
    proxy_set_header X-Weiterleitungsport $server_port;
    proxy_pass http://baipiaoquan_nginx/; # Dieser Wert ist der Containername der Anwendung nginx}
}

Laden Sie die Proxyserverkonfiguration neu und führen Sie im Verzeichnis nginx-proxy Folgendes aus:

# Testen Sie zuerst die Konfigurationsdatei. Dieser Schritt muss erfolgreich ausgeführt werden. docker-compose exec nginx nginx -t

# Wenn die Eingabeaufforderung erfolgreich ist, laden Sie neu. Andernfalls überprüfen und ändern Sie die Konfigurationsdatei wie aufgefordert docker-compose exec nginx nginx -s reload

Warten Sie einen Moment. Wenn alles gut geht, sollten jetzt Menschen auf der ganzen Welt auf diese Website https://baipiaoquan.com/ zugreifen können.

Wenn Sie weitere Anwendungen hinzufügen müssen, sind Logik und Prozess identisch. Ich habe beispielsweise eine weitere Anwendung hinzugefügt: https://chaohuahui.com/, und ich kann sie anpingen und sie haben dieselbe IP.

Das Obige ist der vollständige Inhalt dieses Artikels. Ich hoffe, er wird für jedermanns Studium hilfreich sein. Ich hoffe auch, dass jeder 123WORDPRESS.COM unterstützen wird.

Das könnte Sie auch interessieren:
  • Analyse des Prozesses der einfachen Bereitstellung von Nginx im Docker-Container
  • Detaillierte Erläuterung des Startens und Einhängens des Docker-Nginx-Containers in den lokalen
  • Methoden und Schritte zum Erstellen eines Docker-basierten Nginx-Dateiservers
  • So erstellen Sie einen Nginx-Image-Server mit Docker
  • Implementierung der Docker-Bereitstellung von Django+Mysql+Redis+Gunicorn+Nginx
  • Beispiel für die Implementierung eines Master-Slave-Hot-Standby mit Docker+keepalived+nginx
  • So stellen Sie nginx mit Docker bereit und ändern die Konfigurationsdatei
  • So verwenden Sie Docker Compose zum Implementieren des Nginx-Lastausgleichs
  • So erstellen Sie eine PHP+Nginx+Swoole+MySQL+Redis-Umgebung mit Docker
  • Verwenden Sie Dockercompose, um eine Springboot-MySQL-Nginx-Anwendung zu erstellen
  • Erfahren Sie, wie Sie ein Vue-Projekt mit Docker bereitstellen
  • Vue-CLI3-Projekt von der Konstruktionsoptimierung bis zur Docker-Bereitstellungsmethode
  • So stellen Sie ein Vue-Projekt mit Docker-Image + nginx bereit

<<:  Ein kurzes Verständnis der drei Verwendungen von Standard-SQL-Update-Anweisungen

>>:  Verwenden von JavaScript-Unterschieden zum Implementieren eines Vergleichstools

Artikel empfehlen

Zwei Möglichkeiten zum Konfigurieren globaler Vue-Methoden

Inhaltsverzeichnis 1. Einleitung 2. Die erste Met...

Join-Operation in MySQL

Arten von Verknüpfungen 1. Innerer Join: Die Feld...

Chinesische Lösung und Beispielcode für die MySQL-Volltextsuche

MySQL-Volltextsuche, chinesische Lösung Kürzlich ...

Html+CSS-Zeichnungsdreiecksymbol

Schauen wir uns zunächst die Renderings an: XML/H...

Beispielcode zur Implementierung eines Foto-Stacking-Effekts mit CSS

Ergebnisse erzielen Schritt 1. Ursprüngliche inde...

Mehrere Möglichkeiten zur Implementierung der Vererbung in JavaScript

Inhaltsverzeichnis Strukturelle Vererbung (implem...

So entwerfen Sie MySQL-Statistikdatentabellen

Inhaltsverzeichnis Ist eine Echtzeitaktualisierun...

Vue verwendet Echart, um Beschriftungen und Farben anzupassen

In diesem Artikelbeispiel wird der spezifische Co...

Häufige Probleme und Lösungen beim Erstellen von MySQL MGR

Inhaltsverzeichnis 01 Häufige Fehler 1 02 Häufige...

Stil-Trigger-Effekt des Webseiten-Eingabefelds

<br />Dieses Beispiel untersucht hauptsächli...

Schritte zur Installation von MySQL 8.0.23 unter Centos7 (Anfängerstufe)

Lassen Sie mich zunächst kurz erklären, was MySQL...