2012-03-25 6 views
2

私はfastcgi.comのAPIを使ってCでFCGIプログラムを作った。私はFCGI_Acceptと言いました。結果の実行可能ファイルを実行すると、CGIプログラムのように実行され、終了します。FCGIサーバーを作成するためのC API?

UNIXドメインソケットでリッスンするWebサーバー用のAPIが必要です。私はnginxを使用していますが、FCGIプログラムはそれ自体とfastcgi.comのAPIライブラリを生成しません。 FCGIプログラムを作成するために他のサーバーやライブラリを使用したくありません。

+0

fastcgiプログラムは他のプログラムと同様に起動します。 'メイン 'を通って)。 HTTPサーバーをFastCGIアプリケーションとして起動するように構成する必要があります。 –

+0

@BasileStarynkevitch nginxはFastCGIアプリケーションを起動しません。 – unixman83

+0

これは、 'ngnix'がFastCGIをサポートしていないか、FastCGIアプリケーションが外部から開始されることを期待していることを意味します(例えば'/etc/init.d/'のシステム起動スクリプトなど)。 FastCGIアプリケーションを起動するのは依然としてシステム管理上の問題であり、質問はここに属しません(コードに関係しないため)。 –

答えて

1

nginxで使用するためにfcgi_stdioライブラリを使用して書かれたFastCGIアプリケーションを起動しようとして同じ問題が発生しています。アプリケーションを正常に起動すると、通常のCGIと同様に動作し、すぐに終了します。私は秘密のソースがhttpデーモン(それはnginxはしない)によってCGIの代わりにFastCGIのように動作するようにするために何が行われるのかよく分かりませんが、spawn-fcgiそれを行います。これは、RHEL/CentOS/Amazon Linux/etcで使用するためのEPELリポジトリで利用できます。それがあなたの状況に役立つかどうかはわかりませんが、私が最終的に使い終わったのです。

2

Unixman、nginxは、単独でFCGIサービスを起動しません。あなたのプログラムは、FastCGI要求を受け入れるメインループを開始し、必要とします。 Nginxはこれらの要求をあなたのソフトウェアに転送します。

簡単な方法(コードはC++でCではありませんが)の場合は(F)CGI kitまたはWt FCGI kitのいずれかを使用できます。どちらもメインループを処理できますが、ハンドラ関数でCコードを呼び出すだけで済みます。

+0

私はフレームワークを使用していません。私はfastcgi.comからFCGI APIを使用しています。それは、 'FCGI_Accept'と呼ぶだけですが、うまくいきません。通常のCGIのように動作し、終了します。 – unixman83

2

Unixドメインソケットリスナーを作成し、ソケット記述子をSTDIN_FILENOにdupするだけです。

dup2(socket, STDIN_FILENO); 
while(FCGI_Accept() >= 0) { 
    /* ... */ 
} 
+0

@ unixman83あなたのアプリケーションはサーバーであり、Webサーバーはクライアントです。Unixドメインソケットが必要な場所を決め、Webサーバー(クライアント)に指定されたソケットパスに接続するよう指示します。それ以上のソケットは必要ありません、すべてのメッセージは私が言ったソケットを通過します。 – chansen

+0

STDOUTが表示されていません。 'STDOUT'と' STDERR'はどのように扱いますか? – unixman83

3

ただ、次の手順を実行 -

  1. オープンFCGX_OpenSocketを使用してソケット()ここで
  2. 初期使用FCGX_InitRequest()
  3. ループFCGX_Accept_rを(使用)の代わりに、FCGI_Accept()

完全な実例 -

#include <fcgi_stdio.h> 

#define PATH_SOCKET "/tmp/hello.sock" 

int main() { 
    int sock = FCGX_OpenSocket(PATH_SOCKET, 10); 
    FCGX_Request request; 

    FCGX_Init(); 
    FCGX_InitRequest(&request, sock, 0); 

    while (FCGX_Accept_r(&request) == 0) { 
     FCGX_FPrintF(request.out, "Content-Type: text/plain\r\n\r\n" 
       "Hello World!\r\n"); 
     FCGX_Finish_r(&request); 
    } 

    return 0; 
} 
関連する問題