我正在尝试让fastcgi在Nginx上工作。我知道配置文件是正确的,因为它以前可以工作,并且我怀疑我的C ++程序以及我如何将fcgi文件设置为由nginx读取。这些是我所采取的步骤。我在使用fastcgi的Ubuntu,nginx,c ++。我做错了什么?

1)编译程序

g++ -o rtbCookieServer.fcgi rtbCookieServer.o -lfcgi++ -lboost_system -lcgicc -L/home/cpp/mongo-cxx-driver-v2.0 -I/home/cpp/mongo-cxx-driver-v2.0/mongo


2)将rtbCookieServer.fcgi移至/ var / www

3)须藤/ var / www chmod a + x rtbCookieServer.fcgi

4)运行以下

spawn-fcgi.standalone -u root -g root -G www-data -a 127.0.0.1 -p 9000 -f /var/www/rtbCookieServer.fcgi
spawn-fcgi: child spawned successfully: PID: 2398


如果我尝试以root身份运行命令,则会得到以下信息:

spawn-fcgi: I will not set uid to 0


5)浏览到http://127.0.0.1/rtbCookieServer.fcgi,在此我的日志文件中出现502错误和此错误

2012/01/23 15:19:03 [error] 1189#0: *1 upstream closed prematurely FastCGI stdout while reading response header from upstream, client: 127.0.0.1, server: localhost, request: "GET /rtbCookieServer.fcgi HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000", host: "127.0.0.1"


当我查看在端口9000上侦听的内容时,我得到了以下带有一些其他诊断信息的消息:

    sudo lsof -i :9000
    COMMAND    PID         USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
    rtbCookie 2398 marktest    0u  IPv4  17598      0t0  TCP localhost:9000 (LISTEN)

    netstat -an | grep 9000
    tcp        0      0 127.0.0.1:9000          0.0.0.0:*               LISTEN

    ps auxww | grep rtbCookieServer.fcgi
    1000      2398  0.0  0.0  24616   360 ?        Ss   15:08   0:00 /var/www/rtbCookieServer.fcgi


Now..1)为什么命令说rtbCookie而不是rtbCookieServer?即使我杀死进程并重新运行spawn命令...仍然说rtbCookie。它不应该说rtbCookieServer吗?另外,为什么对用户而不是root说marktest?

对于诊断,我运行./rtbCookieServer.fcgi --9000并获得预期的输出。

这是我的文件权限。

-rwxr-xr-x  1 root root 1580470 2012-01-23 14:28 rtbCookieServer.fcgi


这是我的配置文件:

server {
    listen   80;
    server_name localhost;


            location ~ \.fcgi$ {
                    root   /var/www;
                    include /etc/nginx/fastcgi_params;
                    fastcgi_pass   127.0.0.1:9000;
                    fastcgi_index  index.html;
                    fastcgi_param  SCRIPT_FILENAME  /$fastcgi_script_name;
                    include fastcgi_params;
            }
    }

最佳答案

它之所以说是rtbCookie,是因为lsof使用固定宽度的列,而rtbCookie正是适合的。

听起来好像在处理发送回的标头时感到困惑。我怀疑您的回复中有轻微的格式错误。每个标头应以\ r \ n结尾
在最后一个标头和响应的正文之间,必须有一个空行,并且以\ r \ n结尾

08-19 22:26