この問題がまだ解決していないかどうかは不明です。私が使用した作業は、Nginxが処理した要求の数を監視するWindowsサービスを設計することでした。サーバの負荷を分散するために、PHP CGI(Fast CGI)の複数のインスタンスを使用しました。
私は仕事でこれを行ったのと同じように完全なコードを共有することはできませんが、独自の実装を設計するための手順を提供できます。
私は私がやった、このように実装する理由のいくつかの背景情報:
- nginxのは、(Windowsの場合少なくとも)のphp-cgi.exeが
- は
PHP_FCGI_MAX_REQUESTS
のデフォルト値は500
ですが、再起動することはできませんが。デフォルトでは、php-cgi.exeは500件のWebリクエストを処理した後に終了します。
- 当社のWebサーバーは組み込みシステム上にあり、トラフィックが多く見られません。
ステップ1
構成nginxのは、アクティブな監視を可能にします。これにより、サーバーが取得した要求の数を追跡できます。
PHP-CGIがクラッシュしても、依然としてNginxから要求情報を取得することは可能です。
nginxのserver{}
ブロックに次の位置情報を追加します。confに今
location /nginx_status {
stub_status on;
access_log off;
allow 127.0.0.1;
deny all;
}
は、サーバーから、あなたがlocalhost/nginx_statusを訪問する場合は、取り扱いの数を見ることができるようになります(3行目では第三の数は、要求の数です)。あなたのサービスからNginx Doc on stub_status
ステップ2
アクセスnginxのステータスを
マイサービスチェック(私はC#.NET 4.0で書かれている)、それは一生だ全体の要求値を更新します。次のコードを使用してWebページから文字列を取得することができます
//
// 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;
}
ここからは、この文字列からのリクエスト数を解析する機能を設定することができます。
ステップ3
複数のPHP-CGIインスタンスの負荷分散を設定するNginxを設定します。我々の実装では、3つのインスタンスを使用しました。 nginx.conf
のhttp{}
ブロックに、次のブロックを追加します。あなたのserver{}
ブロックで
#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;
}
、location ~\.php${}
ブロックを探します。 http
で定義されているアップストリームブロックを参照するようにfastcgi_pass
を更新します。
# 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;
}
ステップ4
は、PHP-CGIの3つのインスタンスを起動し 。それぞれのポートでリスンしている人:9000,9001,9002。
私のサービス内でこれをやりたかったのですが、PHP-CGIの実行ファイルを直接呼び出すときに問題がありました。 PHP CGIを起動するバッチファイルを書きました。これはパラメータとしてポート番号をとります。ファイルが開始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
使用例:
> start-php.bat 9000
を実行するために必要なポート9000
RunHiddenConsole.exe
に聞いてインスタンスを開始しますPHP-CGIはバックグラウンドで、NGinxのサイトhereで参照されています。
手順5
サービスを構築します。
ここには、実装までの部分があります。私は一般的なワークフロー/アルゴリズムを提供することができます。
スタートで
- 、あなたのnginxの設定ファイルに必要なPHP-CGIのインスタンスは(提供バッチスクリプトを呼び出す)PHP-CGI
- スタートのすべてのインスタンスを停止し
- はPHP-CGIのキューを作成します。どのポートにどのポートがあるかを追跡します。
- x秒ごとに状態を確認するループを作成します。
- 特定の数の要求に達した場合は、キュー内の次のプロセスを停止します。そのプロセスのポートを取得します(サービス内で追跡します)。そのポートでPHP-CGIの新しいインスタンスを開始し、それをキューに戻します。
これが役に立ちます。
これ以上の技術的な詳細が必要な場合は、教えてください。私は本当にこれで道案内に達しました。私はこれで前進することができません。私はこれを解決するか、ライトウェブサーバーの完全なソリューションを落とすかのどちらかのポイントに達しました。 – CompEng89
Lighttpd + PHP FCGIを見て、PHP FCGIプロセスが自動的に終了するようにします。 (わかりませんが)。しかし今、私はLighttpdが現在死んでいる可能性のあるフォーラム(https://www.reddit.com/r/programming/comments/p6n2p/nginx_no_thank_you_lighttpd/)を多くのフォーラムで読んでおり、生産目的で使用することはお勧めしません。誰もがNginx 。私はこの問題で怒っている。 – CompEng89
PHP FCGIが受け取ったリクエスト数を数え、しきい値(php_fcgi_max_requests)に達すると、PHP FCGIプロセスを明示的に再起動しますか? – CompEng89