GNU/Linux >> Tutoriels Linux >  >> Panels >> Docker

Créez un proxy inverse NGINX dans Docker et apprenez 1 nouvelle compétence !

Avez-vous besoin de serveurs Web puissants pour gérer les requêtes adressées à votre application Docker ? L'utilisation d'un proxy inverse NGINX dans Docker vous permet de gérer et de gérer les demandes d'applications Web vers et depuis une application conteneurisée de différentes manières.

Dans cet article, vous apprendrez à créer un proxy inverse NGINX dans Docker et à configurer le conteneur pour inverser les demandes de proxy vers et depuis un autre conteneur. Lisez la suite pour en savoir plus !

Prérequis

Pour suivre ce didacticiel, assurez-vous que vous disposez des éléments suivants :

  • Docker Desktop – Ce didacticiel utilise la version 3.5.2.
  • Windows 10 :le didacticiel utilise Windows pour exécuter Docker, mais les mêmes étapes générales peuvent également être appliquées à Linux ou macOS.
  • Le moteur Docker si vous utilisez Linux.

Tous les exemples de ce didacticiel utiliseront une distribution Linux minimale appelée Alpine Linux, exécutant la dernière version NGINX disponible. Au moment d'écrire ces lignes, la v1.21.1 est la dernière version.

Création d'un proxy inverse PHP-FPM NGINX dans Docker

L'un des langages de programmation les plus populaires, PHP est souvent un cas d'utilisation pour un proxy inverse. PHP-FPM ou Fast CGI Process Manager est un excellent produit à utiliser pour le trafic proxy dans le monde PHP. En utilisant PHP-FPM dans un conteneur Docker et NGINX dans un autre, vous pouvez configurer PHP-FPM pour écouter et répondre aux requêtes sur un port réseau, aidant ainsi à mettre en réseau deux conteneurs ensemble.

Bonus ! Ce didacticiel fournira également des exemples d'utilisation de NodeJS en tant que proxy inverse. Soyez à l'affût des appels NodeJS.

Configurons maintenant à la fois un conteneur NGINX et un conteneur PHP-FPM Docker pour voir comment ils fonctionnent ensemble en transmettant par proxy les requêtes du navigateur via NGINX au backend PHP-FPM et inversement.

1. Tout d'abord, créez un répertoire pour contenir vos fichiers de configuration. Ce répertoire contiendra tous les fichiers de configuration nécessaires pour provisionner les deux conteneurs. Dans cet exemple, le répertoire C:\Articles\NGINX-PHP est utilisé.

2. Ensuite, créez le Dockerfile avec le contenu suivant. Le Dockerfile ci-dessous indiquera au moteur Docker de télécharger le nginx:mainline-alpine image du référentiel Docker Hub et copiera le fichier de configuration NGINX que vous allez créer dans l'image pour fournir une configuration NGINX personnalisée.

# 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

Récupérez le NodeJS Dockerfile pour configurer l'image NodeJS Docker dans le référentiel Github des scripts ATA !

3. Ensuite, créez le fichier docker-compose.yml fichier contenant les éléments suivants. Ce fichier Docker Compose indiquera à Docker de créer deux conteneurs, web et php exécutant NGINX et PHP-FM, respectivement.

# 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

Récupérez le fichier NodeJS Docker Compose pour configurer l'image NodeJS Docker dans le référentiel Github des scripts ATA !

4. Créez le fichier de configuration NGINX, default.conf , avec ce qui suit. Le fichier ci-dessous définit une courte configuration NGINX qui crée un écouteur de site et envoie des demandes de contenu au conteneur PHP.

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;
    }
}

Récupérez le fichier de configuration NodeJS NGINX pour configurer le NodeJS dans NGINX dans le référentiel Github des scripts ATA !

5. Ouvrez une session de terminal et accédez au C:\Articles\NGINX-PHP répertoire.

6. Exécutez la commande, docker-compose up pour générer et démarrer votre service personnalisé. Cette action fera apparaître les deux conteneurs.

7. Ensuite, créez un fichier PHP appelé index.php dans C:\Articles\NGINX-Content et collez le contenu suivant. Ce fichier sera utilisé pour tester que NGINX peut servir et traiter des fichiers via PHP. Le phpinfo() La commande affichera la page d'informations PHP pour vérifier que le conteneur fonctionne.

<?php phpinfo(); ?>

Au lieu d'un fichier PHP, téléchargez le fichier index.js dans le référentiel Github des scripts ATA !

8. Enfin, ouvrez un navigateur Web et accédez à http://localhost/index.php pour vérifier que NGINX sert le fichier PHP comme prévu. Dans l'exemple ci-dessous, PHP renvoie la version 8.0.8, mais votre version peut varier.

Proxy NodeJS et PHP-FPM depuis NGINX

Maintenant que vous avez mandaté PHP et NodeJS individuellement, comment procéderiez-vous pour mandater les deux backends simultanément ? Peut-être avez-vous une application complexe composée à la fois de composants NodeJS et PHP. Pour que cela fonctionne, vous devrez étendre votre fichier Docker Compose pour inclure les deux backends.

1. Tout d'abord, créez un répertoire pour contenir vos fichiers de configuration. Dans cet exemple, le répertoire C:\Articles\NGINX-Both est utilisé.

2. Créez le Dockerfile et collez en utilisant le contenu suivant. Jusqu'à présent, il n'y a pas beaucoup de différence par rapport à la construction individuelle de PHP-FPM ou d'un conteneur NodeJS.

# 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. Ensuite, créez le fichier docker-compose.yml fichier contenant les éléments suivants. Vous verrez maintenant qu'un autre conteneur a été introduit appelé node .

# 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. Ensuite, créez le fichier de configuration NGINX, default.conf , avec ce qui suit. Remarquez le proxy_pass doubler. Cette ligne transmettra la requête au node héberger.

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. Ouvrez un terminal et accédez au C:\Articles\NGINX-Both répertoire.

6. Exécutez la commande, docker-compose up pour générer et démarrer votre service personnalisé comme avant.

Ensuite, créez le fichier index.js dans le C:\Articles\NGINX-Content répertoire et le fichier index.php dans ce même répertoire, s'il n'existe pas déjà, pour tester NGINX proxying les deux backends.

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. Enfin, ouvrez un navigateur Web et accédez à http://localhost/index.js et http://localhost/index.php. Vous devriez maintenant voir que les deux sont accessibles, comme indiqué ci-dessous.

Conclusion

Maintenant que vous avez réussi à proxyer à la fois un conteneur PHP-FPM et un conteneur NodeJS, même en même temps, pourquoi ne pas essayer d'équilibrer la charge de plusieurs conteneurs NGINX ?

L'utilisation d'un proxy inverse NGINX dans Docker ouvre un monde de possibilités pour segmenter correctement les applications et le trafic entre les conteneurs !


Docker
  1. Proxy inverse avec Nginx :un guide de configuration étape par étape

  2. Comment configurer Nginx en tant que proxy inverse sur Ubuntu 20.04

  3. Comment créer un Docker Swarm Manager et des nœuds sur Linode

  4. Installer et configurer eXo Platform avec Nginx en reverse proxy sur un VPS Debian 8

  5. Comment créer une image Docker à partir d'un conteneur et d'un Dockerfile

Comment installer et utiliser Nginx Proxy Manager avec Docker

Docker - Comment configurer Jupyter derrière le proxy Nginx

Comment configurer le proxy inverse Nginx

Provisionnez NGINX sur Docker et augmentez les capacités du serveur

Utiliser Ngnix pour proxy Docker Containers sur Ubuntu

Utilisation de Docker pour configurer le proxy inverse Nginx avec la génération SSL automatique