2016-05-19 5 views
3

PHP FCGIを使用してWindows上のNginxでPHPスクリプト(WebページからのWeb要求を処理するPHPで作成された安心のWebサービス)を使用しています。要求数が "php_fcgi_max_requests"に達するまで、すべてうまく動作します。私はNginx + PHP FCGIのチュートリアルのすべてがPHPの安定性のためにこの値を示唆しているので、これを1000に設定しています。しかし、WindowsのOSでNginxを使用してPHP FCGIをリサイクルできる方法があるかどうかを知りたい。つまり、1000回のリクエストが処理されてPHP FCGIが終了すると、PHP FCGIが再起動してリクエストを再度処理し始めます。私は、このnginx + PHP FCGIは、ユーザーが明示的に閉じない限り、常にWindows上で実行する必要があります。nginxで使用するとWindowsで死んだらPHP FCGIプロセスを自動的に再起動

私は多くのオンライン調査をしましたが、WindowsのNginxのための解決方法が見つかりませんでした。他のオペレーティングシステムは、残念ながらオプションではありません。私はWindows用のソリューションしか必要とせず、メモリを大量に占有せず、インストールが簡単な軽いサーバーが必要です。

もし私の目標がNginx + PHP FCGIで達成できないと思うなら、可能な限り多くのリクエストを処理できるWindows上でPHP FCGIを他のライトサーバー(Nginxなど)と一緒に使うことができるならば、 (要求が最大限に達するとプロセスが終了するときに、要求に制限がないか、少なくともリサイクルされます)。

誰かが私にガイダンスを提供できるなら、非常に役に立ちます。

ちなみに、私は以下のようにnginxのサーバーとPHP FCGIを開始します。

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 

ここで、RunHiddenConsole.exeはこちらから:https://www.nginx.com/resources/wiki/start/topics/examples/phpfastcgionwindows/

誰もが任意のより多くの技術的な詳細が必要な場合は私に知らせてください。

ありがとうございます。

+0

これ以上の技術的な詳細が必要な場合は、教えてください。私は本当にこれで道案内に達しました。私はこれで前進することができません。私はこれを解決するか、ライトウェブサーバーの完全なソリューションを落とすかのどちらかのポイントに達しました。 – CompEng89

+0

Lighttpd + PHP FCGIを見て、PHP FCGIプロセスが自動的に終了するようにします。 (わかりませんが)。しかし今、私はLighttpdが現在死んでいる可能性のあるフォーラム(https://www.reddit.com/r/programming/comments/p6n2p/nginx_no_thank_you_lighttpd/)を多くのフォーラムで読んでおり、生産目的で使用することはお勧めしません。誰もがNginx 。私はこの問題で怒っている。 – CompEng89

+0

PHP FCGIが受け取ったリクエスト数を数え、しきい値(php_fcgi_max_requests)に達すると、PHP FCGIプロセスを明示的に再起動しますか? – CompEng89

答えて

1

この問題がまだ解決していないかどうかは不明です。私が使用した作業は、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.confhttp{}ブロックに、次のブロックを追加します。あなたの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
サービスを構築します。

ここには、実装までの部分があります。私は一般的なワークフロー/アルゴリズムを提供することができます。

スタートで
  1. 、あなたのnginxの設定ファイルに必要なPHP-CGIのインスタンスは(提供バッチスクリプトを呼び出す)PHP-CGI
  2. スタートのすべてのインスタンスを停止し
  3. はPHP-CGIのキューを作成します。どのポートにどのポートがあるかを追跡します。
  4. x秒ごとに状態を確認するループを作成します。
  5. 特定の数の要求に達した場合は、キュー内の次のプロセスを停止します。そのプロセスのポートを取得します(サービス内で追跡します)。そのポートでPHP-CGIの新しいインスタンスを開始し、それをキューに戻します。

これが役に立ちます。

関連する問題