2016-05-19 4 views
3

J'utilise PHP FCGI pour exécuter des scripts PHP (Ce sont des services Web reposants écrits en PHP qui traitent les requêtes web à partir de pages web) avec Nginx sous Windows. Tout fonctionne bien jusqu'à ce que le nombre de requêtes atteigne "php_fcgi_max_requests". Je mets cela à 1000 car chaque tutoriel pour Nginx + PHP FCGI suggère cette valeur pour la stabilité de PHP. Mais je veux savoir s'il y a moyen de recycler le PHP FCGI en l'utilisant avec Nginx sous Windows. En d'autres termes, une fois que les 1000 requêtes sont traitées et que PHP FCGI meurt, PHP FCGI se redémarre et recommence à gérer les requêtes. J'ai besoin de ce FCGI nginx + PHP fonctionnant toujours sous Windows jusqu'à ce qu'il soit explicitement fermé par l'utilisateur.Redémarrer le processus PHP FCGI automatiquement une fois qu'il meurt sous Windows avec nginx

J'ai beaucoup étudié en ligne mais je n'ai pas trouvé de solution pour Nginx sous Windows. Tout autre système d'exploitation n'est malheureusement pas une option. J'ai besoin d'une solution pour Windows seulement et j'ai besoin d'un serveur léger qui ne consomme pas beaucoup de mémoire et qui est rapide à installer. Si vous pensez que mon but ne peut être atteint avec Nginx + PHP FCGI, je suis ouvert aux suggestions si le FCGI PHP peut être utilisé avec n'importe quel autre serveur léger (comme Nginx) sur Windows où il peut gérer autant de demandes que possible (pas de limite aux demandes ou au moins se recycler quand le processus s'éteint en atteignant les demandes max).

Il serait très utile si quelqu'un peut me fournir des conseils.

Pour votre information, je commence le serveur Nginx et PHP FCGI comme ci-dessous:

set PATH=<customized path>;%PATH% 
set PHP_FCGI_MAX_REQUESTS=1000 
RunHiddenConsole.exe %CD%\nginx\PHP\php-cgi.exe -b 127.0.0.1:9000 
RunHiddenConsole.exe nginx.exe 

ici, RunHiddenConsole.exe est d'ici: https://www.nginx.com/resources/wiki/start/topics/examples/phpfastcgionwindows/

S'il vous plaît laissez-moi savoir si quelqu'un a besoin de détails plus techniques.

Merci beaucoup d'avance.

+0

S'il vous plaît laissez-moi savoir si quelqu'un a besoin de plus de détails techniques pour répondre à cette question. J'ai vraiment atteint un barrage routier avec ça. Je ne suis pas capable d'aller de l'avant avec ça. J'ai résolu ce problème ou j'ai complètement abandonné la solution complète du serveur Web léger, etc. – CompEng89

+0

Je regarde dans le FCGI Lighttpd + PHP qu'il peut générer automatiquement les processus PHP FCGI une fois qu'il meurt. (Pas sûr mais) Mais maintenant, je lis sur de nombreux forums que Lighttpd peut être mort maintenant (https://www.reddit.com/r/programming/comments/p6n2p/nginx_no_thank_you_lighttpd/) et non recommandé d'être utilisé à des fins de production et tout le monde se déplace vers Nginx . Mec, je me fâche avec ce problème. – CompEng89

+0

Existe-t-il un moyen de compter le nombre de requêtes reçues par PHP FCGI et une fois qu'il a atteint le seuil (php_fcgi_max_requests), redémarrer le processus PHP FCGI explicitement? – CompEng89

Répondre

1

Vous ne savez pas si vous êtes toujours confronté à ce problème. Le travail que j'ai utilisé était de concevoir un service Windows qui surveille le nombre de requêtes traitées par Nginx. J'ai utilisé plusieurs instances de PHP-CGI (Fast CGI) pour équilibrer le serveur.

Je ne peux pas partager le code complet comme je l'ai fait pour le travail, mais je peux fournir les étapes pour concevoir votre propre implémentation.

Quelques informations sur la raison pour laquelle j'ai mis ce la façon dont je l'ai fait:

  • Nginx ne peut pas redémarrer php-cgi.exe (sous Windows au moins)
  • La valeur par défaut pour PHP_FCGI_MAX_REQUESTS est 500 . Par défaut, php-cgi.exe se terminera après avoir traité 500 requêtes web.
  • Notre serveur web est sur un système embarqué, il ne verra pas de trafic important.

Etape 1
Configurer Nginx pour permettre une surveillance active. Cela vous permettra de suivre le nombre de demandes reçues par votre serveur.

Même si PHP-CGI a planté, il est toujours possible d'obtenir les informations de demande de Nginx. Ajoutez les informations de localisation suivantes dans votre bloc server{} dans nginx. conf

location /nginx_status { 
     stub_status on; 
     access_log off; 
     allow 127.0.0.1; 
     deny all; 
    } 

maintenant, de votre serveur, si vous visitez localhost/nginx_status vous pourrez voir le nombre de traités (le 3ème numéro dans la 3ème ligne est le nombre de demandes). Nginx Doc on stub_status

Étape 2
Accédez au statut Nginx de votre service (le mien est écrit en C# .NET 4.0)
Mes chèques de service et met à jour la valeur des demandes tout au long de son vivant. Vous pouvez obtenir la chaîne à partir de la page Web en utilisant le code suivant:

// 
// Get the Nginx Status String containing the number of requests to the site. 
// 
private string ReadSiteStatus() 
{ 
    string nginxStatus = ERROR_NO_NGINX; 
    using (WebClient client = new WebClient()) 
    { 
     try 
     { 
      nginxStatus = client.DownloadString("http://127.0.0.1/nginx_status"); 
     } catch (Exception ex) 
     { 
      WriteToFile(ex.Message); 
     } 
    } 
    return nginxStatus; 
} 

De là, vous pouvez configurer une fonction pour analyser le nombre de demande de cette chaîne.

Étape 3
Configuration Nginx pour équilibrer la charge entre plusieurs instances PHP-CGI. Pour notre implémentation, nous avons utilisé trois instances. Dans le bloc http{} de nginx.conf, ajoutez le bloc suivant.

#Reference the three Fast CGI servers 
upstream myproject{ 
    server 127.0.0.1:9000 weight=1 fail_timeout=5; 
    server 127.0.0.1:9001 weight=1 fail_timeout=5; 
    server 127.0.0.1:9002 weight=1 fail_timeout=5; 
} 

Dans votre bloc server{}, recherchez le bloc location ~\.php${}. Mettez à jour le fastcgi_pass pour référencer le bloc amont défini dans http.

# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000, 9001, and 9002 
location ~ \.php$ { 
    fastcgi_pass myproject; 
    fastcgi_index index.php; 
    fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name; 
    include  fastcgi_params; 
} 

Étape 4
Démarrez les trois instances de PHP-CGI. Une écoute sur chacun des ports: 9000, 9001 et 9002.

Je voulais faire cela à partir de mon service, mais j'avais des problèmes avec l'appel direct de l'exécutable PHP-CGI. J'ai écrit un fichier batch qui démarre PHP-CGI. Il prend un numéro de port en paramètre. Le fichier a été nommé démarrage php.bat

@ECHO OFF 
SET PHP_FCGI_MAX_REQUESTS=2000 
C:\Nginx\RunHiddenConsole.exe C:\NGinx\PHP\php-cgi -b 127.0.0.1:%1 -c 
C:\NGinx\PHP\php.ini 
EXIT 

Exemple d'utilisation:

> start-php.bat 9000

commencerais une instance écoute sur le port 9000.

RunHiddenConsole.exe est requis pour exécuter PHP-CGI en arrière-plan, il est référencé sur le site de NGinx here.

Étape 5
Générez le service.

Voici la partie qui dépend de votre implémentation. Je peux vous fournir le flux de travail général/algorithme.

  1. sur Démarrer, arrêter toutes les instances de PHP-CGI
  2. Démarrer les instances de PHP-CGI requis par votre fichier de configuration Nginx (appel dans le script batch fourni)
  3. Créer une file d'attente de PHP-CGI processus, gardez la trace de celui qui est sur quel port.
  4. Créez une boucle pour vérifier l'état toutes les x-secondes.
  5. Si vous avez atteint un certain nombre de demandes, arrêtez le processus suivant dans la file d'attente. Obtenez le port de ce processus (suivez-le dans votre service). Démarrez une nouvelle instance de PHP-CGI sur ce port, ajoutez-la à la file d'attente.

Espérons que cela aide.