


Comment personnaliser une seule image Nginx pour plusieurs conteneurs PHP-FPM
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.
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 ?
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; }
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
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; } }
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 'daemon off;'"
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
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
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; } }
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
Succès ! Cependant, il y a deux problèmes qui me dérangent avec cette méthode :
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.
Exiger un répertoire vide pour l'application semble inutile, de plus mes fichiers sont dans des répertoires différents.
Solution finale
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
如果你想自定义这个镜像,添加你自己的文件或者Nginx配置文件,只需要像下面这样扩展你的Dockerfile:
FROM shiphp/nginx-env ONBUILD ADD <PATH_TO_YOUR_CONFIGS> /etc/nginx/conf.d/
现在我所有的PHP-FPM容器都使用单个Nginx镜像的实例,当我需要升级Nginx、修改权限或者配置一些东西的时候,这让我的生活变得简单多了。
以上就是本文的全部内容,希望对大家的学习有所帮助,更多相关内容请关注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!

Outils d'IA chauds

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

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

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

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

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

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

Sujets chauds











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.

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 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.

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

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 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.

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.
