Maison développement back-end tutoriel php Comment personnaliser une seule image Nginx pour plusieurs conteneurs PHP-FPM

Comment personnaliser une seule image Nginx pour plusieurs conteneurs PHP-FPM

Jul 09, 2018 am 09:28 AM

Cet article présente principalement la méthode de personnalisation d'une seule image Nginx pour plusieurs conteneurs PHP-FPM. Il a une certaine valeur de référence. Maintenant, je le partage avec vous. Les amis dans le besoin peuvent s'y référer

Récemment, je le partage. J'ai travaillé sur le déploiement d'un ensemble de microservices PHP à l'aide de conteneurs Docker. L'un des problèmes est que notre application PHP est configurée pour fonctionner avec PHP-FPM et Nginx (plutôt qu'une simple configuration Apache/PHP[1] comme indiqué ici), donc deux conteneurs sont requis par microservice PHP (également équivalent à deux Images Docker) :

  • Conteneur PHP-FPM

  • Conteneur Nginx

En supposant qu'une application s'exécute plus de six microservices PHP, y compris vos environnements de développement et de production, il y aura à terme près de 30 conteneurs. Au lieu de créer une image Nginx unique pour chaque image de microservice PHP-FPM, j'ai décidé de créer une image Docker Nginx distincte et de mapper le nom d'hôte PHP-FPM en tant que variable d'environnement sur un fichier de configuration unique dans cette image.

Comment personnaliser une seule image Nginx pour plusieurs conteneurs PHP-FPM


Dans cet article de blog, je décrirai mon processus de la méthode 1 à la méthode 2 ci-dessus, en terminant par une introduction sur la façon d'utiliser la nouvelle image Docker Nginx personnalisée. . Solution pour terminer ce blog.
J'ai rendu cette image open source sur GitHub [2], donc si cela s'avère être un problème que vous rencontrez souvent, n'hésitez pas à la consulter.

Pourquoi Nginx ?

Comment personnaliser une seule image Nginx pour plusieurs conteneurs PHP-FPM

PHP-FPM et Nginx utilisés ensemble peuvent produire de meilleures performances d'application PHP [3], mais l'inconvénient est que l'image Docker PHP-FPM n'est pas par défaut celle de PHP Apache. image Fourni avec Nginx.
Si vous souhaitez connecter un conteneur Nginx à un backend PHP-FPM, vous devez ajouter les enregistrements DNS de ce backend à votre configuration Nginx.
Par exemple, si le conteneur PHP-FPM s'exécute en tant que conteneur nommé php-fpm-api, alors votre fichier de configuration Nginx devrait lire :

nginx
    location ~ \.php$ {
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        # This line passes requests through www.dongfan178.com to the PHP-FPM container
        fastcgi_pass php-fpm-api:9000;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param www.huayi1.cn/ www.dongfan178.com SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param www.00534.cn PATH_INFO $fastcgi_path_info;
    }
Copier après la connexion

Si vous ne servez qu'un seul PHP-FPM containers Application, il est possible de coder en dur le nom correspondant dans le fichier de configuration de votre conteneur Nginx. Cependant, comme je l'ai mentionné ci-dessus, chaque service PHP nécessite un conteneur Nginx correspondant, nous devons donc exécuter plusieurs conteneurs Nginx. Créer une nouvelle image Nginx (que nous devrons maintenir et mettre à niveau plus tard) sera pénible car même gérer un tas de volumes différents semble demander beaucoup de travail pour changer un seul nom de variable.

Première solution : Utiliser la méthode envsubst mentionnée dans la documentation Docker

Comment personnaliser une seule image Nginx pour plusieurs conteneurs PHP-FPM

Au début, je pensais que c'était facile. Il y a un petit chapitre sympa dans la documentation Docker sur la façon d'utiliser envsubst[4], mais malheureusement cela ne fonctionne pas avec mon fichier de configuration Nginx :
vhost.conf

nginx
server {
    listen 80;
    index index.php index.html;
    root /var/www/public;
    client_max_body_size 32M;
    location / {
        try_files $uri /index.php?$args;
    }
    location ~ \.php$ {
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass ${NGINX_HOST}:9000;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
    }
}
Copier après la connexion

moi Le vhost Le fichier .conf utilise plusieurs variables d'environnement intégrées à Nginx. Par conséquent, lorsque j'exécute la ligne de commande suivante mentionnée dans la documentation Docker, un message d'erreur apparaît : $uri et fastcgi_script_name ne sont pas définis.

shell
/bin/bash -c "envsubst < /etc/nginx/conf.d/mysite.template > /etc/nginx/conf.d/default.conf && nginx -g &#39;daemon off;&#39;"
Copier après la connexion

Ces variables sont généralement transmises par Nginx lui-même [5], il n'est donc pas facile de comprendre ce qu'elles sont et comment transmettre les paramètres, et cela affectera la configurabilité dynamique du conteneur

Une autre image Docker qui a presque réussi

Comment personnaliser une seule image Nginx pour plusieurs conteneurs PHP-FPM

Ensuite, j'ai commencé à rechercher différentes images de base Nginx. J'en ai trouvé deux, mais tous deux n'ont pas été mis à jour depuis deux ans. J'ai commencé avec martin/nginx[6] et j'ai essayé de voir si je pouvais obtenir un prototype fonctionnel.
L’image de Martin est un peu différente car elle nécessite une structure de répertoires de fichiers spécifique. J'ai d'abord ajouté au Dockerfile :

FROM martin/nginx
Copier après la connexion

Ensuite, j'ai ajouté le répertoire app/vide et le répertoire conf/ contenant uniquement un fichier vhost.conf.
vhost.conf

nginx
server {
    listen 80;
    index index.php index.html;
    root /var/www/public;
    client_max_body_size 32M;
    location / {
        try_files $uri /index.php?$args;
    }
    location ~ \.php$ {
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass $ENV{"NGINX_HOST"}:9000;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
    }
}
Copier après la connexion

Ceci est similaire à mon fichier de configuration d'origine, avec une seule ligne modifiée : fastcgi_pass $ENV{"NGINX_HOST"}:9000;. Désormais, lorsque je souhaite démarrer un conteneur Nginx et un conteneur PHP appelé php-fpm-api, je peux d'abord compiler une nouvelle image puis lui transmettre la variable d'environnement correspondante lors de son exécution :

shell
docker build -t shiphp/nginx-env:test .
docker run -it --rm -e NGINX_HOST=php-fpm-api shiphp/nginx-env:test
Copier après la connexion

Succès ! Cependant, il y a deux problèmes qui me dérangent avec cette méthode :

  1. La version de l'image de base est ancienne et n'a pas été mise à jour depuis plus de deux ans. Cela peut créer des risques en matière de sécurité et de performances.

  2. Exiger un répertoire vide pour l'application semble inutile, de plus mes fichiers sont dans des répertoires différents.

Solution finale

Comment personnaliser une seule image Nginx pour plusieurs conteneurs PHP-FPM

Je pense que le miroir de Martin est un bon choix pour une solution personnalisée. J'ai donc créé son référentiel et construit une nouvelle image de base Nginx qui a résolu les deux problèmes ci-dessus. Maintenant, si vous souhaitez exécuter une application backend nommée dynamiquement avec un conteneur nginx, faites simplement ceci :

shell
# Pull down the latest from Docker Hub
docker pull shiphp/nginx-env:latest
# Run a PHP container named "php-fpm-api"
docker run --name php-fpm-api -v $(pwd):/var/www php:fpm
# Start this NGinx container linked to the PHP-FPM container
docker run --link php-fpm-api -e NGINX_HOST=php-fpm-api shiphp/nginx-env
Copier après la connexion

如果你想自定义这个镜像,添加你自己的文件或者Nginx配置文件,只需要像下面这样扩展你的Dockerfile:

FROM shiphp/nginx-env
ONBUILD ADD <PATH_TO_YOUR_CONFIGS> /etc/nginx/conf.d/
Copier après la connexion

现在我所有的PHP-FPM容器都使用单个Nginx镜像的实例,当我需要升级Nginx、修改权限或者配置一些东西的时候,这让我的生活变得简单多了。

以上就是本文的全部内容,希望对大家的学习有所帮助,更多相关内容请关注PHP中文网!

相关推荐:

PHP缓存区ob的介绍

如何配置php客户端(phpredis)并连接Redis

使用PHPstudy在Windows服务器下部署PHP系统

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

Video Face Swap

Video Face Swap

Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Article chaud

<🎜>: Dead Rails - Comment apprivoiser les loups
4 Il y a quelques semaines By DDD
<🎜>: Grow A Garden - Guide de mutation complet
2 Il y a quelques semaines By DDD
Niveaux de force pour chaque ennemi et monstre de R.E.P.O.
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Sujets chauds

Tutoriel Java
1657
14
Tutoriel PHP
1257
29
Tutoriel C#
1230
24
Comment fonctionne le détournement de session et comment pouvez-vous l'atténuer en PHP? Comment fonctionne le détournement de session et comment pouvez-vous l'atténuer en PHP? Apr 06, 2025 am 12:02 AM

Le détournement de la session peut être réalisé via les étapes suivantes: 1. Obtenez l'ID de session, 2. Utilisez l'ID de session, 3. Gardez la session active. Les méthodes pour empêcher le détournement de la session en PHP incluent: 1. Utilisez la fonction Session_RegeReate_id () pour régénérer l'ID de session, 2. Stocker les données de session via la base de données, 3. Assurez-vous que toutes les données de session sont transmises via HTTPS.

Expliquez différents types d'erreur dans PHP (avis, avertissement, erreur mortelle, erreur d'analyse). Expliquez différents types d'erreur dans PHP (avis, avertissement, erreur mortelle, erreur d'analyse). Apr 08, 2025 am 12:03 AM

Il existe quatre principaux types d'erreur dans PHP: 1.Notice: Le moins, n'interrompra pas le programme, comme l'accès aux variables non définies; 2. AVERTISSEMENT: grave que d'avis, ne résiliera pas le programme, comme ne contenant aucun fichier; 3. FatalError: le plus grave, finira le programme, comme appeler aucune fonction; 4. PARSEERROR: ERREUR SYNTAXE, EVERA ENCORE LE PROGRAMME EST EXECULTÉ, comme oublier d'ajouter la balise de fin.

PHP et Python: comparaison de deux langages de programmation populaires PHP et Python: comparaison de deux langages de programmation populaires Apr 14, 2025 am 12:13 AM

PHP et Python ont chacun leurs propres avantages et choisissent en fonction des exigences du projet. 1.Php convient au développement Web, en particulier pour le développement rapide et la maintenance des sites Web. 2. Python convient à la science des données, à l'apprentissage automatique et à l'intelligence artificielle, avec syntaxe concise et adaptée aux débutants.

Quelles sont les méthodes de demande HTTP (obtenir, publier, mettre, supprimer, etc.) et quand chacune devrait être utilisée? Quelles sont les méthodes de demande HTTP (obtenir, publier, mettre, supprimer, etc.) et quand chacune devrait être utilisée? Apr 09, 2025 am 12:09 AM

Les méthodes de demande HTTP incluent GET, Publier, Put and Delete, qui sont utilisées pour obtenir, soumettre, mettre à jour et supprimer respectivement les ressources respectivement. 1. La méthode GET est utilisée pour obtenir des ressources et convient aux opérations de lecture. 2. La méthode post-post est utilisée pour soumettre des données et est souvent utilisée pour créer de nouvelles ressources. 3. La méthode de put est utilisée pour mettre à jour les ressources et convient aux mises à jour complètes. 4. La méthode de suppression est utilisée pour supprimer les ressources et convient aux opérations de suppression.

PHP: un langage clé pour le développement Web PHP: un langage clé pour le développement Web Apr 13, 2025 am 12:08 AM

PHP est un langage de script largement utilisé du côté du serveur, particulièrement adapté au développement Web. 1.Php peut intégrer HTML, traiter les demandes et réponses HTTP et prend en charge une variété de bases de données. 2.PHP est utilisé pour générer du contenu Web dynamique, des données de formulaire de traitement, des bases de données d'accès, etc., avec un support communautaire solide et des ressources open source. 3. PHP est une langue interprétée, et le processus d'exécution comprend l'analyse lexicale, l'analyse grammaticale, la compilation et l'exécution. 4.PHP peut être combiné avec MySQL pour les applications avancées telles que les systèmes d'enregistrement des utilisateurs. 5. Lors du débogage de PHP, vous pouvez utiliser des fonctions telles que error_reportting () et var_dump (). 6. Optimiser le code PHP pour utiliser les mécanismes de mise en cache, optimiser les requêtes de base de données et utiliser des fonctions intégrées. 7

Expliquez le hachage de mot de passe sécurisé dans PHP (par exemple, Password_Hash, Password_verify). Pourquoi ne pas utiliser MD5 ou SHA1? Expliquez le hachage de mot de passe sécurisé dans PHP (par exemple, Password_Hash, Password_verify). Pourquoi ne pas utiliser MD5 ou SHA1? Apr 17, 2025 am 12:06 AM

Dans PHP, Password_Hash et Password_verify Les fonctions doivent être utilisées pour implémenter le hachage de mot de passe sécurisé, et MD5 ou SHA1 ne doit pas être utilisé. 1) Password_hash génère un hachage contenant des valeurs de sel pour améliorer la sécurité. 2) Password_verify Vérifiez le mot de passe et assurez-vous la sécurité en comparant les valeurs de hachage. 3) MD5 et SHA1 sont vulnérables et manquent de valeurs de sel, et ne conviennent pas à la sécurité de mot de passe moderne.

PHP en action: Exemples et applications du monde réel PHP en action: Exemples et applications du monde réel Apr 14, 2025 am 12:19 AM

PHP est largement utilisé dans le commerce électronique, les systèmes de gestion de contenu et le développement d'API. 1) E-commerce: Utilisé pour la fonction de panier et le traitement des paiements. 2) Système de gestion du contenu: utilisé pour la génération de contenu dynamique et la gestion des utilisateurs. 3) Développement des API: Utilisé pour le développement de l'API RESTful et la sécurité de l'API. Grâce à l'optimisation des performances et aux meilleures pratiques, l'efficacité et la maintenabilité des applications PHP sont améliorées.

Expliquez les fonctions de flèche (fermetures courtes) introduites dans PHP 7.4. Expliquez les fonctions de flèche (fermetures courtes) introduites dans PHP 7.4. Apr 06, 2025 am 12:01 AM

La fonction de flèche a été introduite dans PHP7.4 et est une forme simplifiée de fermetures courtes. 1) Ils sont définis à l'aide de l'opérateur =>, omettant la fonction et utilisent des mots clés. 2) La fonction flèche capture automatiquement la variable de portée actuelle sans le mot clé Utiliser. 3) Ils sont souvent utilisés dans les fonctions de rappel et les calculs courts pour améliorer la simplicité et la lisibilité du code.

See all articles