FCGI应用程序出现问题

时间:2015-04-24 08:04:17

标签: c nginx fastcgi

我在使用nginx获取使用C的FCGI应用程序时遇到问题。我使用spawn-fcgi创建套接字并运行我的应用程序(我将其命名为paste)

我认为这应该是我的应用程序的问题,但我非常肯定我从位于here的示例源中复制了所有相关部分。

这是nginx给我的错误:

[error] 53300#0: *4 upstream prematurely closed connection while
reading response header from upstream, client: 127.0.0.1, server: 
localhost, request: "GET /test HTTP/1.1", upstream: 
"fastcgi://unix:/tmp/cfcgi.sock:", host: "localhost"

以下是该应用程序的来源:

#include <fcgi_stdio.h>
#include <stdlib.h>
#include <stdio.h>

int main(int argc, char **argv) {
    while(FCGI_Accept() >= 0) {
        printf("Content-type: text/html\r\n\r\n");
        printf("Hostname: %s", getenv("SERVER_HOSTNAME"));
    }
    return EXIT_SUCCESS;
}

nginx中的相关配置更改:

location /test {
    include fastcgi_params;
    fastcgi_pass unix:/tmp/cfcgi.sock;
}

和spawn-fcgi命令:

spawn-fcgi -s /tmp/cfcgi.sock -M 0777 -P cfcgi.pid -- paste

1 个答案:

答案 0 :(得分:2)

Nginx传递给FastCGI服务器的变量列在/ etc / nginx / fastcgi_params中,您在配置文件中包含这些变量。并且没有SERVER_HOSTNAME这样的变量。最近的一个是SERVER_NAME。

如果找不到请求的变量,函数getenv()将返回0,这在您的情况下会发生。然后这个值由printf(%s)引用,这会导致发生分段错误。

因此,要解决此问题,您可以将参数SERVER_HOSTNAME添加到fastcgi_params文件中(之后不要忘记重新加载Nginx),或者在应用程序中将SERVER_HOSTNAME替换为SERVER_NAME。