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

How to run c++ CGI script on NGINX server

我在 /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服务器上。我在 Whosebug 上搜索并尝试了不同的方法 运行 这个脚本,但仍然遗漏了一些东西。

我还运行下面的命令将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;
    }
}

更新

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


原始答案

您的 C++ 代码应该是一个侦听器(当它是 运行 时,它应该侦听一个端口并 return 响应传入的请求)。 这部分与 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++ 侦听器 运行(如果它崩溃,请重新启动它)。

除非您通过表单调用您的 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 系统运行。