GNU/Linux >> LINUX-Kenntnisse >  >> Panels >> Docker

Erstellen Sie einen NGINX-Reverse-Proxy in Docker und lernen Sie 1 neue Fähigkeit!

Benötigen Sie leistungsstarke Webserver, um Anfragen an Ihre Docker-Anwendung zu verarbeiten? Die Verwendung eines NGINX-Reverse-Proxys in Docker gibt Ihnen die Möglichkeit, Webanwendungsanforderungen an und von einer containerisierten Anwendung auf verschiedene Weise zu verarbeiten und zu verwalten.

In diesem Artikel erfahren Sie, wie Sie einen NGINX-Reverse-Proxy in Docker erstellen und den Container so konfigurieren, dass er Proxy-Anfragen zu und von einem anderen Container umkehrt. Lesen Sie weiter, um mehr zu erfahren!

Voraussetzungen

Um diesem Tutorial zu folgen, stellen Sie sicher, dass Sie über Folgendes verfügen:

  • Docker Desktop – Dieses Tutorial verwendet Version 3.5.2.
  • Windows 10 – Das Tutorial verwendet Windows, um Docker auszuführen, aber die gleichen allgemeinen Schritte können auch auf Linux oder macOS angewendet werden.
  • Die Docker-Engine, wenn Sie Linux verwenden.

Alle Beispiele in diesem Tutorial verwenden eine minimale Linux-Distribution namens Alpine Linux, auf der die neueste verfügbare NGINX-Version ausgeführt wird. Zum jetzigen Zeitpunkt ist v1.21.1 die neueste Version.

Erstellen eines PHP-FPM-NGINX-Reverse-Proxys in Docker

Als eine der beliebtesten Programmiersprachen ist PHP oft ein Anwendungsfall für einen Reverse-Proxy. PHP-FPM oder Fast CGI Process Manager ist ein großartiges Produkt, das für das Proxying von Datenverkehr in der PHP-Welt verwendet werden kann. Wenn Sie PHP-FPM in einem Docker-Container und NGINX in einem anderen verwenden, können Sie PHP-FPM so einrichten, dass es Anfragen an einem Netzwerkport abhört und darauf antwortet, wodurch die Vernetzung zweier Container unterstützt wird.

Bonus! Dieses Tutorial enthält auch durchgehend Beispiele für die Verwendung von NodeJS als Reverse-Proxy. Halten Sie Ausschau nach den NodeJS-Callouts.

Lassen Sie uns nun sowohl einen NGINX-Container als auch einen PHP-FPM-Docker-Container einrichten, um zu sehen, wie sie zusammenarbeiten, indem sie Anfragen vom Browser über NGINX an das PHP-FPM-Backend und zurück weiterleiten.

1. Erstellen Sie zunächst ein Verzeichnis für Ihre Konfigurationsdateien. Dieses Verzeichnis enthält alle Konfigurationsdateien, die zum Bereitstellen beider Container erforderlich sind. In diesem Beispiel das Verzeichnis C:\Artikel\NGINX-PHP verwendet wird.

2. Als nächstes erstellen Sie das Dockerfile mit folgendem Inhalt. Die folgende Docker-Datei weist die Docker-Engine an, nginx:mainline-alpine herunterzuladen image aus dem Docker Hub-Repository und kopiert die NGINX-Konfigurationsdatei, die Sie erstellen werden, in das Image, um eine benutzerdefinierte NGINX-Konfiguration bereitzustellen.

# The image to pull the base configuration from
FROM nginx:mainline-alpine
# The directory where additional files will be referenced
WORKDIR C:\Articles\NGINX-PHP
# Copy the custom default.conf from the WORKDIR (.) and overwrite the existing internal configuration in the NGINX container
COPY ./default.conf /etc/nginx/conf.d/default.conf

Besorgen Sie sich die NodeJS-Dockerdatei, um das NodeJS-Docker-Image im Github-Repository für ATA-Skripts einzurichten!

3. Als nächstes erstellen Sie die Datei docker-compose.yml Datei, die Folgendes enthält. Diese Docker Compose-Datei weist Docker an, zwei Container zu erstellen, web und php mit NGINX bzw. PHP-FM.

# The specification version of docker-compose
version: "3.9"
# The collection of applications composing this service
services:
  # The NGINX custom container, and the name, web, will function as the host name of the container
  web:
    # Instead of referencing image: nginx:mainline-alpine here, use build to
    # reference the current directory (.), which will look for a dockerfile
    # by default. In this tutorial, this is C:\Articles\NGINX-PHP
    build: .
    # The external directory location to map to an internal location
    volumes:
      - C:\Articles\NGINX-Content:/usr/share/nginx/html
    # The external port mapping to internal port mapping
    ports:
      - "80:80"
  # The name, php, will also function as the host name of the container
  php:
    image: php:fpm-alpine
    ports:
      - "9000:9000"
    # It is important that both containers can reference the same files
    volumes:
      - C:\Articles\NGINX-Content:/usr/share/nginx/html

Besorgen Sie sich die NodeJS-Docker-Compose-Datei, um das NodeJS-Docker-Image im Github-Repository für ATA-Skripts einzurichten!

4. Erstellen Sie die NGINX-Konfigurationsdatei default.conf , mit den folgenden. Die folgende Datei definiert eine kurze NGINX-Konfiguration, die einen Site-Listener erstellt und Inhaltsanfragen an den PHP-Container sendet.

server {
    # The port to listen on
    listen 80;
    # The root directory, which must exactly match the internal volume share
    root /usr/share/nginx/html;

    # For all files with the PHP extension run the following
    location ~ ^/.+\.php(/|$) {
        # Pass the request to the host "php" and port 9000 (default PHP-FPM port).
        # The "php" host name is generated from the application name in the
        # Docker Compose file that was previously defined.
        fastcgi_pass  php:9000;
				# Include the default NGINX FastCGI Parameters
        include       fastcgi_params;
				# Define one additional parameter telling PHP-FPM where to find the file
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }
}

Besorgen Sie sich die NGINX-Konfigurationsdatei von NodeJS, um NodeJS in NGINX im Github-Repository für ATA-Skripts einzurichten!

5. Öffnen Sie eine Terminalsitzung und navigieren Sie zu C:\Articles\NGINX-PHP Verzeichnis.

6. Führen Sie den Befehl docker-compose up aus um Ihren benutzerdefinierten Dienst zu generieren und zu starten. Durch diese Aktion werden beide Container aufgerufen.

7. Als nächstes erstellen Sie eine PHP-Datei namens index.php in C:\Artikel\NGINX-Content und fügen Sie den folgenden Inhalt ein. Diese Datei wird verwendet, um zu testen, ob NGINX Dateien über PHP bereitstellen und verarbeiten kann. Die phpinfo() Der Befehl gibt die PHP-Informationsseite aus, um zu überprüfen, ob der Container funktioniert.

<?php phpinfo(); ?>

Laden Sie statt einer PHP-Datei die index.js-Datei aus dem Github-Repository für ATA-Skripts herunter!

8. Öffnen Sie schließlich einen Webbrowser und navigieren Sie zu http://localhost/index.php, um zu überprüfen, ob NGINX die PHP-Datei wie erwartet bereitstellt. Im folgenden Beispiel gibt PHP Version 8.0.8 zurück, aber Ihre Version kann davon abweichen.

Proxy von NodeJS und PHP-FPM von NGINX

Nun, da Sie sowohl PHP als auch NodeJS einzeln geproxyt haben, wie würden Sie vorgehen, um beide Backends gleichzeitig zu proxieren? Vielleicht haben Sie eine komplexe Anwendung, die sowohl aus NodeJS- als auch aus PHP-Komponenten besteht. Damit dies funktioniert, müssen Sie Ihre Docker Compose-Datei erweitern, um beide Backends einzuschließen.

1. Erstellen Sie zunächst ein Verzeichnis für Ihre Konfigurationsdateien. In diesem Beispiel das Verzeichnis C:\Artikel\NGINX-Both verwendet wird.

2. Erstellen Sie das Dockerfile und fügen Sie die folgenden Inhalte ein. Bisher kein großer Unterschied zum individuellen Bau von PHP-FPM oder eines NodeJS-Containers.

# The image to pull the base configuration from
FROM nginx:mainline-alpine
# The directory where any additional files will be referenced
WORKDIR C:\Articles\NGINX-Both
# Copy the custom default.conf and overwrite the existing internal configuration
COPY ./default.conf /etc/nginx/conf.d/default.conf

3. Als nächstes erstellen Sie die Datei docker-compose.yml Datei, die Folgendes enthält. Sie werden nun sehen, dass ein weiterer Container namens node eingeführt wurde .

# The specification version of docker-compose
version: "3.9"
# The collection of containers making up your application
services:
  # The NGINX custom container
  web:
    # Instead of referencing image: nginx:mainline-alpine here, use build to
    # reference the current directory (.) and will look for a dockerfile by default
    build: .
    # The external directory location to map to an internal location
    volumes:
      - C:\Articles\NGINX-Content:/usr/share/nginx/html
    # The external port mapping to internal port mapping
    ports:
      - "80:80"
  node:
    image: node:current-alpine
    # Override the existing entrypoint to tell Node to execute the index.js file
    entrypoint: ['node','/usr/share/nginx/html/index.js']
    ports:
      - "3000:3000"
    # It is important that all containers can reference the same files
    volumes:
      - C:\Articles\NGINX-Content:/usr/share/nginx/html
  php:
    image: php:fpm-alpine
    ports:
      - "9000:9000"
    volumes:
      - C:\Articles\NGINX-Content:/usr/share/nginx/html

4. Erstellen Sie als Nächstes die NGINX-Konfigurationsdatei default.conf , mit den folgenden. Beachten Sie den proxy_pass Linie. Diese Zeile leitet die Anfrage an den node weiter Gastgeber.

server {
    # The port to listen on
    listen 80;
    # The root directory should exactly match the internal volume share
    root /usr/share/nginx/html;

    # For all files with the PHP extension run the following to route to PHP-FPM
    location ~ ^/.+\.php(/|$) {
        # Pass the request to the host "php" and port 9000 (default PHP-FPM port)
        fastcgi_pass  php:9000;
		# Include the default NGINX FastCGI Parameters
        include       fastcgi_params;
		# Define one additional parameter telling PHP-FPM where to find the file
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }

    # For all files with the JS extension run the following to route to NodeJS
    location ~ ^/.+\.js(/|$) {
        # Pass the request to the host "node" and port 3000 (default NodeJS port)
        proxy_pass  http://node:3000;
    }
}

5. Öffnen Sie ein Terminal und navigieren Sie zu C:\Articles\NGINX-Both Verzeichnis.

6. Führen Sie den Befehl docker-compose up aus um Ihren benutzerdefinierten Dienst wie zuvor zu generieren und zu starten.

Als nächstes erstellen Sie die Datei index.js im C:\Artikel\NGINX-Content Verzeichnis und die Datei index.php in demselben Verzeichnis, falls es noch nicht existiert, um NGINX-Proxy für beide Backends zu testen.

index.js

// Assign the HTTP server object, built-in to NodeJS
var http = require('http');

// Create the server, on port 3000, and output the text content "Hello World!"
http.createServer(function (req, res) {
    res.write('Hello World!');
    res.end();
}).listen(3000, function(){
    console.log("server start at port 3000");
});

index.php

<?php phpinfo(); ?>

8. Öffnen Sie schließlich einen Webbrowser und navigieren Sie zu http://localhost/index.js und http://localhost/index.php. Sie sollten nun sehen, dass beide zugänglich sind, wie unten gezeigt.

Fazit

Nun, da Sie sowohl einen PHP-FPM-Container als auch einen NodeJS-Container erfolgreich geproxyt haben, sogar gleichzeitig, warum versuchen Sie nicht, mehrere NGINX-Container zu laden?

Die Verwendung eines NGINX-Reverse-Proxys in Docker eröffnet eine Welt voller Möglichkeiten für die ordnungsgemäße Segmentierung von Anwendungen und Datenverkehr zwischen Containern!


Docker
  1. Einrichten des Nginx Reverse Proxy-Servers unter Debian Linux

  2. So richten Sie einen Nginx-Reverse-Proxy ein

  3. So richten Sie Nginx als Reverse Proxy unter Ubuntu 20.04 ein

  4. So erstellen Sie einen Docker Swarm Manager und Nodes auf Linode

  5. Erstellen, markieren und laden Sie Ihr eigenes Docker-Image hoch

So installieren und verwenden Sie Nginx Proxy Manager mit Docker

Docker – So richten Sie Jupyter hinter dem Nginx-Proxy ein

So richten Sie Nginx Reverse Proxy ein

Stellen Sie NGINX auf Docker bereit und erhöhen Sie die Serverkapazitäten

Verwenden Sie Ngnix als Proxy für Docker-Container unter Ubuntu

Verwenden von Docker zum Einrichten von Nginx Reverse Proxy mit automatischer SSL-Generierung