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

4
我已经在创建的/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 文件,其中显示着文本 "site comming soon"。

我的 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;
    }
}

所以你想要的是将程序输出显示为HTML,并在由服务器提供的页面上呈现?你缺少很多东西。 - KamilCuk
请看一下我应该得到的输出。从最后第三行开始。 - Atul Singh jadaun
如果我在上面的帖子中漏掉了什么,请告诉我。 - Atul Singh jadaun
2个回答

3

更新

看一下这篇博客文章。它非常详细地解释了如何设置C++/FCGI/nginx。


原始答案

你的C++代码应该是一个监听器(运行时,它应该侦听端口并在收到请求时返回响应)。 这部分与nginx无关。因此,首先确保您的代码正常工作;运行代码并尝试访问指定的端口,看看是否收到预期的响应。

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

在nginx中,这很容易:

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

但首先要测试您的C++代码单独运行,确保它可以正常工作。

另外,最好使用像runitsystemd或类似的工具来使您的C++监听器保持运行状态(如果它崩溃了则重新启动)。


1
我想你可能误解了原帖,他并不是试图用C++构建服务器,他只是试图用C++构建CGI模块。 - Jose Fernando Lopez Fernandez
你是正确的 #Jose Fernando Lopez Fernandez,我正在尝试构建一个快速CGI脚本,在访问任何特定页面URL时在HTML页面上打印“hello world”。 - Atul Singh jadaun
1
感谢@Amir的时间、帮助和努力。我已经阅读了那篇文章的链接,但它并没有帮到我。 - Atul Singh jadaun
问题出在我写的脚本上。谢谢。 - Atul Singh jadaun
博客文章已不存在。 - undefined

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并且位于当前目录中,因此我从示例中省略了脚本文件夹,但请记住,此示例非常牵强,实际上只适用于启动最小的CGI系统。


感谢您的帮助和时间。现在,我正在尝试您的建议。我会在这里更新评论。 - Atul Singh jadaun
如果我将我的index.cgi脚本放在/var/www/helloworld目录中,那么$fast_script_name应该是什么? - Atul Singh jadaun
那实际上只是一个变量声明;那行代码在告诉服务器如何传递SCRIPT_FILENAME参数。你应该将它保持不变。 - Jose Fernando Lopez Fernandez
我已经执行了你提到的关于位置指令和创建index.cgi命令的主要步骤,并且还从/etc/www/helloworld目录中删除了index.html并将index.cgi放置在那里,但仍然没有得到任何响应。 - Atul Singh jadaun
你觉得我漏掉了什么吗? - Atul Singh jadaun
你能发一下你的整个配置文件吗?我来看看。 - Jose Fernando Lopez Fernandez

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接