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.
- sur Démarrer, arrêter toutes les instances de PHP-CGI
- Démarrer les instances de PHP-CGI requis par votre fichier de configuration Nginx (appel dans le script batch fourni)
- Créer une file d'attente de PHP-CGI processus, gardez la trace de celui qui est sur quel port.
- Créez une boucle pour vérifier l'état toutes les x-secondes.
- 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.
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
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
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