2012-07-18 20 views
2

我正在努力編寫一個由nginx提供服務的C++ fastcgi程序。我有程序編譯和hello world的例子,但我似乎無法從nginx獲取任何環境變量(REQUEST_METHOD)等。據我所知,我正在跟隨教程,並具有相同的配置,所以我真的在這裏拉我的頭髮,爲什麼它不工作。這裏是我的配置:用nginx在C++中用fastcgi訪問環境變量

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調用返回空,並且當我輸出request.envp所示,唯一的變量是FCGI_ROLE = RESPONDER。

我使用下面的命令來啓動進程:

spawn-fcgi -p 9000 -n FCGI-App 

一切的Ubuntu 11.10下運行。

任何想法?

+0

只是猜測 - 是有可能,nginx的不傳ENV數據由於缺少某些權限? – 2012-07-18 19:33:39

回答

1

您正在嘗試打印char **envp;cout << *request.envp。預計這將只打印出陣列中的第一個字符串,這裏並不令人意外。

嘗試代碼形式official FCGI example代替:

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

... 

penv(request.envp); 
+0

如果我只是試圖從envp中獲得一個變量,例如QUERY_STRING,該怎麼辦? – trynacode 2016-08-09 18:03:26

+0

@trynacode,'FCGX_GetParam()'會爲你做。 – 2016-08-21 13:39:10