


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!

PhpSessionsStrackUserDataacrossMultiplepageRequestSusingauniqueIdStoredInacookie.Here'showtomanageThememeChectively: 1) startAsessionwithSession_start () etstoredatain $ _session.2) RegenerateTheSessionidaFterloginWithSession_Regenereate_id (true) TopReventiSi

En PHP, l'itération des données de session peut être obtenue via les étapes suivantes: 1. Démarrez la session à l'aide de session_start (). 2. Ilaster à travers la boucle FOREACH à travers toutes les paires de valeurs clés dans le tableau $ _SESSION. 3. Lors du traitement des structures de données complexes, utilisez des fonctions is_array () ou is_object () et utilisez print_r () pour produire des informations détaillées. 4. Lors de l'optimisation de la traversée, la pagination peut être utilisée pour éviter de traiter de grandes quantités de données en même temps. Cela vous aidera à gérer et à utiliser les données de session PHP plus efficacement dans votre projet réel.

La session réalise l'authentification des utilisateurs via le mécanisme de gestion de l'état côté serveur. 1) Création de session et génération d'ID unique, 2) Les ID sont passés par des cookies, 3) les magasins de serveurs et accèdent aux données de session via IDS, 4) l'authentification des utilisateurs et la gestion de l'état sont réalisées, améliorant la sécurité des applications et l'expérience utilisateur.

Tostoreauser'snameinaphpSession, startTheSessionwithSession_start (), thenSsignTheNameto $ _session ['username']. 1) usayession_start () toinitizethesession.2) attheuser'snameto $ _session ['username'].

Les raisons de la défaillance de la phpsession comprennent les erreurs de configuration, les problèmes de cookies et l'expiration de session. 1. Erreur de configuration: vérifiez et définissez la session correcte.save_path. 2.Cookie Problème: assurez-vous que le cookie est correctement réglé. 3.Session Expire: Ajustez la valeur de session.gc_maxlifetime pour prolonger le temps de session.

Les méthodes pour déboguer les problèmes de session en PHP incluent: 1. Vérifiez si la session est démarrée correctement; 2. Vérifiez la livraison de l'ID de session; 3. Vérifiez le stockage et la lecture des données de session; 4. Vérifiez la configuration du serveur. En sortissant l'ID de session et les données, en affichant le contenu du fichier de session, etc., vous pouvez diagnostiquer et résoudre efficacement les problèmes liés à la session.

Plusieurs appels vers session_start () se traduiront par des messages d'avertissement et d'éventuels remplacements de données. 1) PHP émettra un avertissement, ce qui incite la session à démarrer. 2) Il peut provoquer un écrasement inattendu des données de session. 3) Utilisez session_status () pour vérifier l'état de la session pour éviter les appels répétés.

La configuration du cycle de vie de session dans PHP peut être réalisée en définissant session.gc_maxlifetime et session.cookie_lifetime. 1) Session.gc_maxlifetime contrôle le temps de survie des données de session côté serveur, 2) Session.cookie_lifetime contrôle le cycle de vie des cookies des clients. Lorsqu'il est réglé sur 0, le cookie expire lorsque le navigateur est fermé.


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

Version crackée d'EditPlus en chinois
Petite taille, coloration syntaxique, ne prend pas en charge la fonction d'invite de code

Télécharger la version Mac de l'éditeur Atom
L'éditeur open source le plus populaire

MinGW - GNU minimaliste pour Windows
Ce projet est en cours de migration vers osdn.net/projects/mingw, vous pouvez continuer à nous suivre là-bas. MinGW : un port Windows natif de GNU Compiler Collection (GCC), des bibliothèques d'importation et des fichiers d'en-tête librement distribuables pour la création d'applications Windows natives ; inclut des extensions du runtime MSVC pour prendre en charge la fonctionnalité C99. Tous les logiciels MinGW peuvent fonctionner sur les plates-formes Windows 64 bits.

Dreamweaver CS6
Outils de développement Web visuel

Listes Sec
SecLists est le compagnon ultime du testeur de sécurité. Il s'agit d'une collection de différents types de listes fréquemment utilisées lors des évaluations de sécurité, le tout en un seul endroit. SecLists contribue à rendre les tests de sécurité plus efficaces et productifs en fournissant facilement toutes les listes dont un testeur de sécurité pourrait avoir besoin. Les types de listes incluent les noms d'utilisateur, les mots de passe, les URL, les charges utiles floues, les modèles de données sensibles, les shells Web, etc. Le testeur peut simplement extraire ce référentiel sur une nouvelle machine de test et il aura accès à tous les types de listes dont il a besoin.
