2

nginx が提供する C++ fastcgi プログラムを作成しようとしています。プログラムのコンパイルが完了し、Hello World の例は機能しますが、nginx から環境変数 (REQUEST_METHOD) などを取得できないようです。私が知る限り、私はチュートリアルに従っており、同じ構成を持っているので、なぜ機能しないのか、ここで本当に頭を悩ませています. これが私の構成です:

location /cgi {
  fastcgi_pass 127.0.0.1:9000;
  fastcgi_index index.html;
  include /etc/nginx/fastcgi_params;
}

(fastcgi_params はデフォルトの nginx インストールから変更されていません)。

次に、C++ プログラムからの関連コード:

streambuf * cin_streambuf  = cin.rdbuf();
streambuf * cout_streambuf = cout.rdbuf();
streambuf * cerr_streambuf = cerr.rdbuf();

FCGX_Request request;

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

while (FCGX_Accept_r (&request) == 0)
{
  fcgi_streambuf cin_fcgi_streambuf (request.in);
  fcgi_streambuf cout_fcgi_streambuf (request.out);
  fcgi_streambuf cerr_fcgi_streambuf (request.err);

#if HAVE_IOSTREAM_WITHASSIGN_STREAMBUF
  cin  = &cin_fcgi_streambuf;
  cout = &cout_fcgi_streambuf;
  cerr = &cerr_fcgi_streambuf;
#else
  cin.rdbuf(&cin_fcgi_streambuf);
  cout.rdbuf(&cout_fcgi_streambuf);
  cerr.rdbuf(&cerr_fcgi_streambuf);
#endif

  //figure out what kind of request we have
  char * request_type = FCGX_GetParam("REQUEST_METHOD", request.envp);

  cout << "Content-type: text/html\r\n"
  "\r\n";
  cout << "Environment is: " << *request.envp;

}

FCGX_GetParam への呼び出しは null を返し、request.envp を出力すると、表示される唯一の変数は FCGI_ROLE=RESPONDER です。

次のコマンドを使用してプロセスを起動しています。

spawn-fcgi -p 9000 -n FCGI-App

すべてがUbuntu 11.10で実行されています。

何か案は?

4

1 に答える 1

2

で印刷しようとしてchar **envp;いますcout << *request.envp。これは、配列から最初の文字列のみを出力すると予想されますが、ここでは驚くことではありません。

代わりにコード形式の公式 FCGI の例を試してください。

static void penv(const char * const * envp)
{
    cout << "<PRE>\n";
    for ( ; *envp; ++envp)
    {
        cout << *envp << "\n";
    }
    cout << "</PRE>\n";
}

...

penv(request.envp);
于 2012-09-28T07:27:20.103 に答える