Comment append un pool à FPM (nginx) sans recharger / redémarrer fpm lui-même?

Je construis un environnement (sur une machine ubuntu 10.04.02) pour gérer un site Web avec plusieurs (devrait supporter au less 1000) sous-domaines, chacun d'eux étant desservi par un groupe FPM différent, avec un autre user.

Donc, rien de nouveau; Mon problème est de créer (et de démarrer) un nouveau pool de fpm sans devoir recharger / redémarrer FPM, ce qui entraînera un time d'arrêt (je sais, très rapide).

J'ai écrit un démon python qui, si nécessaire:

  1. Créer l'user du système
  2. Configurer la racine Web des sous-domaines
  3. Créez le sous-domaine.conf dans mon dossier /etc/php5/fpm/fpm.d/

J'ai googlé autour mais je n'ai pas trouvé un moyen d'invoquer fpm à l'aide d'un pool, ce qui pourrait être une solution «temporaire»: l'instance principale de fpm exécute toutes les piscines, une nouvelle, obtient sa propre instance de fpm, puis avec un cron je m'arrête et rechargez fpm chaque semaine / mois / notknowyet

Si le problème est important, le server fonctionne sur nginx, configuré pour utiliser unix socket to fcgi, c'est ma configuration de test nginx:

server{ listn 80; server_name ~^(?<domain>.+)\.test\.local$; # foo.test.local > myapp_foo root /var/www/myapp/subdomains/myapp_$domain/htdocs; location / { index index.php; } location ~* \.(gif|jpg|png|ico)$ { expires 30d; } location ~ \.php$ { fastcgi_pass unix:/var/web-sock/myapp_$domain-fpm.sock; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } } 

… et mon sous-domaine-fpm.conf:

 [myapp_foo] listn = /var/web-sock/myapp_foo-fpm.sock user = myapp_foo group = myapp_foo pm = dynamic pm.max_children = 30 pm.start_servers = 1 pm.min_spare_servers = 1 pm.max_spare_servers = 30 

J'ai essayé d'utiliser php5-cgi et / ou spawn-fcgi dans les nouveaux sous-domaines, mais est un peu instable et se bloque souvent lorsque le niveau de concurrency augmente un peu.

Une idée?

4 Solutions collect form web for “Comment append un pool à FPM (nginx) sans recharger / redémarrer fpm lui-même?”

Je ne crois pas qu'il existe un moyen d'append un pool sans redémarrer / recharger (selon cela ).

Je pense que la redondance est la meilleure approche à cela, je crois, que vous pourriez accomplir ce que vous voulez avec reload . Comme il s'agit d'un rechargement gracieux, il devrait attendre que les process se terminent.

Essentiellement, passez le signal SIGUSR2 à php-fpm, et il rechargera gracieusement tous les travailleurs + recharger le fpm conf / binary.

Je crois que cela équivaut à

 kill -USR2 `cat $php_fpm_PID` 

Donc, vous modifiez la conf – et le rechargement – ne devrait pas entraîner des time d'arrêt remarquables.

Une autre option consiste à exécuter un process par user: vous pouvez append de nouveaux users sans mettre fin aux process existants, mais les besoins en ressources sont significativement plus élevés (et, pour plus de 1000 users, ils ne risquent pas d'être pratiques).

Une autre option est de créer un process php-cgi temporaire pour le nouvel user et de retarder le rechargement du server jusqu'à plus tard (c'est-à-dire une période de charge faible ou lorsque vous avez plusieurs users à append). Cela réduirait les time d'arrêt, mais soutiendrait le sous-domaine du nouvel user immédiatement.

Aucun des éléments ci-dessus n'est exactement l'idéal, et la seule solution pratique à l'absence de time d'arrêt serait l'approche par server multiple.

Si vous ne pouvez pas vous permettre un time d'arrêt, la seule option est d'append une redondance

  1. Laissez un équilibreur de charge fonctionner devant 2 servers (ou plus).
  2. configurez le mode chaud comme vous le souhaitez
  3. basculer
  4. configurez le "nouveau" hot-standby comme vous le souhaitez
  5. Rince et répétez chaque fois que vous avez besoin d'un changement

EDIT: il est très possible d'exécuter une configuration comme celle-ci avec une seule pièce matérielle. Ajoutez simplement plus d'instances de nginx en cours d'exécution sur différentes adresses IP et créez une configuration de basculement entre celles-ci. Si cette option est logique pour votre cas d'utilisation, il ne dépend pas de moi de décider.

Cela semble être bloqué pour les ressources. Pourquoi ne pas exécuter deux servers Web sur le même matériel?

Essayez quelque chose comme ceci:

 +---------------+ | nginx :80 | | / \ | | :8081 :8080 | +---------------+ 

De cette façon, votre service d'équilibrage de charge (nginx dans ce cas) peut parcourir deux ports. De cette façon, vous pouvez prendre un service en haut ou en bas aussi souvent que vous le souhaitez (pour les mises à jour), etc.

Bien sûr, vous auriez besoin de deux pools FPM, deux users, etc.

Désolé de répondre à ma propre question, mais j'ai trouvé cette solution qui est exactement ce que je recherchais … il y a 3 ans;)

Fondamentalement, l'idée est d'avoir un script d'init pour chaque pool, avec quelques modifications, il fonctionne comme un charme.

Désolé si je ne répète pas les étapes ici, mais vraiment, je serais simplement un copy'n'paste de ce lien!

Autres lectures: php-fpm ondemand avec systemd

L'espoir aide quelqu'un;)

  • Le process Apache semble mourir chaque heure
  • où puis-je find php_mssql.dll?
  • PHP dans le léopard des neiges
  • php5-fpm + nginx + drupal7: continue de m'envoyer index.php pour téléchargement
  • Comment endurer ngnx vhosts (hébergement WordPress) d'autres users dans des installations WP piratées
  • Comment activer la diffusion lorsque le file est livré via un script PHP?
  • Pourquoi memcache ne fonctionne-t-il pas avec elgg dans debian 7?
  • Utilisation d'Ubuntu 12.04 + Apache 2.4 + Php 5.5: WebDav Possible
  • Comment restreindre uniquement PHP5 / Apache pour envoyer un message uniquement aux users locaux
  • Comment décider des bonnes valeurs par défaut de VPS pour PHP et Wordpress en matière de memory?
  • Pourquoi est-ce que je reçois 405 erreurs après avoir appuyé sur les noms de domaine?
  • Les astuces du serveur de linux et windows, tels que ubuntu, centos, apache, nginx, debian et des sujets de rĂ©seau.