用nginx在c++中用fastcgi访问环境变量

Accessing environment variables with fastcgi in c++ with nginx

本文关键字:fastcgi 访问 环境变量 中用 c++ nginx      更新时间:2023-10-16

我正在尝试编写一个由nginx提供服务的c++fastcgi程序。我已经编译了这个程序,helloworld的例子也能工作,但我似乎无法从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/htmlrn"
  "rn";
  cout << "Environment is: " << *request.envp;
}

对FCGX_GetParam的调用返回null,当我输出request.envp时,显示的唯一变量是FCGI_ROLE=RESPONDER。

我使用以下命令启动流程:

spawn-fcgi -p 9000 -n FCGI-App

一切都在Ubuntu 11.10下运行。

有什么想法吗?

您正在尝试用cout << *request.envp打印char **envp;。这将只打印数组中的第一个字符串,这并不奇怪。

请尝试代码形式的官方FCGI示例:

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