如何在NGINX服务器上运行C ++ CGI脚本

时间:2019-03-15 09:05:47

标签: c++ nginx cgi fastcgi nginx-location

我在/etc/nginx/conf.d中创建的名为“ helloworld.local.conf”的配置文件中的下面几行。

server{
     listen 80 default_server;
     server_name hello_world;
     location / {
          root /var/www/helloworld;
          fastcgi_pass 127.0.0.1:9000;
     } 
}

/ var / www / helloworld中有一个index.html文件,其中显示文本“网站即将推出”。

我的c ++代码如下所示:

#include <iostream>
#include "fcgio.h"

using namespace std;

int main(void) {
    cout<<"Content-type:text/html\r\n\r\n";
    cout<<"<html>\n";
    cout<<"<head>\n";
    cout<<"<title>Hello World- First CGI Program</title>\n";
    cout<<"</head>\n";
    cout<<"<body>\n";
    cout<<"<h2> hello world</h2>\n";
    cout<<"</body>\n";
    cout<<"</html>\n";
    return 0;
}

我有使用以下命令生成的c ++二进制代码文件

g++ abc.cpp -lfcgi++ -lfcgi -o hello_world

需要部署在NGINX服务器上。我搜索并尝试了不同的方法来在stackoverflow上运行此脚本,但仍然缺少某些内容。

我还运行了以下命令,将c ++二进制代码文件连接到服务器

cgi-fcgi -start -connect 127.0.0.1:9000 ./hello_world

现在,当我在浏览器中访问地址127.0.0.1:9000时,没有得到c ++代码中的“ hello world”文本。

输出:我想从c ++二进制代码获得“ hello world”的响应,并将其显示在html页面上。

我想念的是什么,请帮忙。

更新:这是我的配置文件。

server{
    server_name hello;
    location / {
        fastcgi_index index.cgi;
        root /var/www/helloworld;
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_name;
        include fastcgi_params;
    }
}

2 个答案:

答案 0 :(得分:0)

更新

看看这个blog post。它详细解释了如何设置C ++ / FCGI / nginx。


原始答案

您的C ++代码应该是一个侦听器(在运行时,它应该侦听端口并根据传入的请求返回响应)。 这部分与nginx没有任何关系。因此,首先要确保您的代码正常运行;运行您的代码,然后尝试访问指定的端口,看看是否获得预期的响应。

然后,您需要在nginx配置中设置一个proxy,该配置基本上会将您想要的所有流量重定向到C ++端口(例如9000)。例如,您可以进行设置,以使任何https://your_domain.com/api/*形式的url都重定向到您的C ++。

这在nginx中非常简单:

location /api/ {
    proxy_pass  http://127.0.0.1:9000/;
}

但是首先要单独测试您的C ++,并确保它能正常工作

此外,您最好使用runitsystemd之类的工具或类似工具来保持C ++侦听器运行(如果崩溃,请重新启动它)。

答案 1 :(得分:0)

除非您通过某种形式调用您的CGI脚本(在这种情况下为可执行文件),否则我认为在创建索引时会更简单且不会失去一般性。正如您目前所拥有的那样,您什么都没看到这一事实不足为奇。请记住,CGI模块没有向第一个html文件添加任何内容。您必须在第一行声明内容类型,因为它要显示的html文件。

尽管如此,我还是将编译内容更改为此:

g++ abc.cpp -lfcgi++ -lfcgi -o index.cgi

现在,请确保您的配置文件中包含以下内容。我通常使用Apache,但是如果我没记错的话,您的文件夹配置应如下所示,并且应该会很好。

location / {
    root          /var/www/helloworld;
    fastcgi_pass  127.0.0.1:9000;
    fastcgi_index index.cgi
    fastcgi_param SCRIPT_FILENAME $fastcgi_script_name
    include       fastcgi_params
}

在文档中,fastcgi_param参数通常如下所示:

fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name

由于您以为您的可执行文件将被称为index.cgi并且位于当前目录中,因此我从示例中省略了scripts文件夹,但是请记住,该示例是非常虚构的,并且仅是有价值的以获得最小的CGI系统运行。